Nix configurations for my personal machines (Linux & macOS)
1{ 2 delib, 3 pkgs, 4 ... 5}: 6delib.module { 7 name = "programs.git"; 8 9 home.always = {myconfig, ...}: let 10 inherit (myconfig.constants) userfullname useremail; 11 in { 12 xdg.configFile."git/allowed_signers".source = ../../files/git/allowed_signers; 13 14 home.packages = [pkgs.jjui]; 15 16 programs.git = { 17 enable = true; 18 userName = userfullname; 19 userEmail = useremail; 20 delta.enable = true; 21 22 signing = { 23 signByDefault = true; 24 format = "ssh"; 25 key = "~/.ssh/id_ed25519_sk_rk"; 26 }; 27 28 extraConfig = { 29 # TODO: custom pretty stuff? 30 blame.showEmail = true; 31 init.defaultBranch = "main"; 32 pull.rebase = true; 33 34 log = { 35 abbrevCommit = true; 36 # TODO: `git log --oneline` looks silly with this. Need custom format. 37 showSignature = true; 38 # TODO: trial for a while and see if I like this. 39 date = "human"; 40 }; 41 42 merge = { 43 # Try to avoid merge commits 44 ff = "only"; 45 # Really only useful on a well-managed team. Maybe eventually. 46 # verifySignatures = true; 47 conflictStyle = "diff3"; 48 }; 49 50 push = { 51 autoSetupRemote = true; 52 followTags = true; 53 }; 54 55 # Require explicit `drop` in interactive rebase 56 rebase.missingCommitsCheck = "error"; 57 rerere.enabled = true; 58 59 status = { 60 relativePaths = false; 61 showStash = true; 62 }; 63 64 gpg.ssh.allowedSignersFile = "~/.config/git/allowed_signers"; 65 # "gpg.ssh.program = "gfh-keygen"; 66 # "gpg.ssh.defaultKeyCommand = "gfh"; 67 }; 68 }; 69 70 programs.gh = { 71 enable = true; 72 settings = { 73 git_protocol = "ssh"; 74 aliases = { 75 clone = "repo clone"; 76 }; 77 }; 78 }; 79 80 programs.jujutsu = { 81 enable = true; 82 settings = { 83 user = { 84 name = userfullname; 85 email = useremail; 86 }; 87 88 ui = { 89 default-command = "log"; 90 show-cryptographic-signatures = true; 91 conflict-marker-style = "git"; 92 diff-formatter = "delta"; 93 editor = "codium -w"; 94 merge-editor = "vscodium"; 95 }; 96 97 revset-aliases = { 98 "closest_bookmark(to)" = "heads(::to & bookmarks())"; 99 "p(n)" = "p(@, n)"; 100 "p(r, n)" = "roots(r | ancestors(r-, n))"; 101 }; 102 103 aliases = { 104 e = ["edit"]; 105 n = ["new"]; 106 tug = ["bookmark" "move" "--from" "closest_bookmark(@-)" "--to" "@-"]; 107 tug-here = ["bookmark" "move" "--from" "closest_bookmark(@)" "--to" "@"]; 108 }; 109 110 merge-tools.mergiraf = { 111 program = "mergiraf"; 112 merge-args = ["merge" "$base" "$left" "$right" "-o" "$output"]; 113 merge-conflict-exit-codes = [1]; 114 conflict-marker-style = "git"; 115 }; 116 117 git = { 118 sign-on-push = true; 119 push-new-bookmarks = true; 120 write-change-id-header = true; 121 }; 122 123 signing = { 124 behavior = "drop"; 125 backend = "ssh"; 126 key = "~/.ssh/id_ed25519_sk_rk.pub"; 127 backends.ssh.allowed-signers = "~/.config/git/allowed_signers"; 128 }; 129 }; 130 }; 131 132 programs.mergiraf.enable = true; 133 }; 134}