[alias]
    # list aliases
    aliases = !git config --get-regexp 'alias.*' | colrm 1 6 | sed 's/[ ]/ = /' | sort
    bdm = "!git branch --merged | grep -v '*' | xargs -n 1 git branch -d"
    # Reads origin's cached HEAD, which `git sync` and remote.origin.followRemoteHEAD
    # below keep pointing at whatever the server currently calls its default.
    # --short over cut -d/ -f4, which mangles names like release/1.0.
    default-branch = "!git symbolic-ref --short refs/remotes/origin/HEAD | sed 's|^origin/||'"
    lg = log --graph --pretty=tformat:'%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%an %ar)%Creset'
    lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
    lastchange = log -p --follow -n 1
    plog = log --graph --pretty='format:%C(red)%d%C(reset) %C(yellow)%h%C(reset) %ar %C(green)%aN%C(reset) %s'
    rank = shortlog -sn --no-merges
    st = status -sb
    # `git sync` is not here - it is bin/git-sync, on the $PATH, which git picks
    # up as a subcommand. `git aliases` above will not list it.
    tlog = log --stat --since='1 Day Ago' --graph --pretty=oneline --abbrev-commit --date=relative

[apply]
    # Detect whitespace errors when applying a patch
    whitespace = fix

[filter "lfs"]
    # git-lfs stuff
    clean = git-lfs clean %f
    smudge = git-lfs smudge %f
    required = true

[gpg]
    # Use OpenSSH to sign commits/tags/etc
    format = ssh

[gpg "ssh"]
    allowedSignersFile = ~/.ssh/allowed_signers

[help]
    # Automatically correct typos in commands
    autoCorrect = prompt

[pull]
    ff = only

[remote "origin"]
    # refs/remotes/origin/HEAD is written once at clone time, and the default
    # `create` only fills it in when missing - so a default branch renamed on the
    # server (main -> totara-20) leaves every tool reading that ref pointing at a
    # branch that may not even exist. `always` re-points it on each fetch, off the
    # ref advertisement that fetch already receives, so it costs no extra round
    # trip. Only applies to remotes actually named origin.
    followRemoteHEAD = always

[core]
    pager = delta --side-by-side --width ${FZF_PREVIEW_COLUMNS-$COLUMNS}

[interactive]
    diffFilter = delta --color-only

[include]
    path = ~/.config/delta/themes.gitconfig

[delta]
    # use n and N to move between diff sections
    navigate = true
    side-by-side = true
    hyperlinks = true
    hyperlinks-file-link-format = "idea://open?file={path}&line={line}"
    #features = weeping-willow

[merge]
    conflictstyle = zdiff3

[diff]
    algorithm = histogram
    colorMoved = plain
    mnemonicPrefix = true
    renames = true

[tar "tar.xz"]
    command = xz -c

[tar "tar.zst"]
    command = zstd -T0 -c

[init]
    defaultBranch = main

[column]
    ui = auto

[branch]
    sort = -committerdate

[tag]
    sort = version:refname

[rerere]
    enabled = true
    autoupdate = true

[rebase]
    autoSquash = true
    autoStash = true
    updateRefs = true

# Machine-local identity and signing config. Untracked, and included last so
# it wins over anything above. Keeps `bootstrap.sh`'s copy of this file
# non-destructive without needing to re-apply values on every shell startup.
[include]
    path = ~/.gitconfig.local
