This is my collection of configuration files and utilities for git.
Contents include:
git-mixdown
- mix down multiple branches into a single working branch. Useful for testing a combination of bugfixes / features at once via a throw-away temporary working branch.git-mix
- syntactic sugar for configuringgit mixdown
ggrbm
- "Git Rebase Multiple", for automated rebasing of multiple branches as a single workflow.
See also git-explode
for
automatically separating a single git branch into a number of smaller
branches which are textually independent.
git-upstream
- obtain the upstream tracking branch (N.B. depends ongit-head
,git-root
, andgit-prefix
)git-set-upstream
- set the upstream tracking branch (N.B. depends ongit-head
andgit-root
)git-merged
- show which branches are merged into upstream or the given commit-ish (N.B. depends ongit-root
andgit-upstream
)git-compare
- compare two references to find out how far one is ahead/behind of the othergit-compare-upstream
- set the upstream tracking branch (N.B. depends ongit-compare
,git-head
, andgit-upstream
, and hence also ongit-root
and andgit-prefix
)git-wip
- returns true if the current repo has any work in progress, i.e. commits out of sync with upstream, or unmodified/untracked filesgit-rm-merged-orphan-branches
- remove local branches which have been merged and are not in any other remote. Use with care!!git-icing
- a tasty wrapper aroundgit cherry
which adds a splash of colour, and blacklisting of commits which should never be upstreamed.git-cherry-menu
- an interactive wrapper aroundgit icing
andgit notes
which makes it easy to cherry-pick and/or blacklist non-upstreamed commits.git-rnotes
- a wrapper aroundgit notes
which makes it easier to share notes to and from remote repositoriesgit-deps
- MOVED TO DEDICATED REPO automatically detect dependencies between commitsgit-tag-patchset
- quick way of tagging patch sets as they get uploaded to Gerrit, to keep track of a review's history, e.g.git review && git tag-patchset
.
git-rewrite-author
- rewrite the author for a range of commitsgit-rewrite-committer
- rewrite the committer for a range of commitsgit-sed-range
- run a sed script over every log message in a range of commitsgit-add-prefix
- add a prefix string to every log message in a range of commits
git-url-rewrite
- convenient interface for setting git URL rewrites viaurl.$url.insteadOf
git-annex-clean-sync
- a wrapper aroundgit annex sync
which avoids trying to touch ignored or unavailable remotes.
-
git-auto-commit
- automatically commits files according to theautocommit
git attribute. For example, if.gitattributes
contains:*.org autocommit=min-age=+5m
then any file ending in
.org
which is newly added (i.e. not in the index yet) or has unstaged changes, and whose last commit time and last mtime are both over 5 minutes, will be automatically staged and included in an automatic commit for this invocation of the commit. Files which have staged changes are assumed to be part of an unfinished manual commit process, and are therefore skipped. -
auto-commit-daemon
- a wrapper aroundgit-auto-commit
to run it perodically. This can be configured as a per-user systemd service, e.g. by placing the following in~/.config/systemd/user/auto-commit-my-repo.service
:[Service] ExecStart=/bin/sh -c "/path/to/auto-commit-daemon /home/me/my/repo" Restart=always NoNewPrivileges=true SyslogIdentifier=auto-commit-my-repo Environment=SLEEP=1m [Install] WantedBy=default.target
-
auto-sync-daemon
- a wrapper aroundgit-annex-clean-sync
which runs it whenevermaster
orsynced/master
orsynced/git-annex
are updated. When run across a network of remotes, it will keep themaster
branch in sync across all of them. Works well in combination with settingreceive.denyCurrentBranch
toupdateInstead
, and usinggit-safe-push-to-checkout
(see below) as thepush-to-checkout
hook. -
git-safe-push-to-checkout
- a smarterpush-to-checkout
hook for whenreceive.denyCurrentBranch
is set toupdateInstead
. It's near-identical to git's default behaviour when nopush-to-checkout
hook is provided; however it additionally bails if we have emacs lockfiles indicating edits in progress for files which would be changed by the push-to-checkout. This means that push-to-checkout works more safely and doesn't rewrite files which are currently being edited in emacs with unsaved changes. It can be installed via:ln -s `which git-safe-push-to-checkout` $my_repo/.git/hooks/push-to-checkout
-
git-ls-dir
- list files in a git repo tree together with the commits which most recently touched them (see a screenshot) -
git-find-blob
- find which commits contain a given (non-abbreviated) blob
git-find-missing-submodule-commits
- find dangling references to submodule commits
Little shell wrappers to make the git porcelain and higher-level scripts a little more beautiful.
git-head
- obtain the current branchgit-root
- obtain the absolute path to the root (top-level) directory of the repository we're currently ingit-prefix
- obtain the current directory path relative to the root (top-level) directory of the repositorygit-cdup
- obtain the relative path from the current directory to the root (top-level) directory of the repositorygfind
- like find(1), but only lists files tracked by git
gg*
- a whole bunch of wrappers around standard git commands to reduce the number of keystrokes required and add a little bit of polish to the interface here and there.
Feel free to browse the bin/
directory :-)
This repository is designed to be stowed directly into your home directory:
git clone git://github.com/aspiers/git-config.git
stow -d . -t ~ git-config
However if you only want to cherry-pick bits and pieces then you can easily just copy or symlink them in manually. Just be aware that some of the files depend on other files, some of which are in this repository, some of which are in other repositories such as https://github.com/aspiers/shell-env.
The software in this repository is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.