2012-09-18 28 views
44

如果一個人試圖從比存儲庫的根目錄之外的任何地方運行任何混帳對開的命令,一個是說:爲什麼git-bisect必須從工作樹的頂層目錄運行?

你需要從工作樹的頂層運行此命令。

這是爲什麼?我知道沒有其他的git命令有這個要求,我也沒有看到明顯的原因,對分應該是特殊的。手冊頁也沒有提到這個限制。

這真的沒什麼大不了的。我大多隻是好奇。

+0

我認爲這是要清楚,你的整個工作副本將在對分 – CharlesB

+2

期間進行修改,並避免邊緣情況下,如果你在一個目錄被刪除,該怎麼做。然後,git不會跟蹤目錄... – Arafangion

+1

@CharlesB,Arafangion,這兩點對於git-checkout同樣適用於git-bisect,不是嗎? –

回答

48

綜觀項目作了一次提交,我看到一個由Marcel M.凱里([email protected]

他說,在提交(它正好是大約GIT-拉,但我認爲它是相關的)

「git pull」失敗,因爲POSIX shell具有當前工作的概念 與getcwd()不同的目錄。該shell將此路徑 存儲在PWD中。因此,在cd程序中,「cd ../」可以在shell腳本中以不同於chdir(「../」)的方式解釋爲 。通過基本剝離 PWD中的最後一個文本路徑組件,Shell將解釋 「../」,而C chdir()遵循文件系統上當前目錄 中的「..」鏈接。當PWD是符號鏈接時,這些是不同的 目的地。因此,Git的C命令找到了正確的頂層工作樹 ,而shell腳本沒有找到。

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

所以我說,部分原因是因爲混帳平分線是一個shell腳本不能被信任找到自己的頂層(當符號鏈接參與)。

+2

我希望有更好的理由,但那不是你的錯。非常感謝你做了一些研究。 –

+1

是啊有點令人失望。繼續深入代碼;它顯着(有時候是幽默)很好的評論,並且提交信息非常好。 – willoller

6

平分過程需要檢查項目的不同修訂版。如果特定修訂版本不包含當前文件夾,則當前文件夾將被刪除。

在這種情況下,您的shell最終可能會坐在不再位於文件系統中的文件夾中!然後Git將無法找到頂層的.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

相關問題