为什么git-bisect必须从工作树的顶层目录运行?

如果有人试图从仓库根目录以外的任何地方运行任何git-bisect命令,就会被告知:

你需要从工作树的顶层运行这个命令。

这是为什么? 我知道没有其他的git命令有这个要求,我没有看到明显的原因,对分应该是特殊的。 手册页也没有提到这个限制。

这真的不是什么大不了的事。 我大多只是好奇。

看看这个项目的一些提交,我看到一个由Marcel M. Cary(marcel@oak.homeunix.org)

他说,在一个提交(这恰好是关于混帐,但我认为这是相关的)

“git pull”失败,因为POSIX shell有一个与getcwd()不同的当前工作目录的概念。 shell将这个path存储在PWD中。 因此,shell脚本中的“cd ../”可以被解释为与C程序中的chdir(“../”)不同。 shell通过从PWD中剥离最后一个文本path组件来解释“../”,而C chdir()则跟在文件系统当前目录中的“..”链接之后。 当PWD是符号链接时,这些是不同的目的地。 因此,Git的C命令find了正确的顶层工作树,而shell脚本没有find。

https://github.com/git/git/commit/08fc0608657ee91bc85276667804c36a93138c7d

所以我会说部分原因是因为git-bisect是一个shell脚本,它不能被信任地自己find顶层(当涉及到符号链接的时候)。

平分过程需要检查你的项目的不同版本。 如果特定的修订版本不包含当前文件夹,则当前文件夹将被删除。

在这种情况下,你的shell可能会坐在一个不再在文件系统上的文件夹中! 然后,Git将无法find顶层的.git文件夹,因此二等分进程无法继续进行干预。

示范:

 $ git rev-parse --show-toplevel /path/to/project $ mkdir tmp $ cd tmp $ rmdir ../tmp $ git rev-parse --show-toplevel fatal: Unable to read current working directory: No such file or directory 

当然,这个相同的问题可以发生在做git checkout ,并且可以很容易地在事后修复,比如用cd .. (willoller解释了为什么在shell中工作,而不是在git中)。

但是,因为平分是一个过程,所以在开始之前避免这种情况是有意义的,特别是如果我们想使用自动化,比如git bisect run