{ ... }: { text = '' # Git push. function gps() { git push "''${@}" } # Git push all (branches). Useful for pushing all stuff to a new remote. function gpsa() { local remotes=($(git remote)) for remote in ''${remotes[@]}; do echo -n "''${remote}: " git push "''${remote}" --tags "refs/remotes/origin/*:refs/heads/*" done } # Git force push. function gpsf() { git push --force "''${@}" } # Git pull. function gpl() { git pull "''${@}" } # Git log. function gl() { git log --show-signature "''${@}" } # Git status. function gs() { git status "''${@}" } # Git stash. function gst() { git stash "''${@}" } # Git diff. function gd() { git diff "''${@}" } # Git diff added. function gda() { git diff --cached "''${@}" } # Git commit. function gc() { git commit -m "''${@}" } # Git clone (lazy!). function gcl() { git clone --filter tree:0 "''${@}" } # Git signed commit. function gcs() { git commit -S -m "''${@}" } # Git checkout. function gch() { git checkout "''${@}" } # Git checkout branch. # Usage: gchb function gchb() { git checkout -b "''${@}" } # Git branch. function gb() { git branch --all "''${@}" } # Git branch delete. # Usage: gbd function gbd() { git branch -D "''${@}" } # Git branch delete all except current. function gbda() { git branch | grep -v ^* | xargs git branch -D } # Git fetch all. function gf() { git fetch --all -v -p } # Git tag. function gt() { git tag "''${@}" } # Git ignore files. function gi() { git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached } # Git patch create. # Usage: gpc function gpc() { git diff --cached --binary > "''${@}" } # Git patch (apply). # Usage: gp function gp() { git apply "''${@}" } # Run git garbage collection. function ggc() { git gc --aggressive --no-cruft --prune=now } # Preview diff while adding. Adds current dir by default. # Usage: ga [FILES] function ga() { local target=''${@} if [[ "''${target}" = "" ]]; then target="." fi git diff ''${target} git add ''${target} } # Rebase by X commits or from root. When COUNT is 0 - rebase from root. Default is 2. # Usage: gr [COMMIT COUNT] function gr() { local base="''${1}" # Rebase last 2 commits by default. if [[ "''${base}" = "" ]]; then base="2" fi # If 0, rebase from root. else from specified base. if [[ "''${base}" = "0" ]]; then git rebase -i --root else git rebase -i HEAD~''${base} fi } # Specify git user as Dmitry Voronin with provided email. # Usage: gu [EMAIL] function gu() { local name="Dmitry Voronin" local email="''${1}" if [[ "''${name}" = "" || "''${email}" = "" ]]; then echo "usage: gu [EMAIL]" return 2 fi git config user.name "''${name}" git config user.email "''${email}" } # Get my git repo. # Usage: gg function gg() { local repo="''${1}" if [[ "''${repo}" = "" ]]; then help gg return 2 fi git clone ssh://git@git.voronind.com:22144/voronind/"''${repo}" } # See diff for a specific commit. Last commit by default. # Usage: gdc [COMMITHASH] function gdc() { local hash="''${1}" [[ "''${hash}" = "" ]] && hash="HEAD" git diff "''${hash}^!" } # Get version number based on commit count. function gv() { git rev-list HEAD --count } # Open the remote web url in default browser. # Usage: gw [REMOTE] function gw() { local remote="''${1}" [[ "''${remote}" = "" ]] && remote="$(git remote | head -n1)" local url="$(git remote get-url ''${remote})" open "''${url}" } # Sign the old commits. 0 to resign from root. # Usage: git_sign [COMMIT_COUNT] function git_sign() { local base="''${1}" # Resign last commit by default. if [[ "''${base}" = "" ]]; then base="1" fi # If 0, rebase from root. else from specified base. if [[ "''${base}" = "0" ]]; then git rebase --exec 'git commit --amend --no-edit -n -S' -i --root else git rebase --exec 'git commit --amend --no-edit -n -S' -i HEAD~''${base} fi } # Show current branch. function _git_current_branch() { git branch --show-current 2> /dev/null } # Show origin's url. function _git_origin_url() { git remote get-url origin } # Get this dotfiles url. function _git_dotfiles_url() { echo 'https://git.voronind.com/voronind/linux.git' } # Check if current git repo is this dotfiles. function _git_is_dotfiles() { # [[ "$(_git_origin_url)" = "$(_git_dotfiles_url)" ]] local dir="''${PWD}" while [[ "''${dir}" != "" ]]; do if [[ -d "''${dir}/.git" ]]; then if [[ "''${dir}" = "''${HOME}" ]] || [[ "''${dir}" = "$(realpath ''${HOME})" ]]; then return 0 else return 1 fi fi dir="''${dir%/*}" done } # Autocomplete. _completion_loader git &> /dev/null __git_complete gps _git_push &> /dev/null __git_complete gpsf _git_push &> /dev/null __git_complete gpl _git_pull &> /dev/null __git_complete gl _git_log &> /dev/null __git_complete gs _git_status &> /dev/null __git_complete gst _git_stash &> /dev/null __git_complete gd _git_diff &> /dev/null __git_complete gdc _git_diff &> /dev/null __git_complete gc _git_commit &> /dev/null __git_complete gch _git_checkout &> /dev/null __git_complete gchb _git_checkout &> /dev/null __git_complete gb _git_branch &> /dev/null __git_complete gbd _git_branch &> /dev/null __git_complete gf _git_fetch &> /dev/null __git_complete gt _git_tag &> /dev/null __git_complete gp _git_apply &> /dev/null __git_complete ga _git_add &> /dev/null __git_complete gw _git_pull &> /dev/null # Autocomplete with my git emails. function _gu() { _autocomplete_first hi@voronind.com dd.voronin@fsight.ru } complete -F _gu gu ''; }