Version control zsh:查找当前目录的VCS

Version control zsh:查找当前目录的VCS,version-control,zsh,Version Control,Zsh,我想创建一个zsh小部件,用一个按钮执行版本控制系统的常见任务。例如,如果当前目录是Subversion签出的一部分,则按F1键应调用“svn状态”。如果它位于git存储库中,它应该调用“git status-s” 现在,创建小部件并不是什么大事。但是如何确定当前目录中有哪些VCS 我知道有关vcs\U信息的。但是我找不到任何方法来检索它提供的最基本的信息。有什么想法吗?测试特定元数据目录的存在性怎么样 if test -d CVS; then # CVS elif test -d

我想创建一个zsh小部件,用一个按钮执行版本控制系统的常见任务。例如,如果当前目录是Subversion签出的一部分,则按F1键应调用“svn状态”。如果它位于git存储库中,它应该调用“git status-s”

现在,创建小部件并不是什么大事。但是如何确定当前目录中有哪些VCS


我知道有关vcs\U信息的
。但是我找不到任何方法来检索它提供的最基本的信息。有什么想法吗?

测试特定元数据目录的存在性怎么样

 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’ish改进的建议:-)


我还使用
svn info
git rev parse
实现了Thomas的建议。但是我注意到了一个问题:如果我在GIT工作副本中的某个地方签出了一个SVN工作副本(是的,这有时是必要的),或者反之亦然,我只会找到我正在检查的第一个。通过上面的解决方案,我找到了“最内在的”,这就是我想要的。事实上,这个问题也困扰了我一段时间。

Hm,我不确定它是否那么简单。在git中,.git目录只在根文件夹中,而不在任何子目录中(我听说在SVN的较新版本中也是如此)。我会搜索所有的父目录。当然,这也没什么大不了的,但我希望
vcs\u info
能为这提供一个函数或变量(我找不到)。啊,好吧,我想我就用你的解决方案(以及提到的改进)。谢谢(如果在不久的将来没有更好的答案,我会接受你的答案)
svn info
在子目录中工作(它搜索
.svn
目录)
git
同样灵活。如果修改脚本以测试各个工具的无错误输出,它将执行OP要求的操作。@George如果元数据目录仅出现在项目根目录中,则您将递归调用该目录,直到到达
/
,此时您知道没有VCS或未知VCS。