我单独运行以下代码,因为我的提示在.zshrc中失败了。这表明我显然没有一个名为__git_ps1的程序。它不在MacPorts中。
PROMPT="$(__git_ps1 " \[\033[1;32m\] (%s)\[\033[0m\]")\$"$
PROMPT="$(__git_ps1 " (%s)")\$"$
# Get the name of the branch we are on
git_prompt_info() {
branch_prompt=$(__git_ps1)
if [ -n "$branch_prompt" ]; then
status_icon=$(git_status)
echo $branch_prompt $status_icon
fi
}
# Show character if changes are pending
git_status() {
if current_git_status=$(git status | grep 'added to commit' 2> /dev/null); then
echo "☠"
fi
}
autoload -U colors
colors
setopt prompt_subst
PROMPT='
%~%{$fg_bold[black]%}$(git_prompt_info)
→ %{$reset_color%}'
如何获得显示Git分支名称的提示?
答案 0 :(得分:63)
__git_ps1
来自git-completion.bash。在zsh中,您可能必须提供自己的函数来确定当前目录git branch。关于zsh的blog posts,有很多git prompt。
你只需要:
例如
git_prompt() {
ref=$(git symbolic-ref HEAD | cut -d'/' -f3)
echo $ref
}
setopt prompt_subst
PS1=$(git_prompt)%#
autoload -U promptinit
promptinit
更新:使用zsh vcs_info模块而不是git_prompt()
setopt prompt_subst
autoload -Uz vcs_info
zstyle ':vcs_info:*' actionformats \
'%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{3}|%F{1}%a%F{5}]%f '
zstyle ':vcs_info:*' formats \
'%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{5}]%f '
zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat '%b%F{1}:%F{3}%r'
zstyle ':vcs_info:*' enable git cvs svn
# or use pre_cmd, see man zshcontrib
vcs_info_wrapper() {
vcs_info
if [ -n "$vcs_info_msg_0_" ]; then
echo "%{$fg[grey]%}${vcs_info_msg_0_}%{$reset_color%}$del"
fi
}
RPROMPT=$'$(vcs_info_wrapper)'
答案 1 :(得分:32)
以下是zsh的扩展git提示符:zsh-git-prompt。
答案 2 :(得分:23)
ko-dos的答案很棒,但我更喜欢比他使用的那个更有一点git意识的提示。具体来说,我喜欢提示本身中的分阶段,未分阶段和未跟踪的文件通知。使用他的答案和zsh vcs_info examples,我想出了以下内容:
setopt prompt_subst
autoload -Uz vcs_info
zstyle ':vcs_info:*' stagedstr 'M'
zstyle ':vcs_info:*' unstagedstr 'M'
zstyle ':vcs_info:*' check-for-changes true
zstyle ':vcs_info:*' actionformats '%F{5}[%F{2}%b%F{3}|%F{1}%a%F{5}]%f '
zstyle ':vcs_info:*' formats \
'%F{5}[%F{2}%b%F{5}] %F{2}%c%F{3}%u%f'
zstyle ':vcs_info:git*+set-message:*' hooks git-untracked
zstyle ':vcs_info:*' enable git
+vi-git-untracked() {
if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == 'true' ]] && \
[[ $(git ls-files --other --directory --exclude-standard | sed q | wc -l | tr -d ' ') == 1 ]] ; then
hook_com[unstaged]+='%F{1}??%f'
fi
}
precmd () { vcs_info }
PROMPT='%F{5}[%F{2}%n%F{5}] %F{3}%3~ ${vcs_info_msg_0_} %f%# '
这会创建一个模仿git status -s
的彩色输出的提示(可以在.gitconfig
文件中配置)。这张照片在这里可能最有帮助:
与git status -s
:
如果您不喜欢彩色输出,或者更喜欢其他字符或提示构造,只需更改上述代码中的stagedstr
,unstagedstr
和hook_com[unstaged]
值即可。< / p>
答案 3 :(得分:1)
对于对维护的现成解决方案感兴趣的任何人,请安装https://github.com/ohmyzsh/ohmyzsh-默认情况下它已打开git插件。我一直在寻找这样的东西-无需脑子就可以预先创建配置,效果很好。
答案 4 :(得分:1)
对于已经不想使用zsh
配置和git
以外的内容的读者来说,这已经有了很多不错的答案。
但是,我发现自己只是想要
working-directory (git-branch-color-if-uncommitted) % 24h-timestamp
git_branch_test_color() {
local ref=$(git symbolic-ref --short HEAD 2> /dev/null)
if [ -n "${ref}" ]; then
if [ -n "$(git status --porcelain)" ]; then
local gitstatuscolor='%F{red}'
else
local gitstatuscolor='%F{green}'
fi
echo "${gitstatuscolor} (${ref})"
else
echo ""
fi
}
setopt PROMPT_SUBST
PROMPT='%9c$(git_branch_test_color)%F{none} %# '
# add 24h time the right side
RPROMPT='%D{%k:%M:%S}'
这是
$()
(感谢Phil's 2017 answer!)允许包含函数(PROMPT_SUBST
)git_branch_test_color
来为分支ref ..调用git
,并通过函数是否成功(测试stdout)来确定当前目录是否是git信息库symbolic-ref
arg的一些评论!)
""
git status --porcelain
用于确定是否已更改任何文件或新建/删除了文件
请注意,所有此类提示在挂载目录上的速度可能都很慢(尤其是通过sshfs
)。如果遇到这种情况,我建议尽可能对这些目录进行特殊大小写(也许创建一个新的shell函数来检查cd是否在您的收藏夹中)或始终挂载在同一路径中并忽略它(example with vcs_info
)< / p>
答案 5 :(得分:0)
感谢您的链接!
我根据它们提出了以下提示
# get the name of the branch we are on
git_prompt_info() {
git branch | awk '/^\*/ { print $2 }'
}
get_git_dirty() {
git diff --quiet || echo '*'
}
autoload -U colors
colors
setopt prompt_subst
PROMPT='%{$fg[blue]%}%c %{$fg_bold[red]%}$(git_prompt_info)$(get_git_dirty)%{$fg[blue]%} $ %{$reset_color%}'
RPROMPT='%{$fg[green]%}%1(j.%j.)'
请提出任何改进建议。
答案 6 :(得分:0)
由于我们的分支名称很长,所以我只是重新命名了。如果该字符超过35个字符,则会用省略号将其截断。
parse_git_branch() {
git_status="$(git status 2> /dev/null)"
pattern="On branch ([^[:space:]]*)"
if [[ ! ${git_status} =~ "(working (tree|directory) clean)" ]]; then
state="*"
fi
if [[ ${git_status} =~ ${pattern} ]]; then
branch=${match[1]}
branch_cut=${branch:0:35}
if (( ${#branch} > ${#branch_cut} )); then
echo "(${branch_cut}…${state})"
else
echo "(${branch}${state})"
fi
fi
}
setopt PROMPT_SUBST
PROMPT='%{%F{blue}%}%9c%{%F{none}%}$(parse_git_branch)$'
(我为此感到骄傲而感到尴尬。)
答案 7 :(得分:0)
在捣碎返回键时,许多这些解决方案对我来说似乎很慢,因此这是一个基本且快速的选项:
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
setopt PROMPT_SUBST
PROMPT='%9c%{%F{green}%}$(parse_git_branch)%{%F{none}%} $ '
您将看到如下提示:
~/dev/project (feature-branch) $
答案 8 :(得分:0)
如果您的所有提示看起来都不错,但不起作用,例如:
function git_branch(){
ref=$(git symbolic-ref --short --quiet HEAD 2>/dev/null)
if [ -n "${ref}" ]; then
echo "(""$ref"")"
fi
}
setopt PROMPT_SUBST
PROMPT="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m:%{$fg[yellow]%}%1~%{$reset_color%} %{%F{green}%}$(git_branch)%{%F{none}%}$ "
PROMPT必须设置为使用单引号而不是双引号引起来的字符串。
PROMPT='%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m:%{$fg[yellow]%}%1~%{$reset_color%} %{%F{green}%}$(git_branch)%{%F{none}%}$ '