2014-01-13 28 views
5

我正在爲一些同事編寫一個腳本供他們的Git存儲庫使用,我對如何可靠地找到回購協議工作樹的根目錄感到困惑:有沒有辦法找到一個Git倉庫的工作樹,因爲它的.git目錄?

通常,如果當前目錄位於工作樹,命令...

git rev-parse --git-dir 
git rev-parse --show-toplevel 

...將返回.git目錄和工作樹的根部,分別。但是,如果當前目錄恰好是裏面的 a .git目錄,那麼只有第一個命令有效。命令git rev-parse --show-toplevel不顯示工作樹的頂層(至少,不適合我,在Linux上使用git 1.8.4.4)。

假設git rev-parse --is-bare-repository回報false,我通常會猜的git rev-parse --git-dir父目錄或者是工作目錄(或地方工作目錄內),但如果用戶的GIT_DIR設置了.git目錄不是裏面的工作目錄,這是行不通的。 (例如,當用戶正在與子模塊,其GIT_DIR可能不是他們的工作樹中。)

我感到困惑的是,當一個GIT_DIRgit rev-parse --show-toplevel打印沒有錯誤消息中運行並返回0:

​​

而某處運行相同的命令,這顯然不是一個Git倉庫返回錯誤代碼:

$ cd /; git rev-parse --show-toplevel ; echo $? 
fatal: Not a git repository (or any of the parent directories): .git 
128 

如果there'a辦法找到從GIT_DIR工作樹,可能有人TE讓我知道如何......或者如果根本無法從.git目錄中得出工作樹的位置,請幫我理解爲什麼,從哲學上講,.git目錄不保留對其工作樹的引用?

在此先感謝幫助/指針!

回答

4

爲什麼哲學上,.git目錄不保留對其工作樹的引用?

因爲你可以設置該工作樹上任何你想要的(與--work-tree選項或GIT_WORK_TREE環境變量),包括在一個地方(這是我們的目標)不包括.git文件夾。

git config man page確實提到:

的值可以是給路徑.git目錄,這由--git-dirGIT_DIR,或者自動發現指定的絕對路徑或相對的。
如果指定了--git-dirGIT_DIR,但沒有指定--work-tree,GIT_WORK_TREEcore.worktree,則將當前工作目錄視爲工作樹的頂層。

所以它更多的是基於工作樹的文件夾(爲了找到.git)公約,而不是相反(從.git文件夾推斷工作樹)。

這就是說,我列出了所有的命令,可以給你一個在「How to find the path of the local git repository when I am possibly in a subdirectory」工作樹文件夾的想法。

相關問題