{ config, lib, pkgs, ... }: let inherit (config) userinfo; in { home.packages = with pkgs; [ gitAndTools.pre-commit git-credential-manager ]; programs.git = { enable = true; delta = { enable = true; options.features = "decorations side-by-side line-numbers"; }; userName = lib.mkDefault userinfo.fullName; userEmail = lib.mkDefault userinfo.email; aliases = { amend = "commit --amend"; a = "commit --amend --no-edit"; st = "status"; co = "checkout"; br = "branch"; rb = "pull --rebase"; hist = "log --pretty=format:\"%Cgreen%h %Creset%cd %Cblue[%cn] %Creset%s%C(yellow)%d%C(reset)\" --graph --date=relative --decorate --all"; llog = "log --graph --name-status --pretty=format:\"%C(red)%h %C(reset)(%cd) %C(green)%an %Creset%s %C(yellow)%d%Creset\" --date=relative"; logo = "log --pretty=format:\"%C(yellow)%h%Cred%d %Creset%s%Cblue (%cn)\" --decorate"; logf = "log --pretty=format:\"%C(yellow)%h%Cred%d %Creset%s%Cblue (%cn)\" --decorate --numstat"; }; ignores = [ ".DS_Store" ".aider.*" ".direnv" ]; extraConfig = { core.whitespace = "trailing-space,space-before-tab"; color.ui = true; # nicer output column.ui = "auto"; # https://adamj.eu/tech/2024/01/18/git-improve-diff-histogram/ diff.algorithm = "histogram"; init.defaultBranch = "main"; # https://blog.gitbutler.com/how-git-core-devs-configure-git/ push = { # abort if the remote branch does not match the local one default = "simple"; autoSetupRemote = true; followTags = true; }; fetch = { prune = true; pruneTags = true; all = true; }; pull.rebase = true; rebase = { autosquash = true; updateRefs = true; # Automatically create a temporary stash entry before the # operation begins, and apply it after the operation ends. autoStash = true; # Print a warning if some commits are removed missingCommitsCheck = "warn"; }; branch = { autosetuprebase = "remote"; sort = "authordate"; }; }; }; }