检查目录是不是为 git 存储库(无需 cd 进入)
Posted
技术标签:
【中文标题】检查目录是不是为 git 存储库(无需 cd 进入)【英文标题】:Check if directory is git repository (without having to cd into it)检查目录是否为 git 存储库(无需 cd 进入) 【发布时间】:2017-01-23 21:27:20 【问题描述】:我可以使用什么 shell 命令使用完整的目录路径来确定给定目录是否是 git 存储库?具体来说,我希望能够做到这一点,而不必在目录中,也不必 cd 进入它。我还希望能够使用返回简单“true”或“false”的命令来执行此操作(就像 rev-parse --is-inside-work-tree 所做的那样),但这不是必需的.
【问题讨论】:
test -d "$path/.git"
还有[[ -d "$PATH/.git" ]] && <other commands>
你可以 grep 获取 .git 文件夹吗?或者你可以 cd 进入它然后检查然后 cd 回到当前工作目录?
@Siguza 我认为这是一种解决方案,但是如果该目录实际上不是一个 git 存储库,而只是包含一个名为 .git 的目录呢? (例如 .git 不包含 ORIG_HEAD、FETCH_HEAD 等)
@Ataraxia 然后我会考虑一个 broken git 存储库......但这是一个见仁见智的问题。如果您只想要完整/“有效”的 git 存储库,除了 .git
检查之外,您最好测试 git
命令的错误代码。
【参考方案1】:
使用git -C <path> rev-parse
。如果<path>
的目录是 git 存储库,它将返回 0,否则返回错误代码。
进一步阅读:
rev-parse
-C <path>
【讨论】:
注意:对于 git 存储库的任何子目录,这也将返回 0。 太棒了!谢谢!!git -C <path> rev-parse 2>/dev/null
用于更简洁的脚本集成
补充答案和cmets:git -C $REPO_DIR rev-parse 2>/dev/null
exit_code=$(echo $?)
if [ "$exit_code" -ne 0 ] ; then echo "$REPO_DIR is not a git repository" fi
@JBSnorro 我讨厌 bash,但我想知道,你能不能也简单地写 if [ "$?" -ne 0 ] ;
?【参考方案2】:
我们也可以试试git status
命令,如果输出是这样的:
fatal: Not a git repository (or any of the parent directories): .git
那么,这个目录就不是git仓库了。
【讨论】:
【参考方案3】:系统中的任何目录都可以是 git 工作副本。您可以通过将GIT_DIR
和GIT_WORK_TREE
环境变量设置为指向实际的.git
目录和工作副本的根目录来使用目录,就好像它包含.git
子目录一样,或者使用--git-dir
和--work-tree
选项。有关详细信息,请参阅git man page。
【讨论】:
【参考方案4】:添加到@Walk 的 cmets,
git status
如果不是 repo,将抛出致命消息。
echo $?
将有助于捕获其错误与否。
如果它是一个 git repo,那么 echo $?
将是 0 否则 128 将是值
【讨论】:
以上是关于检查目录是不是为 git 存储库(无需 cd 进入)的主要内容,如果未能解决你的问题,请参考以下文章
JGit:我可以在不检查的情况下找出某个特定标签是不是存在于 Git 存储库中吗?
Git push - 似乎不是 git 存储库(ssh 指向错误的目录)