dotfiles
My PC Dotfiles & Websitegit clone https://github.com/maydayv7/dotfiles
modules/apps/git/git.nix (5658B)
1## 'git' Configuration ##
2{config, ...}: let
3 inherit (config.flake) files;
4in {
5 flake.modules = {
6 nixos.git = {
7 config,
8 lib,
9 pkgs,
10 ...
11 }: {
12 options.apps.git.package = lib.mkOption {
13 description = "System 'git' package";
14 type = lib.types.package;
15 default = pkgs.gitFull;
16 };
17
18 config = {
19 # Utilities
20 environment.systemPackages = with pkgs; [
21 config.apps.git.package
22 git-crypt
23 git-lfs
24 gh
25 tig
26 treefmt
27 ];
28 };
29 };
30
31 homeManager.git = {
32 config,
33 lib,
34 ...
35 }: let
36 cfg = config.credentials;
37 in {
38 assertions = [
39 {
40 assertion = cfg.mail != "";
41 message = "User Mail ID must be set";
42 }
43 ];
44
45 home = {
46 persist.directories = [
47 ".git-hooks"
48 ".config/gh"
49 ];
50
51 # Hooks
52 file = lib.mapAttrs' (
53 name: _:
54 lib.nameValuePair ".git-hooks/${name}" {
55 text = builtins.readFile "${files.git.hooks}/${name}";
56 executable = true;
57 }
58 ) (builtins.readDir files.git.hooks);
59 };
60
61 # GitHub CLI
62 programs = {
63 gh = {
64 enable = true;
65 gitCredentialHelper.enable = true;
66 settings = {
67 prompt = "enabled";
68 git_protocol = "https";
69 aliases = rec {
70 a = "alias list";
71 b = "browse";
72 cfg = "config";
73 ci = "run";
74 co = "${p} checkout";
75 g = "gpg-key";
76 i = "issue";
77 ic = "${i} close";
78 is = "${i} status";
79 iv = "${i} view";
80 p = "pr";
81 pm = "${p} merge";
82 pv = "${p} view";
83 r = "repo";
84 rd = "${rl} download";
85 rl = "release";
86 rv = "${rl} view";
87 s = "secret";
88 w = "workflow";
89 };
90 };
91 };
92
93 # Pager
94 delta = {
95 enable = true;
96 enableGitIntegration = true;
97 options = {
98 line-numbers = true;
99 theme = lib.mkDefault "Monokai Extended";
100 conflictstyle = "diff3";
101 };
102 };
103
104 ## 'git' Settings
105 git = {
106 enable = true;
107 lfs.enable = true;
108
109 signing = {
110 format = "openpgp";
111 signByDefault = lib.mkIf (cfg.key != "") true;
112 key = lib.mkIf (cfg.key != "") (builtins.substring 24 30 cfg.key);
113 };
114
115 # Globally Ignored Files
116 ignores = [
117 "*~*"
118 "*.bak"
119 ".direnv"
120 "result"
121 "result-*"
122 ];
123
124 settings = {
125 color.ui = "auto";
126 core.hooksPath = "~/.git-hooks";
127 credential.helper = lib.mkDefault ["libsecret"];
128 diff.colorMoved = "default";
129 init.defaultBranch = "main";
130 pull.rebase = "true";
131 safe.directory = files.path.system;
132
133 # User Identity
134 user.name = cfg.name;
135 user.email = cfg.mail;
136 github.user = cfg.name;
137
138 # Command Aliases
139 alias = rec {
140 a = "add";
141 ad = "${a} -A .";
142 ai = "${a} -i";
143 ap = "${a} -p";
144 b = "branch";
145 bc = "${b} --show-current";
146 bd = "${b} -D";
147 backup = "!CURRENT=$(git ${bc}) && git ${st} && git ${co} -B backup && git ${st} apply && git ${ad} && git ${cam} \"backup\" && git ${pf} $1 && git ${co} $CURRENT && git ${stp} && git ${bd} backup && :";
148 cfg = "config";
149 ci = "commit -v";
150 cam = "${ci} -am";
151 cia = "${ci} -a";
152 cmx = "log -1 --format=%B";
153 co = "checkout";
154 cp = "cherry-pick";
155 cpp = "!CURRENT=$(git ${bc}) && git ${st} && git ${co} -B $2 $3 && git ${cp} $1 && git ${pf} $4 && git ${co} $CURRENT && git ${stp} && :";
156 d = "diff";
157 df = "${d} HEAD";
158 dx = "${d} --color-words";
159 dc = "${d} --cached";
160 dcx = "${dc} --color-words";
161 l = "log --graph --decorate --abbrev-commit";
162 l1 = "${l} --pretty=oneline --all";
163 lf = "log -p --follow";
164 lg = "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit --date=relative --branches";
165 ll = "${l} -p";
166 m = "merge";
167 ms = "${m} --squash";
168 p = "push";
169 pf = "${p} --force";
170 pl = "!git pull && git fetch -p";
171 pt = "${p} --tag";
172 pu = "${p} --set-upstream";
173 rb = "rebase";
174 record = ''!f() { (git ${a} -p -- "$@" && git ${ci}) || git ${r}; }; f'';
175 ro = "restore";
176 r = "reset";
177 rs = "${r} --soft";
178 rh = "${r} --hard";
179 rsh = "${rs} HEAD^";
180 s = "!git --no-pager status";
181 sm = "submodule";
182 st = "stash";
183 std = "${st} drop";
184 sti = "${st} --keep-index";
185 stp = "${st} pop";
186 sync = "${pf} --mirror";
187 t = "tag";
188 td = "!git ${t} -d $1 && git ${p} origin :$1 && :";
189 tl = "${t} -l";
190 };
191 };
192 };
193 };
194 };
195 };
196}