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