diff --git a/.config/git/config b/.config/git/config index 712fd6b..f87e727 100644 --- a/.config/git/config +++ b/.config/git/config @@ -1,8 +1,6 @@ [core] autocrlf = input editor = nvim -[diff] - tool = meld [submodule] recurse = true [rerere] @@ -11,6 +9,16 @@ [pack] threads = 0 +[diff] + tool = nvim +[merge] + tool = nvim +[mergetool "nvim"] + cmd = nvim -f -c \"Gdiffsplit!\" \"$MERGED\" + prompt = false +[difftool "nvim"] + cmd = "nvim -d \"$LOCAL\" \"$REMOTE\"" + # Automatically push to branch with matching name [push] default = current @@ -18,7 +26,7 @@ [pager] branch = false [grep] - lineNumber + lineNumber = 1 [color "status"] added = green @@ -27,9 +35,15 @@ [user] email = 27jf@pm.me - name = xerus + name = xerus2000 [alias] + st = status -sb + stv = --paginate status -v + + unstage = reset HEAD -- + ready = rebase -i @{u} + curbranch = symbolic-ref --short HEAD root = rev-parse --show-toplevel dir = !git root | sed 's/$/\\/.git/g' @@ -38,4 +52,4 @@ clean = git-lfs clean -- %f smudge = git-lfs smudge -- %f process = git-lfs filter-process - required + required = true diff --git a/.config/shell/git b/.config/shell/git index 3f7a1d2..becfc64 100644 --- a/.config/shell/git +++ b/.config/shell/git @@ -1,51 +1,56 @@ +# Tools alias bfg='java -jar ~/daten/dropbox/tools/bfg-1.13.0.jar' -alias gti=git +alias magit='nvim -c MagitOnly' # Repo info - alias gr='git remote -v' alias gb='git branch -vv' alias grev='git rev-parse --short' alias ghead='git rev-parse --short HEAD' alias gref='git reflog' -gln() { - git --no-pager log --graph --pretty=format:"%C(auto)%h -%d %s %Cgreen(%cr) %Cblue<%an>%Creset" -5 "$@" - println -} +# Show the 5 most recent commits without pager +alias gln='git --no-pager log --pretty=tformat:"%C(auto)%h -%d %s %Cgreen(%cr) %Cblue<%an>%Creset" -5 "$@"' + +# Log local and origin commits side by side - useful to check before forcing an action glno() { - local log= - local loc="$(git log --pretty=format:"%C(auto)%h %s %Cgreen(%cr)" -5 "$@" --color=always "$@")" - local origin="$(git log --pretty=format:"%C(auto)%h %s %Cgreen(%cr)" -5 "origin/$(git curbranch)" --color=always "$@")" - local a=$(echo $loc | wc -l) - local b=$(echo $origin | wc -l) + loc="$(git log --pretty=format:"%C(auto)%h %s %Cgreen(%cr)" -5 "$@" --color=always "$@")" + origin="$(git log --pretty=format:"%C(auto)%h %s %Cgreen(%cr)" -5 "origin/$(git curbranch)" --color=always "$@")" + a=$(echo $loc | wc -l) + b=$(echo $origin | wc -l) + halfcols="$(($(tput cols) / 2))" for i in `seq 1 $([ $a -le $b ] && echo "$a" || echo "$b")`; do - printf '%-120s %s\n' "$(echo $loc | head -n $i | tail -1)" "$(echo $origin | head -n $i | tail -1)" + printf "%-${halfcols}s %s\n" "$(echo $loc | head -n $i | tail -1)" "$(echo $origin | head -n $i | tail -1)" done } # Shortcuts - alias gfs='git fetch && git status -s -b' +alias glu='git pull upstream $(git curbranch)' alias gcap!='git commit -a --amend --no-edit && git push -f' alias grh!='git reset --hard' alias grhr='git reset --hard $(git rev-parse --abbrev-ref --symbolic-full-name @{u})' alias gitgc='git gc && git repack -a -d' +alias gitstandup='git --no-pager log --since yesterday --author erus --all' +alias gitready='git rebase -i @{u}' +# List all branches with their last updates +alias gitwhen="git for-each-ref --sort=committerdate --format='%(refname:short) * %(authorname) * %(committerdate:relative)' refs/remotes/" +# Find a commit that follows the given one - second argument can be used to specify the search range gitchild() { git log --reverse --ancestry-path --pretty=%H $1..${2:-HEAD} | head -1; } -gitrecache() { + +# Caching +gitrecache() { git rm --cached --quiet -r ${1:-.} git add ${1:-.} git status -s } - gitrestore() { git reset -- "$@" git checkout -- "$@" } -alias gitstandup='git --no-pager log --since yesterday --author Xerus --all' -alias gitready='git rebase -i @{u}' -alias gitwhen="git for-each-ref --sort=committerdate --format='%(refname:short) * %(authorname) * %(committerdate:relative)' refs/remotes/" +# Branches +alias gitrmgonebranches='git fetch -p && for branch in `git branch -vv | grep ": gone]" | cut -d" " -f3`; do git branch -D "$branch"; done' gitrebranch() { branch=${1:-$(git curbranch)} test "$(git curbranch)" = "$branch" && git checkout ${2:-master} @@ -58,30 +63,25 @@ gitrmbranch() { test $1 || git checkout master git branch -D $branch } -alias gitrmgonebranches='git fetch -p && for branch in `git branch -vv | grep ": gone]" | cut -d" " -f3`; do git branch -D "$branch"; done' -# Testing +# Save HEAD commit hash to "snap" file in git dir +gitsnap() { echo Snapped $(git rev-parse HEAD | tee "$(git dir)/${1:-snap}") } +# Hard reset HEAD to commit in "snap"-file +gitsnaprestore() { git reset --hard $(cat "$(git dir)/${1:-snap}") } -gittestcommit() { touch file$((++i)) && git add . && git commit -m "Create file$i"; } -gitsnap() { - echo -n "Snapped " - echo $(git rev-parse HEAD) | tee "$(git dir)/${1:-snap}" -} -gitsnaprestore() { - git reset --hard $(cat "$(git dir)/${1:-snap}") -} +# Remove list of tags local & remote gitrmtag() { declare -a refs local index=1 for tag in $@; do refs[index++]=":refs/tags/$tag"; done git push origin "${refs[@]}" && git tag -d "$@" } +# Rename a tag gitretag() { git push origin refs/tags/${1}:refs/tags/${2} :refs/tags/$1 && git tag -d $1 } -# Repo management - +# Repo management {{{ gitinit() { git init git add . @@ -97,18 +97,6 @@ gitbackup() { cd $p } -gitremote() { - case "$1" in - http*) echo "git@$(echo "$1" | cut -d'/' -f3):$(echo "$1" | cut -d'/' -f4)/$(echo "$1" | cut -d'/' -f5)" ;; - *) test "$2" = "-" && 2="" - test "$3" = "cau" && 3="CAU-Kiel-Tech-Inf" - test "$3" = "btl" && 3="betweenthelinesev" - echo "git@git${1:-hub}.com:${3:-Xerus2000}/${2:-$(basename $PWD)}.git" ;; - esac -} - -# Setting up repos - project() { cd $projects_dir if [ -d $2 ] @@ -117,20 +105,30 @@ project() { fi } -gitclone() { +gitremote() { + case "$1" in + http*) echo "git@$(echo "$1" | cut -d'/' -f3):$(echo "$1" | cut -d'/' -f4)/$(echo "$1" | cut -d'/' -f5)" ;; + *) test "$3" = "cau" && 3="CAU-Kiel-Tech-Inf" + test "$3" = "btl" && 3="betweenthelinesev" + echo "git@git${1:-hub}.com:${3:-xerus2000}/${2:-$(basename $PWD)}.git" ;; + esac +} + +gitclone() { remote=$(gitremote "$@") echo $remote git clone $remote "${@:4}" - cd "$2" + cd "$(basename ${remote/.git})" } gitfork() { cd "$projects_dir/_forks" gitclone hub "$1" test "$2" && git remote add upstream "$(gitremote hub "$1" "$2")" + git remote -v } -# sets this repo as origin and sets all branches upstream to their respective remote branch, if available +# set repo as origin and set all branches upstream to their respective remote branch, if available gitorigin() { git remote remove origin 2>/dev/null git remote add origin $(gitremote "$@") @@ -141,15 +139,16 @@ gitorigin() { done } -# sets this repo as upstream +# set repo as upstream gitupstream() { local name="${2:-upstream}" git remote remove $name 2>/dev/null git remote add $name "$(git remote -v | grep origin | head -1 | cut -f2 | cut -d':' -f1):$1/$(git remote -v | grep origin | head -1 | cut -f2 | cut -d'/' -f2 | cut -d' ' -f1)" git remote -v && git fetch $name || ( last=$? && echo "git fetch failed, aborting!" && return $last ) } +# }}} -# Rewriting history +# Rewriting history {{{ # gets the AuthorDate of a given committish git-authordate() { @@ -194,11 +193,11 @@ gitsquash() { gitcommits -q $1 git reset --hard $1 - if [ $(git rev-list $2 --count) = 1 ]; then + if [ $(git rev-list $2 --count) = 1 ]; then git update-ref -d HEAD git add . git-withdate $1 commit -c $1 - else + else git reset -q $2 git add . git commit --amend @@ -220,7 +219,7 @@ gitcommits() { done stashed="$(git rev-parse --show-toplevel)/.git/stashed-commits" - if [ $1 ]; then + if [ $1 ]; then if [ $verbosity -eq 0 ] then git rev-list --reverse HEAD...$1 >$stashed else git rev-list --reverse HEAD...$1 | tee $stashed @@ -240,3 +239,7 @@ gitcommits() { [ $aborted ] && echo "A problem was encountered. Fix it and run 'gitcommits' again to apply the remaining ${#rest} commits." fi } +# }}} + +# Testing +gittestcommit() { touch file$((++i)) && git add . && git commit -m "Create file$i"; }