检查目录是不是为 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/nullexit_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_DIRGIT_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 进入)的主要内容,如果未能解决你的问题,请参考以下文章

git的使用

JGit:我可以在不检查的情况下找出某个特定标签是不是存在于 Git 存储库中吗?

Git push - 似乎不是 git 存储库(ssh 指向错误的目录)

如何一次检查所有 git 存储库的状态?

提交后将 git 存储库和工作目录复制到另一个位置,在检查状态时给出“未暂存的更改”

GIT 命令