[user] name = Robert Günzler email = r@gnzler.io signingkey = AF6AB8C8B10436B9F61293632143BD2AAB94BCC4 [sendemail] from = Robert Günzler smtpServer = mail.gandi.net smtpServerPort = 465 smtpEncryption = ssl smtpUser = robert@gnzler.io ; smtpServer = /usr/bin/msmtp ; smtpServerOption=-a ; smtpServerOption=gnzler annotate = true multiEdit = true confirm = always [credential "git.sr.ht"] username = robertgzr helper = !sh -c 'pass sr.ht/robertgzr | head -n1 | xargs printf "password=%s\n"' [credential "github.com"] username = robertgzr helper = !sh -c 'pass github.com/robertgzr | head -n1 | xargs printf "password=%s\n"' [credential "smtp://mail.gandi.net:465"] username = robert@gnzler.io helper = !sh -c 'pass email/gnzler.io | head -n1 | xargs printf "password=%s\n"' [core] excludesfile = $HOME/.config/git/ignore # Treat spaces before tabs and all kinds of trailing whitespace as an error # [default] trailing-space: looks for spaces at the end of a line # [default] space-before-tab: looks for spaces before tabs at the beginning of a line whitespace = space-before-tab,-indent-with-non-tab,-trailing-space # Make `git rebase` safer on OS X # More info: trustctime = false # Prevent showing files whose names contain non-ASCII symbols as unversioned. # http://michael-kuehnel.de/git/2014/11/21/git-mac-osx-and-german-umlaute.html precomposeunicode = false filemode = false # enable coditional paging based on the amount of content ; pager = "less -F -X" pager = "diff-highlight | less -FRX --tabs=4" autocrlf = false longpaths = true [init] defaultBranchName = master # templateDir = ~/.dotfiles/git/templates [interactive] diffFilter="diff-highlight | less -FRX --tabs=4" [format] signoff = true [commit] template = ~/.config/git/message gpgsign = true signoff = true verbose = true [alias] stp = status --porcelain --branch sti = status --porcelain --branch --ignored st = status -sb stl = ls-files -m -o --exclude-standard ci = commit br = branch co = checkout cp = cherry-pick cr = clone --recursive d = diff df = diff --word-diff ds = diff --staged dss = diff --staged --stat dl = diff --stat diffsummary = "!f() { local a=${1:-HEAD}; local b=${2:-master}; if [[ $a == '-' ]]; then a=HEAD; fi; printf ' %s is %s commits ahead and %s commits behind %s\n' `git rev-parse --short=7 $a` `git rev-list --count $b..$a` `git rev-list --count $a..$b` $b; printf ' last common commit (merge-base): %s\n' `git merge-base $a $b`; git diff --shortstat $a..$b; }; f" unstage = reset --hard HEAD lp = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit ll = log --pretty=oneline --graph --abbrev-commit lm = log --pretty=format:'* %s (%h)' lg = log -p g = grep --break --heading --line-number amend = commit --amend --reuse-message=HEAD --edit show-ignored = "! git clean -ndX | perl -pe 's/Would remove/Ignored:/'" # usage: change-date [rev] [date] [...additional filter-branch flags] # rewrites the commit/author date of to be # if is empty HEAD is used # if is empty the current time is used change-date = "!f() { now=\"$(date +'%a %b %d %H:%M:%S %Y %z')\"; head=\"$(git rev-parse HEAD)\"; git filter-branch $3 --env-filter 'if [[ $GIT_COMMIT = ${1-$head} ]]; then export GIT_AUTHOR_DATE=${2:-$now}; export GIT_COMMITTER_DATE=${2:-$now}; fi'; }; f" # usage: ld # prints out the `git log` for the n last days log-since = "!sh -c \"git log --since '${1:-1} days ago' --oneline --author $(git config user.email)\" -" # usage: pr [] # creates local branch pr/ from origin or and checks it out pr = "!f() { git fetch -fu ${2:-origin} refs/pull/${1:?missing pr num}/head:pr/$1 && git checkout pr/$1; }; f" total-lines = "! git ls-tree -r master --name-only | xargs -I {} git blame --line-porcelain {} | sed -n 's/^author //p' | sort | uniq -c | sort -rn" fixup = "!f() { git commit --fixup=${1}; }; f" fix = "!f() { git fixup ${1} && git ri ${1}^; }; f" squash = "!f() { git commit --squash=${1}; }; f" r = rebase ri = rebase --autostash --autosquash -i ri-pr = !bash -c 'git rebase --autosquash -i `git merge-base HEAD ${1:-origin/master}`' pushf = push --force-with-lease root = "rev-parse --show-toplevel" trailer = "!f() { trailer=${1:-}; ref=${2:-HEAD}; mode='--amend'; [ $ref != 'HEAD' ] && mode='--fixup=$ref'; msg=$(git rev-parse --show-toplevel)/LAST_COMMIT_MSG; git log -1 --format=%B $ref > $msg; git interpret-trailers --in-place --trailer $trailer $msg; git commit --allow-empty --no-verify --only --edit --file $msg $mode; rm $msg; }; f" a = add --patch ; oldest-ancestor = !bash -c 'diff -u <(git rev-list --first-parent ${1:-master}) <(git rev-list --first-parent ${2:-HEAD}) | sed -ne \"s/^ //p\" | head -1' ; oldest-ancestor = !bash -c 'git merge-base ${1:-master} ${2:-HEAD}' rebaseonto = "!f() { git rebase --autostash --onto=${1:-origin/master} $(git merge-base ${1:-origin/master} ${2:-HEAD}); }; f" find-by-subject = "!f() { set -ex; s=`git log -1 --format=%s ${1}`; git --no-pager log -1 --grep=\"^${s}$\" --no-merges ${2}; }; f" tig = !tig amend = commit --amend fixnow = "!f() { git commit --fixup=${1} && git ri ${1}^; }; f" b = !fzfez git-branches l = !fzfez git-log t = !fzfez git-tags pushall = "!f() { args=$@; git remote show -n | xargs -I{} sh -c \"set -x;git push {} $args\"; }; f" pushfall = "!f() { args=$@; git remote show -n | xargs -I{} sh -c \"set -x;git pushf {} $args\"; }; f" ; git-hack shortcuts hack = hack hack sync = hack sync owners = "!f() { ref=\"$(git branch --format='%(upstream:short)'|head -n1)\"; git diff --name-only $ref | xargs -I{} git shortlog -nse $ref {} | sort -k2 | uniq -f2 | sed 's/^[ ]*//' | sort -gr | cut -f2; }; f" reviewers = "!f() { ref=\"$(git branch --format='%(upstream:short)'|head -n1)\"; git diff --name-only $ref | xargs -I{} git shortlog -nse --group=trailer:reviewed-by $ref {} | sort -k2 | uniq -f2 | sed 's/^[ ]*//' | sort -gr | cut -f2; }; f" [apply] # Detect whitespace errors when applying a patch whitespace = fix [color "branch"] current = yellow reverse local = yellow remote = green [color "diff"] meta = yellow bold frag = magenta bold # line info old = red # deletions new = green # additions [color "status"] added = yellow changed = green untracked = cyan [diff] # Detect copies as well as renames renames = copies renameLimit = 3210 [diff "bin"] # Use `hexdump` to diff binary files textconv = hexdump -v -C renames = copies tool = vimdiff [difftool] prompt = false [fetch] prune = true [pull] rebase = true [grep] lineNumber = true [help] # Automatically correct and execute mistyped commands autocorrect = 10 [merge] # Include summaries of merged commits in newly created merge commit messages log = true defaultToUpstream = true tool = vimdiff [mergetool "vimdiff"] path = /usr/bin/nvim conflictstyle = diff3 prompt = false [rebase] ; instructionFormat = "%aI %an <%ae> | %s" [rerere] enabled = false [push] # Use the Git 1.x.x default to avoid errors on machines with old Git # installations. To use `simple` instead, add this to your `~/.extra` file: # `git config --global push.default simple`. See http://git.io/mMah-w. default = simple # Make `git push` push relevant annotated tags when pushing branches out. followTags = true [tag] gpgsign = true # URL shorthands ; [url "git@github.com:"] ; insteadOf = "https://github.com/" ; pushInsteadOf = "git://github.com/" ; [url "git@bitbucket.org:"] ; insteadOf = "https://bitbucket.org/" ; pushInsteadOf = "git://bitbucket.org/" ; [url "git@gitlab.com:"] ; insteadOf = "https://gitlab.com/" ; pushInsteadOf = "git://gitlab.com/" ; [url "git@git.sr.ht:"] ; insteadOf = "https://git.sr.ht/" ; pushInsteadOf = "git://git.sr.ht/" [url "git@gist.github.com:"] insteadOf = "gist:" pushInsteadOf = "git://gist.github.com/" [http] sslverify = true cookiefile = /home/robert/.gitcookies [trailer "signoff"] key = "Signed-off-by" ifmissing = add ; command = bash -c 'echo \"$(git config user.name) <${$(git config user.signemail):-$(git config user.email)}>\"' command = echo \"`git config user.name` <`git config user.signemail || git config user.email`>\" where = end [trailer "changetype"] key = "Change-type" ifmissing = add ifexists = doNothing where = start [trailer "connects"] key = "Connects-to" ifmissing = add where = start [trailer "depends"] key = "Depends-on" ifmissing = add where = start [trailer "changelog"] key = "Changelog-entry" ifmissing = add where = start ; TIG config [tig] main-view = id date author commit-title:graph=yes,refs=yes blame-view = date:default author id:yes,color line-number:yes,interval=1 text pager-view = line-number:yes,interval=1 text stage-view = line-number:yes,interval=1 text log-view = line-number:yes,interval=1 text blob-view = line-number:yes,interval=1 text diff-view = line-number:yes,interval=1 text:yes,commit-title-overflow=no line-graphics = utf-8 tab-size = 4 ignore-space = at-eol ignore-case = true split-view-height = 80% diff-options = -m --first-parent mouse = true editor-line-number = yes refresh-mode = auto diff-highlight = true [tig "color"] diff-header = default magenta diff-chunk = black white [tig "bind"] generic = I !@wl-copy -n "%(commit)" generic = G move-last-line generic = V view-pager ; generic = find-next ; generic = find-prev ; generic = scroll-right ; generic = scroll-left ; generic = refresh generic = ~ :goto %(commit)^ main = g none main = gg move-first-line main = G move-last-line main = g :toggle commit-title-graph diff = g none diff = gg move-first-line diff = G move-last-line diff = n :/^@@ diff = p :?^@@ stage = n :/^@@ stage = p :?^@@ pager = n :/^@@ pager = p :?^@@ log = n :/^commit log = p :?^commit