检查目录是否为 Git 仓库(无需进入该目录)

32
有没有一个可以使用完整目录路径来确定给定目录是否为git仓库的shell命令?具体来说,我想在不进入目录的情况下进行此操作,并且不需要使用cd命令。我还希望能够使用一个返回简单的"true"或"false"的命令(就像rev-parse --is-inside-work-tree一样),但这不是必需的。

3
检测路径下是否存在名为.git的目录。 - Siguza
2
并且 [[ -d "$PATH/.git" ]] && <其他命令> - hjpotter92
你可以使用grep命令寻找.git文件夹吗?或者你可以用cd命令进入该文件夹,然后进行检查,再返回到当前工作目录。 - J0B
@Siguza 我考虑过那个解决方案,但如果目录实际上不是 Git 存储库,而只是包含名为 .git 的目录呢?(例如 .git 不包含 ORIG_HEAD、FETCH_HEAD 等)。 - rurouniwallace
1
@Ataraxia 那我认为这是一个“损坏”的git仓库...但这只是个人观点。如果你只想要完好/“有效”的git仓库,最好在.git检查之外测试git命令的错误代码。 - Siguza
当然,仍然可能存在一种奇怪的情况,即a是一个git存储库,a/b/.git存在,并且测试a/b是否为git存储库将返回true。但是,您可以通过首先检查父目录来减轻此情况。 - Siguza
6个回答

52

使用 git -C <path> rev-parse 命令。如果 <path> 目录是一个Git仓库,它将返回0,否则会返回一个错误代码。

进一步阅读:


12
注意:这也会对 Git 仓库的任何子目录返回 0。 - Siguza
1
太棒了!谢谢你!! - rurouniwallace
3
为了更方便地整合脚本,使用git -C <path> rev-parse 2>/dev/null命令。该命令可使脚本更简洁易读,并返回解析路径下的Git版本信息。 - daparic
2
为了补充答案和评论: git -C $REPO_DIR rev-parse 2>/dev/null exit_code=$(echo $?) if [ "$exit_code" -ne 0 ] ; then echo "$REPO_DIR 不是一个 git 仓库" fi - JBSnorro
@JBSnorro我很讨厌bash,但我想知道,你难道不能只写if [ "$?" -ne 0 ] ;吗? - ypnos
显示剩余3条评论

6

我们还可以尝试使用 git status 命令,如果输出如下:

fatal: Not a git repository (or any of the parent directories): .git

那么该目录不是一个Git仓库。


3
系统中的任何目录都可以是git工作副本。您可以通过设置GIT_DIR和GIT_WORK_TREE环境变量指向实际的.git目录和工作副本的根目录,或者使用--git-dir和--work-tree选项来使用目录,就像它包含一个.git子目录一样。有关更多详细信息,请参见git man page

1

补充@Walk的评论,如果不是一个仓库,git status会抛出致命错误信息。echo $?将有助于捕获其是否为ERROR。如果它是一个git仓库,那么echo $?将为0,否则值为128。


1
考虑在此处使用git rev-parse --is-inside-work-tree(如果需要,也可以使用适当的-C)来检查这是否是一个“工作树”。这可以让您区分“工作树”和“裸仓库”两种情况:
$ git -C .git rev-parse && echo $?
0
$ git -C .git rev-parse --is-inside-work-tree && echo $?
false
0

一如既往地,要注意如果您完全不在Git目录中,则会出现错误:

$  git -C / rev-parse --is-inside-work-tree
fatal: not a git repository (or any of the parent directories): .git

你可能想要丢弃的内容(git ... 2>/dev/null)。由于--is-inside-work-tree会打印truefalse,所以你需要捕获或测试stdout。


0
在Unix/Linux系统中,您可以运行git status并检查退出代码echo $?。除了0以外的任何内容都会告诉您不在git存储库中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接