My FreeBSD Development Setup
 I do my FreeBSD development using
 
  git
 
 ,
 
  tmux
 
 ,
 
  vim
 
 and
 
  cscope
 
 .
I keep a FreeBSD fork on my github, I have forked https://github.com/freebsd/freebsd to https://github.com/adventureloop/freebsd
On my fork I have the freebsd/freebsd repo set as an upstream
$ git remote -v
origin  git@github.com:adventureloop/freebsd.git (fetch)
origin  git@github.com:adventureloop/freebsd.git (push)
upstream        https://github.com/freebsd/freebsd.git (fetch)
upstream        https://github.com/freebsd/freebsd.git (push)
See this article for information on setting this up https://help.github.com/en/articles/configuring-a-remote-for-a-fork
I do all work on branches using worktrees, keeping the master branch clean.
Periodically I sync the master branch with the FreeBSD upstream:
$ cd ~/code/freebsd-dev/freebsd-git
$ git checkout master
$ git fetch upstream
$ git merge upstream/master
$ git push
I have a development setup based on Ian Lapore's arm set up documented on the FreeBSD wiki https://wiki.freebsd.org/FreeBSD/arm/crossbuild
 I have a
 
  freebsd-dev
 
 directory in my code directory. It their I keep a copy of
FreeBSD in
 
  freebsd-git
 
 , and
 
  obj
 
 directory for build output and a projects
directory for in progress code.
$ tree -L2
.
├── diffs
│   ├── D15222.diff
│   └── old
├── dstdir
│   ├── boot
│   ├── METALOG
│   └── usr
├── freebsd-git
│   ├── bin
│   ├── sbin
...
│   └── usr.sbin
├── obj
│   └── usr
├── projects
│   ├── atomicstats
│   ├── axp288
│   ├── bugsquash
│   ├── byebyejumbograms
...
 I use
 
  git
 
 worktrees for ongoing projects.
 
  git
 
 worktrees allow you to have a
shallow file system copy on a
 
  git
 
 branch in a directory.
When starting a new project I do something like:
$ cd ~/code/freebsd-dev/freebsd-git
$ git worktree add thj/newdevelopment ../projects/newdevelopment master
$ cd ../projects/newdevelopment
 Once the worktree is set up I launch a
 
  tmux
 
 session in the projects directory.
Each random idea or itch I have, if there is enough there, ends up with a
project worktree and a
 
  tmux
 
 session.
 
  tmux
 
 allows me to have many windows in a session, I have a serious
 
  tmux
 
 problem. Right now I have 11 sessions with 42 windows across them. This is a
good indicator of my focus level.
 I do FreeBSD development with
 
  cscope
 
 and
 
  vim
 
 . With
 
  tmux
 
 splits I normally
have an open file and I use other
 
  cscope
 
 instances in
 
  tmux
 
 windows to search
for things I need in the tree.
 I do testing in a
 
  bhyve
 
 vm and leave the serial port in a
 
  tmux
 
 window
somewhere. I follow the setup in the FreeBSD
 
  handbook
 
 and back each vm
with a zfs dataset.
I do FreeBSD kernel builds using a command like:
env MAKEOBJDIRPREFIX=/home/tom/code/freebsd-dev/obj make -j 44 buildkernel \
        -DKERNFAST installkernel \
    -DNO_ROOT DESTDIR=/home/tom/code/freebsd-dev/dstdir
 I then ship kernels to the test vm with scp. jhb@ has a nicer method using the
 
  bhyve-loader
 
 , but I am yet to try it.
When changes are maturing I create reviews for them using arcanist, manu@ has a good article on doing this