zsh:找出当前目录的VCS
zsh: Find out VCS of current directory
我想创建一个 zsh 小部件,以通过一个按钮执行版本控制系统的常见任务。例如。如果当前目录是 Subversion 签出的一部分,则按 F1 应该调用 "svn status"。如果它在 git 存储库中,它应该调用 "git status -s".
现在,创建小部件没什么大不了的。但是如何判断当前目录下是哪个VCS呢?
我知道 vcs_info
而且我经常使用。但是我找不到任何方法来检索它提供的最基本的信息。有什么想法吗?
如何测试特定元数据目录的存在?
if test -d CVS; then
# CVS
elif test -d .hg; then
# Mercurial
elif test -d .git; then
# Git
elif test -d .svn; then
# Subversion
else
# unknown
fi
感谢大家的评论。我的解决方案现在看起来像这样:
vcs-status() {
setopt no_autopushd
cmd=""
cur_dir=`pwd`
while [[ `pwd` != "/" ]]; do
if [[ -d .svn ]]; then
cmd="svn status^M"
break
elif [[ -d .git ]]; then
cmd="git status -s^M"
break
fi
cd ..
done
cd $cur_dir
if [[ -n $cmd ]]; then
zle -U $cmd
fi
setopt autopushd
}
zle -N vcs-status
bindkey "\eOP" vcs-status
欢迎提出有关 zsh 改进的建议:-)
我也实现了 Thomas 的建议,使用 svn info
和 git rev-parse
。但后来我注意到一个问题:如果我有一个 SVN 工作副本在 内部 某个地方检出 GIT 工作副本(是的,这是偶尔需要的),反之亦然,我只会找到我正在检查的第一个。通过上面的解决方案,我找到了 "inner-most",这就是我想要的。其实这也是困扰我一段时间的问题vcs_info
。
我想创建一个 zsh 小部件,以通过一个按钮执行版本控制系统的常见任务。例如。如果当前目录是 Subversion 签出的一部分,则按 F1 应该调用 "svn status"。如果它在 git 存储库中,它应该调用 "git status -s".
现在,创建小部件没什么大不了的。但是如何判断当前目录下是哪个VCS呢?
我知道 vcs_info
而且我经常使用。但是我找不到任何方法来检索它提供的最基本的信息。有什么想法吗?
如何测试特定元数据目录的存在?
if test -d CVS; then
# CVS
elif test -d .hg; then
# Mercurial
elif test -d .git; then
# Git
elif test -d .svn; then
# Subversion
else
# unknown
fi
感谢大家的评论。我的解决方案现在看起来像这样:
vcs-status() {
setopt no_autopushd
cmd=""
cur_dir=`pwd`
while [[ `pwd` != "/" ]]; do
if [[ -d .svn ]]; then
cmd="svn status^M"
break
elif [[ -d .git ]]; then
cmd="git status -s^M"
break
fi
cd ..
done
cd $cur_dir
if [[ -n $cmd ]]; then
zle -U $cmd
fi
setopt autopushd
}
zle -N vcs-status
bindkey "\eOP" vcs-status
欢迎提出有关 zsh 改进的建议:-)
我也实现了 Thomas 的建议,使用 svn info
和 git rev-parse
。但后来我注意到一个问题:如果我有一个 SVN 工作副本在 内部 某个地方检出 GIT 工作副本(是的,这是偶尔需要的),反之亦然,我只会找到我正在检查的第一个。通过上面的解决方案,我找到了 "inner-most",这就是我想要的。其实这也是困扰我一段时间的问题vcs_info
。