检查当前目录是否为Git存储库

我正在为zsh编写一系列用于Gitpipe理的脚本。

如何检查当前目录是否为Git存储库? (当我不在Git fatal: Not a git repository ,我不想执行一堆命令并得到一堆fatal: Not a git repository响应)。

从bash完成文件复制下面是一个天真的方式来做到这一点

 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org> # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/). # Distributed under the GNU General Public License, version 2.0. if [ -d .git ]; then echo .git; else git rev-parse --git-dir 2> /dev/null; fi; 

你可以把它包装在一个函数中,或者在脚本中使用它。

简化为适用于bash或zsh的单行条件

 [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 

您可以使用:

 git rev-parse --is-inside-work-tree 

如果你在一个git回购工作树中,它将打印“true”。

请注意,它仍然返回输出到STDERR,如果你不在一个GIT仓库(并不打印“假”)。

采取从这个答案: https : //stackoverflow.com/a/2044714/12983

使用git rev-parse –git-dir

如果git rev-parse --git-dir> / dev / null 2>&1; 然后
   :#这是一个有效的git存储库(但目前的工作
     #目录可能不是最高级别。
     #检查git rev-parse命令的输出,如果你在意的话)
其他
   :#这不是一个混帐存储库
科幻

或者你可以这样做:

 inside_git_repo="$(git rev-parse --is-inside-work-tree 2>/dev/null)" if [ "$inside_git_repo" ]; then echo "inside git repo" else echo "not in git repo" fi 

不知道是否有公共访问/logging的方式来做到这一点(有一些内部的gitfunction,你可以使用/滥用git源本身)

你可以做一些事情

 if ! git ls-files >& /dev/null; then echo "not in git" fi 

一个非常快速的select是http://vc.gerg.ca/hg/vcprompt/ ..多VC,在C中,没有依赖本身以外。

你有没有在zsh发行版中检查函数? 在zsh中查看关于vcs_info的这个博客条目 。

更新

似乎原来的链接被删除,作者改变了他的主要领域。 我检查谷歌,我认为目前链接的post有相同的内容,但我不知道肯定(很久以前,因为我检查原始链接)。

另一个解决scheme是检查命令的退出代码。

 git rev-parse 2> /dev/null; [ $? == 0 ] && echo 1 

这将打印1,如果你在一个混帐存储库文件夹。

这对我有用。 你仍然得到错误,但他们很容易压制。 它也从子文件夹内工作!

git status> / dev / null 2>&1 && echo Hello World!

如果你需要有条件地做更多的事,你可以把它放在if语句中。

您可以使用一个或另一个 git-prompt工具在您的zshrc中添加或replace您的$ PS1。 通过这种方式,您可以方便地了解您是否处于git回购和回购状态。

也可以看看:

 git rev-parse --is-inside-work-tree 

(通过阅读man git-rev-parse发现)