mirror of
https://github.com/ItsDrike/nixdots
synced 2024-12-25 16:04:35 +00:00
Add git configuration
This commit is contained in:
parent
a9cdf25a57
commit
329f48882e
|
@ -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…
Reference in a new issue