mirror of
				https://github.com/ItsDrike/nixdots
				synced 2025-11-04 03:46:36 +00:00 
			
		
		
		
	Add git configuration
This commit is contained in:
		
							parent
							
								
									a9cdf25a57
								
							
						
					
					
						commit
						329f48882e
					
				
					 9 changed files with 223 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
_: {
 | 
			
		||||
  imports = [
 | 
			
		||||
    ./shell
 | 
			
		||||
    ./tools
 | 
			
		||||
  ];
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										5
									
								
								home/programs/terminal/tools/default.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								home/programs/terminal/tools/default.nix
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
_: {
 | 
			
		||||
  imports = [
 | 
			
		||||
    ./git
 | 
			
		||||
  ];
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										81
									
								
								home/programs/terminal/tools/git/aliases.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								home/programs/terminal/tools/git/aliases.nix
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,81 @@
 | 
			
		|||
{
 | 
			
		||||
  programs.git = {
 | 
			
		||||
    aliases = {
 | 
			
		||||
      quickclone = "clone --single-branch --depth=1";
 | 
			
		||||
      bareclone = "!sh -c 'git clone --bare \"$0\" \"$1\"/.bare; echo \"gitdir: ./.bare\" > \"$1/.git\"'";
 | 
			
		||||
      bareinit = "!sh -c 'git init --bare \"$0\"/.bare; echo \"gitdir: ./.bare\" > \"$0/.git\"'";
 | 
			
		||||
      cleanup = "!default_branch=$(git remote show origin | awk '/HEAD branch/ {print $NF}'); git remote prune origin && git checkout -q $default_branch && git for-each-ref refs/heads/ '--format=%(refname:short)' | while read branch; do mergeBase=$(git merge-base $default_branch $branch) && [[ $(git cherry $default_branch $(git commit-tree $(git rev-parse $branch^{tree}) -p $mergeBase -m _)) == '-'* ]] && git branch -D $branch; done";
 | 
			
		||||
 | 
			
		||||
      m = "merge";
 | 
			
		||||
      f = "fetch";
 | 
			
		||||
 | 
			
		||||
      p = "push";
 | 
			
		||||
      pu = "!git push --set-upstream origin `git symbolic-ref --short HEAD`";
 | 
			
		||||
      pf = "push --force";
 | 
			
		||||
      pl = "pull";
 | 
			
		||||
 | 
			
		||||
      s = "status --short --branch";
 | 
			
		||||
      ss = "status";
 | 
			
		||||
 | 
			
		||||
      ch = "checkout";
 | 
			
		||||
      chb = "checkout -b";
 | 
			
		||||
 | 
			
		||||
      undo = "reset --soft HEAD~";
 | 
			
		||||
      redo = "reset HEAD@{1}";
 | 
			
		||||
      unstage = "restore --staged";
 | 
			
		||||
 | 
			
		||||
      c = "commit";
 | 
			
		||||
      ca = "commit --ammend";
 | 
			
		||||
      ci = "commit --interactive";
 | 
			
		||||
      cm = "commit --message";
 | 
			
		||||
      cv = "commit --verbose";
 | 
			
		||||
 | 
			
		||||
      a = "add";
 | 
			
		||||
      aa = "add --all";
 | 
			
		||||
      ap = "add --patch";
 | 
			
		||||
      au = "add --update";
 | 
			
		||||
 | 
			
		||||
      d = "diff";
 | 
			
		||||
      dc = "diff --cached";
 | 
			
		||||
      ds = "diff --staged";
 | 
			
		||||
      dw = "diff --word-diff";
 | 
			
		||||
      dcm = "!sh -c 'git diff $0~ $0'";
 | 
			
		||||
      linediff = "!sh -c 'git diff --unified=0 $1 $2 | grep -Po \"(?<=^\\+)(?!\\+\\+).*\" '";
 | 
			
		||||
 | 
			
		||||
      b = "branch";
 | 
			
		||||
      ba = "branch --all";
 | 
			
		||||
      bd = "branch --delete";
 | 
			
		||||
      bD = "branch --delete --force";
 | 
			
		||||
      bm = "branch --move";
 | 
			
		||||
      bM = "branch --move --force";
 | 
			
		||||
      bb = "!~/.local/bin/scripts/cli/better-git-branch";
 | 
			
		||||
 | 
			
		||||
      r = "rebase";
 | 
			
		||||
      ri = "rebase -i";
 | 
			
		||||
      rc = "rebase --continue";
 | 
			
		||||
 | 
			
		||||
      l = "log --oneline --decorate --all --graph";
 | 
			
		||||
      lp = "log --patch";
 | 
			
		||||
      lo = "log --pretty=oneline --abbrev-commit --graph";
 | 
			
		||||
      lg = "log --all --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --";
 | 
			
		||||
      loog = "log --format=fuller --show-signature --all --color --decorate --graph";
 | 
			
		||||
 | 
			
		||||
      make-patch = "diff --no-prefix --relative";
 | 
			
		||||
 | 
			
		||||
      set-upstream = "!git branch --set-upstream-to=origin/`git symbolic-ref --short HEAD`";
 | 
			
		||||
 | 
			
		||||
      staash = "stash --all";
 | 
			
		||||
      stash-staged = "!sh -c 'git stash --keep-index; git stash push -m \"staged\" --keep-index; git stash pop stash@{1}'";
 | 
			
		||||
 | 
			
		||||
      find-merge = "!sh -c 'commit=$0 && branch=\${1:-HEAD} && (git rev-list $commit..$branch --ancestry-path | cat -n; git rev-list $commit..$branch --first-parent | cat -n) | sort -k2 -s | uniq -f1 -d | sort -n | tail -1 | cut -f2'";
 | 
			
		||||
      show-merge = "!sh -c 'merge=$(git find-merge $0 $1) && [ -n \"$merge\" ] && git show $merge'";
 | 
			
		||||
 | 
			
		||||
      tracked-files = "ls-tree --full-tree --name-only -r HEAD";
 | 
			
		||||
      tracked-text-files = "!git tracked-files | while IFS= read -r file; do mime_type=$(file -b --mime-type \"$file \"); [[ $mime_type == text/* ]] && echo \"$file \"; done";
 | 
			
		||||
      total-lines = "!git tracked-text-files | xargs cat | wc -l";
 | 
			
		||||
      total-files = "!git tracked-files | wc -l";
 | 
			
		||||
      total-commits = "!git log --oneline | wc -l";
 | 
			
		||||
      comitter-lines = "!git log --author=\"$1\" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf \"added lines: %s, removed lines: %s, total lines: %s\\n\", add, subs, loc }' #";
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										58
									
								
								home/programs/terminal/tools/git/default.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								home/programs/terminal/tools/git/default.nix
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,58 @@
 | 
			
		|||
{ osConfig, pkgs, ... }:
 | 
			
		||||
let
 | 
			
		||||
  myGitConf = osConfig.myOptions.home-manager.git;
 | 
			
		||||
in
 | 
			
		||||
{
 | 
			
		||||
  imports = [
 | 
			
		||||
    ./gh.nix
 | 
			
		||||
    ./ignores.nix
 | 
			
		||||
    ./aliases.nix
 | 
			
		||||
  ];
 | 
			
		||||
 | 
			
		||||
  # TODO: Figure out how to manage gpg keys properly in nix/home-manager
 | 
			
		||||
  # (right now, I'm importing my keys manually)
 | 
			
		||||
 | 
			
		||||
  programs.git = {
 | 
			
		||||
    enable = true;
 | 
			
		||||
    package = pkgs.gitAndTools.gitFull;
 | 
			
		||||
 | 
			
		||||
    userName = "ItsDrike";
 | 
			
		||||
    userEmail = "itsdrike@protonmail.com";
 | 
			
		||||
 | 
			
		||||
    signing = {
 | 
			
		||||
      signByDefault = myGitConf.signing.enabled;
 | 
			
		||||
      key = myGitConf.signing.key;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    delta.enable = true;
 | 
			
		||||
 | 
			
		||||
    extraConfig = {
 | 
			
		||||
      init.defaultBranch = "main";
 | 
			
		||||
      merge.conflictstyle = "diff3";
 | 
			
		||||
      delta.line-numbers = true;
 | 
			
		||||
 | 
			
		||||
      push = {
 | 
			
		||||
        default = "current";
 | 
			
		||||
        followTags = true;
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      url = {
 | 
			
		||||
        "https://github.com/".insteadOf = "github:";
 | 
			
		||||
        "ssh://git@github.com/".pushInsteadOf = "github:";
 | 
			
		||||
        "https://gitlab.com/".insteadOf = "gitlab:";
 | 
			
		||||
        "ssh://git@gitlab.com/".pushInsteadOf = "gitlab:";
 | 
			
		||||
        "https://aur.archlinux.org/".insteadOf = "aur:";
 | 
			
		||||
        "ssh://aur@aur.archlinux.org/".pushInsteadOf = "aur:";
 | 
			
		||||
        "https://git.sr.ht/".insteadOf = "srht:";
 | 
			
		||||
        "ssh://git@git.sr.ht/".pushInsteadOf = "srht:";
 | 
			
		||||
        "https://codeberg.org/".insteadOf = "codeberg:";
 | 
			
		||||
        "ssh://git@codeberg.org/".pushInsteadOf = "codeberg:";
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  home.packages = with pkgs; [
 | 
			
		||||
    gist # Manage github gists
 | 
			
		||||
    act # Run github actions locally
 | 
			
		||||
  ];
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										16
									
								
								home/programs/terminal/tools/git/gh.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								home/programs/terminal/tools/git/gh.nix
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
{ pkgs, ... }: {
 | 
			
		||||
  programs.gh = {
 | 
			
		||||
    enable = true;
 | 
			
		||||
    gitCredentialHelper.enable = false;
 | 
			
		||||
    extensions = with pkgs; [
 | 
			
		||||
      gh-dash # dashboard with pull requess and issues
 | 
			
		||||
      gh-eco # explore the ecosystem
 | 
			
		||||
      gh-cal # contributions calendar terminal viewer
 | 
			
		||||
      # TODO: Include meiji163/gh-notify
 | 
			
		||||
    ];
 | 
			
		||||
    settings = {
 | 
			
		||||
      git_protocol = "ssh";
 | 
			
		||||
      prompt = "enabled";
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										39
									
								
								home/programs/terminal/tools/git/ignores.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								home/programs/terminal/tools/git/ignores.nix
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,39 @@
 | 
			
		|||
{
 | 
			
		||||
  programs.git.ignores = [
 | 
			
		||||
    # Python:
 | 
			
		||||
    "__pycache__/"
 | 
			
		||||
    "*.py[cod]"
 | 
			
		||||
    "$py.class"
 | 
			
		||||
    "venv"
 | 
			
		||||
    ".venv"
 | 
			
		||||
    ".pytest_cache"
 | 
			
		||||
    ".mypy_cache"
 | 
			
		||||
 | 
			
		||||
    # C
 | 
			
		||||
    ".tags"
 | 
			
		||||
    "tags"
 | 
			
		||||
    "*~"
 | 
			
		||||
    "*.o"
 | 
			
		||||
    "*.so"
 | 
			
		||||
    "*.cmake"
 | 
			
		||||
    "CmakeCache.txt"
 | 
			
		||||
    "CMakeFiles/"
 | 
			
		||||
    "cmake-build-debug/"
 | 
			
		||||
    "compile_commands.json"
 | 
			
		||||
    ".ccls*"
 | 
			
		||||
 | 
			
		||||
    # JavaScript + TypeScript
 | 
			
		||||
    "node_modules/"
 | 
			
		||||
 | 
			
		||||
    # Editors
 | 
			
		||||
    ".vscode/"
 | 
			
		||||
    ".idea/"
 | 
			
		||||
    ".replit"
 | 
			
		||||
    ".spyproject/"
 | 
			
		||||
    ".spyderproject"
 | 
			
		||||
    ".neoconf.json"
 | 
			
		||||
 | 
			
		||||
    # Custom attributes for folders on Mac OS
 | 
			
		||||
    ".DS_Store"
 | 
			
		||||
  ];
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -30,6 +30,7 @@
 | 
			
		|||
    home-manager = {
 | 
			
		||||
      enabled = true;
 | 
			
		||||
      stateVersion = "23.11";
 | 
			
		||||
      git.signing.key = "FA2745890B7048C0";
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,10 @@
 | 
			
		|||
{ lib, ... }: with lib; let
 | 
			
		||||
in
 | 
			
		||||
{
 | 
			
		||||
  imports = [
 | 
			
		||||
    ./git.nix
 | 
			
		||||
  ];
 | 
			
		||||
 | 
			
		||||
  options.myOptions.home-manager = {
 | 
			
		||||
    enabled = mkOption {
 | 
			
		||||
      type = types.bool;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										18
									
								
								options/home/git.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								options/home/git.nix
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,18 @@
 | 
			
		|||
{ lib, ... }: with lib; let
 | 
			
		||||
in
 | 
			
		||||
{
 | 
			
		||||
  options.myOptions.home-manager.git = {
 | 
			
		||||
    signing = {
 | 
			
		||||
      enabled = mkOption {
 | 
			
		||||
        type = types.bool;
 | 
			
		||||
        default = true;
 | 
			
		||||
        description = "Should commits and tags be sgined by default?";
 | 
			
		||||
      };
 | 
			
		||||
      key = mkOption {
 | 
			
		||||
        type = types.str;
 | 
			
		||||
        default = "";
 | 
			
		||||
        description = "The defaul GPG key fingerprint for signing.";
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue