Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Ohmyzsh
Commits
a449d53c
Commit
a449d53c
authored
Jun 05, 2015
by
Robby Russell
Browse files
Merge pull request #2790 from ncanceill/plugin-git
[UPDATE] Plugin: git
parents
da210921
5b75cc78
Changes
4
Hide whitespace changes
Inline
Side-by-side
plugins/git/README.md
View file @
a449d53c
## git
**Maintainer:**
[
Stibbons
](
https://github.com/Stibbons
)
This plugin adds several git aliases and increase the completion function provided by zsh
**Maintainer:**
[
@ncanceill
](
https://github.com/ncanceill
)
This plugin adds many useful aliases and functions.
### Usage
See the
[
wiki
](
https://github.com/robbyrussell/oh-my-zsh/wiki/Plugin:git
)
for a list of aliases and functions provided by the plugin.
plugins/git/_git-branch
deleted
100644 → 0
View file @
da210921
#compdef git-branch
_git-branch ()
{
declare l c m d
l='--color --no-color -r -a --all -v --verbose --abbrev --no-abbrev'
c='-l -f --force -t --track --no-track --set-upstream --contains --merged --no-merged'
m='-m -M'
d='-d -D'
declare -a dependent_creation_args
if (( words[(I)-r] == 0 )); then
dependent_creation_args=(
"($l $m $d): :__git_branch_names"
"::start-point:__git_revisions")
fi
declare -a dependent_deletion_args
if (( words[(I)-d] || words[(I)-D] )); then
dependent_creation_args=
dependent_deletion_args=(
'-r[delete only remote-tracking branches]')
if (( words[(I)-r] )); then
dependent_deletion_args+='*: :__git_ignore_line_inside_arguments __git_remote_branch_names'
else
dependent_deletion_args+='*: :__git_ignore_line_inside_arguments __git_branch_names'
fi
fi
declare -a dependent_modification_args
if (( words[(I)-m] || words[(I)-M] )); then
dependent_creation_args=
dependent_modification_args=(
':old or new branch name:__git_branch_names'
'::new branch name:__git_branch_names')
fi
_arguments -w -S -s \
"($c $m $d --no-color :)--color=-[turn on branch coloring]:: :__git_color_whens" \
"($c $m $d : --color)--no-color[turn off branch coloring]" \
"($c $m -a --all)-r[list or delete only remote-tracking branches]" \
"($c $m $d : -r)"{-a,--all}"[list both remote-tracking branches and local branches]" \
"($c $m $d : -v --verbose)"{-v,--verbose}'[show SHA1 and commit subject line for each head]' \
"($c $m $d :)--abbrev=[set minimum SHA1 display-length]: :__git_guard_number length" \
"($c $m $d :)--no-abbrev[do not abbreviate sha1s]" \
"($l $m $d)-l[create the branch's reflog]" \
"($l $m $d -f --force)"{-f,--force}"[force the creation of a new branch]" \
"($l $m $d -t --track)"{-t,--track}"[set up configuration so that pull merges from the start point]" \
"($l $m $d)--no-track[override the branch.autosetupmerge configuration variable]" \
"($l $m $d)--set-upstream[set up configuration so that pull merges]" \
"($l $m $d)--contains=[only list branches which contain the specified commit]: :__git_committishs" \
"($l $m $d)--merged=[only list branches which are fully contained by HEAD]: :__git_committishs" \
"($l $m $d)--no-merged=[do not list branches which are fully contained by HEAD]: :__git_committishs" \
$dependent_creation_args \
"($l $c $d -M)-m[rename a branch and the corresponding reflog]" \
"($l $c $d -m)-M[rename a branch even if the new branch-name already exists]" \
$dependent_modification_args \
"($l $c $m -D)-d[delete a fully merged branch]" \
"($l $c $m -d)-D[delete a branch]" \
$dependent_deletion_args
}
(( $+functions[__git_ignore_line] )) ||
__git_ignore_line () {
declare -a ignored
ignored=()
((CURRENT > 1)) &&
ignored+=(${line[1,CURRENT-1]//(#m)[\[\]()\\*?#<>~\^]/\\$MATCH})
((CURRENT < $#line)) &&
ignored+=(${line[CURRENT+1,-1]//(#m)[\[\]()\\*?#<>~\^]/\\$MATCH})
$* -F ignored
}
(( $+functions[__git_ignore_line_inside_arguments] )) ||
__git_ignore_line_inside_arguments () {
declare -a compadd_opts
zparseopts -D -E -a compadd_opts V: J: 1 2 n f X: M: P: S: r: R: q F:
__git_ignore_line $* $compadd_opts
}
plugins/git/_git-remote
deleted
100644 → 0
View file @
da210921
#compdef git-remote
# NOTE: --track is undocumented.
# TODO: --track, -t, --master, and -m should take remote branches, I guess.
# NOTE: --master is undocumented.
# NOTE: --fetch is undocumented.
_git-remote () {
local curcontext=$curcontext state line
declare -A opt_args
_arguments -C \
':command:->command' \
'*::options:->options' && ret=0
case $state in
(command)
declare -a commands
commands=(
'add:add a new remote'
'show:show information about a given remote'
'prune:delete all stale tracking branches for a given remote'
'update:fetch updates for a set of remotes'
'rm:remove a remote from .git/config and all associated tracking branches'
'rename:rename a remote from .git/config and update all associated tracking branches'
'set-head:sets or deletes the default branch'
'set-branches:changes the list of branches tracked by the named remote.'
'set-url:changes URL remote points to.'
)
_describe -t commands 'sub-command' commands && ret=0
;;
(options)
case $line[1] in
(add)
_arguments \
'*'{--track,-t}'[track given branch instead of default glob refspec]:branch:__git_branch_names' \
'(--master -m)'{--master,-m}'[set the remote'\''s HEAD to point to given master branch]:branch:__git_branch_names' \
'(--fetch -f)'{--fetch,-f}'[run git-fetch on the new remote after it has been created]' \
':branch name:__git_remotes' \
':url:_urls' && ret=0
;;
(show)
_arguments \
'-n[do not contact the remote for a list of branches]' \
':remote:__git_remotes' && ret=0
;;
(prune)
_arguments \
'(--dry-run -n)'{-n,--dry-run}'[do not actually prune, only list what would be done]' \
':remote:__git_remotes' && ret=0
;;
(update)
__git_remote-groups && ret=0
;;
(rm)
__git_remotes && ret=0
;;
(rename)
__git_remotes && ret=0
;;
(set-url)
_arguments \
'*--push[manipulate push URLs]' \
'(--add)--add[add URL]' \
'(--delete)--delete[delete URLs]' \
':branch name:__git_remotes' \
':url:_urls' && ret=0
;;
esac
;;
esac
}
plugins/git/git.plugin.zsh
View file @
a449d53c
# Query/use custom command for `git`.
local
git_cmd
zstyle
-s
":vcs_info:git:*:-all-"
"command"
git_cmd
:
${
git_cmd
:
=git
}
#
# Functions
#
# The current branch name
# Usage example: git pull origin $(current_branch)
# Using '--quiet' with 'symbolic-ref' will not cause a fatal error (128) if
# it's not a symbolic ref, but in a Git repo.
function
current_branch
()
{
local
ref
ref
=
$(
$git_cmd
symbolic-ref
--quiet
HEAD 2> /dev/null
)
local
ret
=
$?
if
[[
$ret
!=
0
]]
;
then
[[
$ret
==
128
]]
&&
return
# no git repo.
ref
=
$(
$git_cmd
rev-parse
--short
HEAD 2> /dev/null
)
||
return
fi
echo
${
ref
#refs/heads/
}
}
# The list of remotes
function
current_repository
()
{
if
!
$git_cmd
rev-parse
--is-inside-work-tree
&> /dev/null
;
then
return
fi
echo
$(
$git_cmd
remote
-v
|
cut
-d
':'
-f
2
)
}
# Pretty log messages
function
_git_log_prettily
(){
if
!
[
-z
$1
]
;
then
git log
--pretty
=
$1
fi
}
# Warn if the current branch is a WIP
function
work_in_progress
()
{
if
$(
git log
-n
1 2>/dev/null |
grep
-q
-c
"
\-\-
wip
\-\-
"
)
;
then
echo
"WIP!!"
fi
}
#
# Aliases
# (sorted alphabetically)
#
alias
g
=
'git'
compdef
g
=
git
alias
gst
=
'git status'
compdef _git
gst
=
git-status
alias
gd
=
'git diff'
compdef _git
gd
=
git-diff
alias
gdc
=
'git diff --cached'
compdef _git
gdc
=
git-diff
alias
gdt
=
'git diff-tree --no-commit-id --name-only -r'
compdef _git
gdc
=
git diff-tree
--no-commit-id
--name-only
-r
alias
gl
=
'git pull'
compdef _git
gl
=
git-pull
alias
gup
=
'git pull --rebase'
compdef _git
gup
=
git-fetch
alias
gp
=
'git push'
compdef _git
gp
=
git-push
alias
gd
=
'git diff'
gdv
()
{
git diff
-w
"
$@
"
| view -
}
compdef _git
gdv
=
git-diff
alias
gdt
=
'git difftool'
alias
ga
=
'git add'
alias
gb
=
'git branch'
alias
gba
=
'git branch -a'
alias
gbda
=
'git branch --merged | command grep -vE "^(\*|\s*master\s*$)" | command xargs -n 1 git branch -d'
alias
gbl
=
'git blame -b -w'
alias
gbnm
=
'git branch --no-merged'
alias
gbr
=
'git branch --remote'
alias
gbs
=
'git bisect'
alias
gbsb
=
'git bisect bad'
alias
gbsg
=
'git bisect good'
alias
gbsr
=
'git bisect reset'
alias
gbss
=
'git bisect start'
alias
gc
=
'git commit -v'
compdef _git
gc
=
git-commit
alias
gc!
=
'git commit -v --amend'
compdef _git gc!
=
git-commit
alias
gca
=
'git commit -v -a'
compdef _git
gc
=
git-commit
alias
gca!
=
'git commit -v -a --amend'
compdef _git gca!
=
git-commit
alias
gcan!
=
'git commit -v -a -s --no-edit --amend'
alias
gcb
=
'git checkout -b'
alias
gcf
=
'git config --list'
alias
gcl
=
'git clone --recursive'
alias
gclean
=
'git reset --hard && git clean -dfx'
alias
gcm
=
'git checkout master'
alias
gcmsg
=
'git commit -m'
compdef _git
gcmsg
=
git-commit
alias
gco
=
'git checkout'
compdef _git
gco
=
git-checkout
alias
gcm
=
'git checkout master'
alias
gr
=
'git remote'
compdef _git
gr
=
git-remote
alias
grv
=
'git remote -v'
compdef _git
grv
=
git-remote
alias
grmv
=
'git remote rename'
compdef _git
grmv
=
git-remote
alias
grrm
=
'git remote remove'
compdef _git
grrm
=
git-remote
alias
grset
=
'git remote set-url'
compdef _git
grset
=
git-remote
alias
grup
=
'git remote update'
compdef _git
grset
=
git-remote
alias
grbi
=
'git rebase -i'
compdef _git
grbi
=
git-rebase
alias
grbc
=
'git rebase --continue'
compdef _git
grbc
=
git-rebase
alias
grba
=
'git rebase --abort'
compdef _git
grba
=
git-rebase
alias
gb
=
'git branch'
compdef _git
gb
=
git-branch
alias
gba
=
'git branch -a'
compdef _git
gba
=
git-branch
alias
gbr
=
'git branch --remote'
alias
gcount
=
'git shortlog -sn'
compdef
gcount
=
git
alias
gcl
=
'git config --list'
alias
gcp
=
'git cherry-pick'
compdef _git
gcp
=
git-cherry-pick
alias
glg
=
'git log --stat --max-count=10'
compdef _git
glg
=
git-log
alias
glgg
=
'git log --graph --max-count=10'
compdef _git
glgg
=
git-log
alias
glgga
=
'git log --graph --decorate --all'
compdef _git
glgga
=
git-log
alias
glo
=
'git log --oneline --decorate --color'
compdef _git
glo
=
git-log
alias
glog
=
'git log --oneline --decorate --color --graph'
compdef _git
glog
=
git-log
alias
gss
=
'git status -s'
compdef _git
gss
=
git-status
alias
ga
=
'git add'
compdef _git
ga
=
git-add
alias
gap
=
'git add --patch'
alias
gaa
=
'git add --all'
alias
gm
=
'git merge'
compdef _git
gm
=
git-merge
alias
grh
=
'git reset HEAD'
alias
grhh
=
'git reset HEAD --hard'
alias
gclean
=
'git reset --hard && git clean -dfx'
alias
gwc
=
'git whatchanged -p --abbrev-commit --pretty=medium'
# Sign and verify commits with GPG
alias
gcs
=
'git commit -S'
compdef _git
gcs
=
git-commit
alias
gsps
=
'git show --pretty=short --show-signature'
compdef _git
gsps
=
git-show
# Sign and verify tags with GPG
alias
gts
=
'git tag -s'
compdef _git
gts
=
git-tag
alias
gvt
=
'git verify-tag'
compdef _git
gvt
=
git verify-tag
#remove the gf alias
#alias gf='git ls-files | grep'
alias
gd
=
'git diff'
alias
gdc
=
'git diff --cached'
alias
gdt
=
'git diff-tree --no-commit-id --name-only -r'
gdv
()
{
git diff
-w
"
$@
"
| view -
}
compdef _git
gdv
=
git-diff
alias
gdw
=
'git diff --word-diff'
alias
gpoat
=
'git push origin --all && git push origin --tags'
alias
gmt
=
'git mergetool --no-prompt'
compdef _git
gmt
=
git-mergetool
alias
gf
=
'git fetch'
alias
gfa
=
'git fetch --all --prune'
function
gfg
()
{
git ls-files |
grep
$@
}
compdef
gfg
=
grep
alias
gfo
=
'git fetch origin'
alias
gg
=
'git gui citool'
alias
gga
=
'git gui citool --amend'
alias
gk
=
'gitk --all --branches'
alias
gsts
=
'git stash show --text'
alias
gsta
=
'git stash'
alias
gstp
=
'git stash pop'
alias
gstd
=
'git stash drop'
# Will cd into the top of the current repository
# or submodule.
alias
grt
=
'cd $(git rev-parse --show-toplevel || echo ".")'
ggf
()
{
[[
"$#"
!=
1
]]
&&
b
=
"
$(
current_branch
)
"
git push
--force
origin
"
${
b
:
=
$1
}
"
}
compdef _git
ggf
=
git-checkout
ggl
()
{
[[
"$#"
!=
1
]]
&&
b
=
"
$(
current_branch
)
"
git pull origin
"
${
b
:
=
$1
}
"
}
compdef _git
ggl
=
git-checkout
ggp
()
{
[[
"$#"
!=
1
]]
&&
b
=
"
$(
current_branch
)
"
git push origin
"
${
b
:
=
$1
}
"
}
compdef _git
ggp
=
git-checkout
ggpnp
()
{
ggl
"
$1
"
&&
ggp
"
$1
"
}
compdef _git
ggpnp
=
git-checkout
alias
ggsup
=
'git branch --set-upstream-to=origin/$(current_branch)'
ggu
()
{
[[
"$#"
!=
1
]]
&&
b
=
"
$(
current_branch
)
"
git pull
--rebase
origin
"
${
b
:
=
$1
}
"
}
compdef _git
ggu
=
git-checkout
# Git and svn mix
alias
gignore
=
'git update-index --assume-unchanged'
alias
gignored
=
'git ls-files -v | grep "^[[:lower:]]"'
alias
git-svn-dcommit-push
=
'git svn dcommit && git push github master:svntrunk'
compdef git-svn-dcommit-push
=
git
alias
gsr
=
'git svn rebase'
alias
gsd
=
'git svn dcommit'
#
# Will return the current branch name
# Usage example: git pull origin $(current_branch)
#
function
current_branch
()
{
ref
=
$(
git symbolic-ref HEAD 2> /dev/null
)
||
\
ref
=
$(
git rev-parse
--short
HEAD 2> /dev/null
)
||
return
echo
${
ref
#refs/heads/
}
}
function
current_repository
()
{
ref
=
$(
git symbolic-ref HEAD 2> /dev/null
)
||
\
ref
=
$(
git rev-parse
--short
HEAD 2> /dev/null
)
||
return
echo
$(
git remote
-v
|
cut
-d
':'
-f
2
)
}
# these aliases take advantage of the previous function
alias
ggpull
=
'git pull origin $(current_branch)'
compdef
ggpull
=
git
alias
ggpur
=
'git pull --rebase origin $(current_branch)'
compdef
ggpur
=
git
alias
ggpush
=
'git push origin $(current_branch)'
compdef
ggpush
=
git
alias
ggpnp
=
'git pull origin $(current_branch) && git push origin $(current_branch)'
compdef
ggpnp
=
git
alias
gk
=
'\gitk --all --branches'
compdef _git
gk
=
'gitk'
alias
gke
=
'\gitk --all $(git log -g --pretty=format:%h)'
compdef _git
gke
=
'gitk'
# Pretty log messages
function
_git_log_prettily
(){
if
!
[
-z
$1
]
;
then
git log
--pretty
=
$1
fi
}
alias
gl
=
'git pull'
alias
glg
=
'git log --stat --color'
alias
glgp
=
'git log --stat --color -p'
alias
glgg
=
'git log --graph --color'
alias
glgga
=
'git log --graph --decorate --all'
alias
glgm
=
'git log --graph --max-count=10'
alias
glo
=
'git log --oneline --decorate --color'
alias
glol
=
"git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
alias
glola
=
"git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --all"
alias
glog
=
'git log --oneline --decorate --color --graph'
alias
glp
=
"_git_log_prettily"
compdef _git
glp
=
git-log
# Work In Progress (wip)
# These features allow to pause a branch development and switch to another one (wip)
# When you want to go back to work, just unwip it
#
# This function return a warning if the current branch is a wip
function
work_in_progress
()
{
if
$(
git log
-n
1 2>/dev/null |
grep
-q
-c
"
\-\-
wip
\-\-
"
)
;
then
echo
"WIP!!"
fi
}
# these alias commit and uncomit wip branches
alias
gwip
=
'git add -A; git ls-files --deleted -z | xargs -r0 git rm; git commit -m "--wip--"'
alias
gunwip
=
'git log -n 1 | grep -q -c "\-\-wip\-\-" && git reset HEAD~1'
alias
gm
=
'git merge'
alias
gmom
=
'git merge origin/master'
alias
gmt
=
'git mergetool --no-prompt'
alias
gmtvim
=
'git mergetool --no-prompt --tool=vimdiff'
alias
gmum
=
'git merge upstream/master'
alias
gp
=
'git push'
alias
gpd
=
'git push --dry-run'
alias
gpoat
=
'git push origin --all && git push origin --tags'
compdef _git
gpoat
=
git-push
alias
gpu
=
'git push upstream'
alias
gpv
=
'git push -v'
alias
gr
=
'git remote'
alias
gra
=
'git remote add'
alias
grb
=
'git rebase'
alias
grba
=
'git rebase --abort'
alias
grbc
=
'git rebase --continue'
alias
grbi
=
'git rebase -i'
alias
grbm
=
'git rebase master'
alias
grbs
=
'git rebase --skip'
alias
grh
=
'git reset HEAD'
alias
grhh
=
'git reset HEAD --hard'
alias
grmv
=
'git remote rename'
alias
grrm
=
'git remote remove'
alias
grset
=
'git remote set-url'
alias
grt
=
'cd $(git rev-parse --show-toplevel || echo ".")'
alias
gru
=
'git reset --'
alias
grup
=
'git remote update'
alias
grv
=
'git remote -v'
alias
gsb
=
'git status -sb'
alias
gsd
=
'git svn dcommit'
alias
gsi
=
'git submodule init'
alias
gsps
=
'git show --pretty=short --show-signature'
alias
gsr
=
'git svn rebase'
alias
gss
=
'git status -s'
alias
gst
=
'git status'
alias
gsta
=
'git stash'
alias
gstaa
=
'git stash apply'
alias
gstd
=
'git stash drop'
alias
gstl
=
'git stash list'
alias
gstp
=
'git stash pop'
alias
gsts
=
'git stash show --text'
alias
gsu
=
'git submodule update'
alias
gts
=
'git tag -s'
# these alias ignore changes to file
alias
gignore
=
'git update-index --assume-unchanged'
alias
gunignore
=
'git update-index --no-assume-unchanged'
# list temporarily ignored files
alias
gignored
=
'git ls-files -v | grep "^[[:lower:]]"'
alias
gunwip
=
'git log -n 1 | grep -q -c "\-\-wip\-\-" && git reset HEAD~1'
alias
gup
=
'git pull --rebase'
alias
gupv
=
'git pull --rebase -v'
alias
gvt
=
'git verify-tag'
alias
gwch
=
'git whatchanged -p --abbrev-commit --pretty=medium'
alias
gwip
=
'git add -A; git rm $(git ls-files --deleted); git commit -m "--wip--"'
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment