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}