A set of git tools to help manage branches better. Some of the tools use git-config hooks for local customization, have a look at the tools directly.
Sometimes branches are not actively developed anymore but need to be preserved for posterity. These branches are clogging up the branch view.
git archive-branch mybranch
archive/2013/mybranch and tags the current top commit
with a message containing bits of the branch history.
Showing recent branches
Working on many branches can mean you forget which branch you worked on last week, or the week before.
lists the various branches checked out over the history, including the date and last commit date on that branch.
next 4 hours ago last commit 6 days ago server-1.13-branch 4 hours ago last commit 2 weeks ago touch-grab-race-condition-56578-v2 3 days ago last commit 3 days ago touch-grab-race-condition-56578 4 days ago last commit 6 days ago † bug/xts-segfaults 6 days ago last commit 6 days ago † master 6 days ago last commit 3 weeks ago for-keith 10 days ago last commit 2 weeks ago memleak 13 days ago last commit 2 weeks ago
git-recent-branches requires GitPython: http://pythonhosted.org/GitPython/
Better branch descriptions
Can't remember what branch "fix-race-condition" was? Me neither. That's what
git branch-description [branchname] [upstream]
will tell you. If upstream is given, it'll also show you what has been merged into upstream already (by patch, not by commit).
And install the
git-post-checkout-nagging-hook as your
.git/hooks/post-checkout to make sure you get reminded to set the branch
Creating patch sets
A wrapper around git-format-patch, that drops the patches into a directory named after the patch set and date.
$> git patch-set origin/master..HEAD~2 $> ls patches patches/patches-2013-08-30-10:47-origin\master..HEAD~2/ patches/latest -> patches/patches-2013-08-30-10:47-origin\master..HEAD~2/
patches/latest always links to the last generated patcheset.
Note: git-patch-set will run the pre-push hook (if any). Ideally, you'll have a pre-push hook that runs make check, so you never send out patches that haven't at least be built and tested.
$> cat .git/hooks/pre-push cat ~/code/libevdev/.git/hooks/pre-push #!/bin/bash set -e echo "running make check" make check
During rebase, when you realise that a commit needs to be broken up into two.
$> git rebase -i # mark commit to split as "edit" $> git split-commit
The tool now calls git add -p, letting you add the hunks needed (and/or missing files). Finish up, it will re-commit with the same message and drop you back to the shell to finish up and continue. Alternatively,
$> git split-commit --after
will drop you into a shell immediately, letting you git add and commit anything you want committed before the current commit. Exiting the shell will commit the rest.
git config's rebase.autosquash enables automatic re-ordering and squashing of commits starting with "squash!" or "fixup!", followed by a subject line that matches an earlier commit.
git-squash is a wrapper script around that to make it easier to remember.
$> git add myfile yourfile $> git squash  this is the most recent commit  previos commit  some other commit  a commit message Number to squash in: 3
Arguments passed to git-squash will be passed to git-commit.
Adding tags to commit messages
Some projects request Reviewed-by, Signed-off-by or bugzilla references to be adeed to a commit message. git-add-tag is a script to add these to a set of commit messages.
$> git add-tag HEAD~6..
This will open up an editor window. Write the line you need to add to the commit range and exit. The line will be appended to all commits in the range.
Testing commits in sequence
After merging a set of patches, sometimes it's necessary to make sure that each patch fulfills certain conditions (e.g. pass a test suite).
$> git for-each origin/master.. make check
Runs make check on each commit from origin/master to HEAD and prints a log.