{ config, pgks, lib, ... }: { options = { user.git = { enable = lib.mkEnableOption "enable git"; workProfile = { enable = lib.mkEnableOption "git work profile"; email = lib.mkOption { type = lib.types.str; description = "email for work profile."; }; }; profile = { email = lib.mkOption { type = lib.types.str; description = "email for main profile"; }; name = lib.mkOption { type = lib.types.str; description = "name for main profile"; }; }; }; }; config = lib.mkIf config.user.git.enable { programs.git = { enable = true; aliases = { tree = "log-long-line --graph --topo-order --all --simplify-by-decoration"; hist = "log-long-line --graph --date-order --date=short "; graph = "log-long-line --graph --topo-order --all"; log-long-line = "log --pretty=format:'%C(auto)%h %C(cyan)%an %C(blue)%ar %C(auto)%d %s'"; recent = "branch --sort=-committerdate --format='%(committerdate:relative)%09%(refname:short)'"; track = "add -AN"; }; delta = { enable = true; options = { side-by-side = true; line-numbers = true; }; }; userEmail = config.user.git.profile.email; userName = config.user.git.profile.name; extraConfig = { init.defaultBranch = "main"; push = { autoSetupRemote = true; default = "simple"; followTags = true; }; fetch = { prune = true; pruneTags = true; all = true; }; pull.ff = true; merge.conflictstyle = "zdiff3"; diff = { algorithm = "histogram"; colorMoved = "plain"; mnemonicPrefix = true; renames = true; }; rerere = { enabled = true; autoupdate = true; }; rebase.autosquash = true; help.autocorrect = "prompt"; branch.sort = "-committerdate"; tag.sort = "version:refname"; status.submodulesummary = true; submodule.recurse = true; }; includes = if config.user.git.workProfile.enable then [ { condition = "gitdir:~/work/**"; contents.user.email = config.user.git.workProfile.email; } ] else []; }; programs.lazygit.enable = true; }; }