带有 --git-dir= 的 git 会导致“不是 git 存储库”

Posted

技术标签:

【中文标题】带有 --git-dir= 的 git 会导致“不是 git 存储库”【英文标题】:git with --git-dir= results in 'not a git repository' 【发布时间】:2012-10-04 01:24:42 【问题描述】:

我的一个 ios 应用程序中有一个脚本,它应该获取 git 修订哈希并将其放入版本号。在这个脚本中,我为此运行 git --git-dir="$PROJECT_DIR" show -s --pretty=format:%h 。但是,我收到该目录不是 git 存储库的消息。如果我回显 PROJECT_DIR 变量并转到终端,则以下工作:

cd projectDirPath
git show -s --pretty=format:%h

什么不起作用:

git --git-dir=projectDirPath show -s --pretty=format:%h

我错过了什么吗?文档指出,我可以使用 --git-dir 指定 git 存储库的路径,并且指定的路径显然是一个 git 存储库,因为如果我首先 cd 进入该路径,所有 git 命令都可以正常工作。但是,如果我不在此路径中,则指定 --git-dir 不起作用。

【问题讨论】:

--git-dir 需要指向存储库的 .git 文件夹。试试git --git-dir=projectDirPath/.git show -s --pretty=format:%h 谢谢,这就是问题所在。您可能想将此作为答案发布,以便我将其标记为问题的答案! 太棒了!我也将此作为答案发布。 【参考方案1】:

使用--git-dir 时,您需要指向存储库的.git 文件夹。试试:

git --git-dir=projectDirPath/.git show -s --pretty=format:%h

--git-dir 上的文档说:

--git-dir=

设置存储库的路径(“.git”目录)。这也可以通过设置 GIT_DIR 环境变量来控制。它可以是当前工作目录的绝对路径或相对路径。

我曾经在自己记住这一点时遇到问题。为了帮助我记住要做什么,我尽量记住该选项要求的正是它想要的:.git 目录 (git-dir) 的路径。

【讨论】:

澄清一下:projectDirPath 应该是绝对(而非相对)路径。 @BryanJyhHerngChong 实际上,这是不正确的。 git 手册页说“它可以是当前工作目录的绝对路径或相对路径。” @BryanJyhHerngChong 这不是真的。我在答案中添加了相关文档。路径可以是相对路径。【参考方案2】:

您正在寻找git -C command line option。

-C <path>

运行就像启动 git 而不是当前的 工作目录。当给出多个-C 选项时,每个 随后的非绝对 -C <path> 被解释为相对于 在-C <path> 之前。如果<path> 存在但为空,例如-C "", 那么当前工作目录保持不变。

此选项会影响需要路径名称的选项,例如 --git-dir--work-tree 他们对路径名的解释 将相对于由-C 引起的工作目录 选项。例如以下调用是等价的:

git --git-dir=a.git --work-tree=b -C c status
git --git-dir=c/a.git --work-tree=c/b status

【讨论】:

【参考方案3】:

除了--git-dir,设置--work-tree 也可能有帮助。对于脚本,最好使用相关环境(更简单),例如

#!/bin/bash -ex
export GIT_WORK_TREE=/path/to/repo
export GIT_DIR=/path/to/repo/.git
git show -s --pretty=format:%h

【讨论】:

以上是关于带有 --git-dir= 的 git 会导致“不是 git 存储库”的主要内容,如果未能解决你的问题,请参考以下文章

在 git hook 中操作 repo 时 -C 和 --git-dir 之间的区别

从脚本执行git提交

git指定迁出目录

saltstack+git+rsync发布代码

拾遗:Git 与 Svn hook 不执行问题

将 git 存储库移动到 nfs 会导致权限错误