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 };
94
95 revset-aliases = {
96 "closest_bookmark(to)" = "heads(::to & bookmarks())";
97 "p(n)" = "p(@, n)";
98 "p(r, n)" = "roots(r | ancestors(r-, n))";
99 };
100
101 aliases = {
102 tug = ["bookmark" "move" "--from" "closest_bookmark(@-)" "--to" "@-"];
103 e = ["edit"];
104 n = ["new"];
105 };
106
107 merge-tools.mergiraf = {
108 program = "mergiraf";
109 merge-args = ["merge" "$base" "$left" "$right" "-o" "$output"];
110 };
111
112 git = {
113 sign-on-push = true;
114 push-new-bookmarks = true;
115 };
116
117 signing = {
118 behavior = "drop";
119 backend = "ssh";
120 key = "~/.ssh/id_ed25519_sk_rk.pub";
121 backends.ssh.allowed-signers = "~/.config/git/allowed_signers";
122 };
123 };
124 };
125
126 programs.mergiraf.enable = true;
127 };
128}