git -C
和git --git-dir
之间有什么区别?
为什么--git-dir
不能与git grep
配合使用?
为什么git log --git-dir=$Path/.git
有时工作,git log --git-dir=$Path/
有时工作?
git -C <path>
使Git将其当前工作目录移动到给定的<path>
参数。这可能会影响两个搜索:
- Git应该在哪里找到存储库
- Git应该在哪里找到工作树
另一方面,--git-dir <path>
告诉Git在哪里找到存储库,而--work-tree <path>
告诉Git在哪里可以找到工作树。
当只使用-C
(而不设置环境变量GIT_DIR
)时,您会得到与更改自己的当前目录相同的效果:Git仍然会在当前目录中查找.git
。
使用 还有一个关键项:如果没有给出特定的存储库位置或工作树位置,则搜索是一种更通用的搜索。它从当前目录(可能由 然而,如果失败了,我们将转到: 失败:没有Git存储库。 但是只有在没有提供 某些命令(如--git-dir
或--work-tree
时,只影响一次搜索。如果该搜索是相对的(在正常系统上不是以/
开头,或在其他系统上不是驱动器号开头),则从当前工作目录开始,无论是什么。如果该搜索为绝对的-C
修改)开始,然后向上工作,查找.git
目录。例如,假设起点是/a/b/c/d/e
。Git将寻找:/a/b/c/d/e/.git
:如果存在,那就是存储库位置,工作树从这里开始。否则:/a/b/c/d/.git
:如果存在,那就是存储库位置,工作树从这里开始。由于您在该目录中的e/
中,因此可能有一些文件需要一个..
,例如../README.md
(如果顶层中有README.md
文件)。/a/b/c/.git
:如果存在,那就是存储库位置(请参见步骤2)。否则,请尝试:/a/b/.git
:如果存在,则为存储库位置;否则:/a/.git
:如果存在,那就是存储库位置;否则:/.git
:如果存在,那就是存储库位置;否则:--git-dir
的情况下才执行此搜索。如果给定--git-dir
,则存储库必须存在;如果不存在,Git就会失败。git log
)可以在没有工作树的情况下工作。(如果您使用这样的命令,您可以使用--git-dir
将其直接指向Git存储库,该存储库甚至不需要有工作树:它可能是--bare
存储库。)如果您使用-C
将当前工作目录设置在工作树中的某个位置,则该命令将使用"向上爬向CCD_ 38";上述搜索方法。
git -C foo --git-dir=bar
相当于git --git-dir=foo/bar
。
如果bar
是一个裸存储库,那么--git-dir=bar/
。
如果bar
是非裸存储库,则--git-dir=bar/.git
。