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