......但我從Git的角度來做任何違法的事情嗎?
不是。然而,重要的是要認識到這個稍微奇怪的狀態的一些事情。
Git只有一個存儲庫,--git-dir
告訴它在哪裏找到這個存儲庫。
Git有隻有一個工作樹,和--work-tree
告訴它在哪裏可以找到一個工作樹(和覆蓋core.bare
設置)。
Git只有一個HEAD
(但看腳註1),而--git-dir
告訴它在哪裏可以找到那個HEAD文件。
Git只有一個索引,和... --git-dir
告訴它在哪裏可以找到一個索引,如果沒有被環境變量設置覆蓋。
這一趟的人了,使用主要是當post-receive
腳本部署一些特殊的分支,這些最後一位。
如果您只將一個分支部署到一個工作樹,那麼這個索引不是問題。如果您開始將兩個或更多分支部署到兩個工作樹,則一個索引成爲問題。
同樣,單個HEAD文件通常不是問題,尤其是當您以常規方式創建裸倉庫時僅部署分支master
,其中master
作爲其當前分支。 (一個裸存儲庫仍然有一個當前分支,這是HEAD
文件中的一個。)當人們克隆裸倉庫時,他們的克隆默認檢查裸存儲庫中當前哪個分支是最新的 - 所以如果你開始部署幾個不同的分支,人們可以從其存儲庫QA
或test
或develop
或其他什麼,而不是master
開始的克隆感到驚訝。
(HEAD
這個事情只是要求人們意識到他們的默認克隆分支可能會讓他們感到驚訝,並且他們應該檢查開發分支,如果這是他們想要的,那是單個索引文件造成真正的麻煩,所以請參閱腳註1。)
如果使用git worktree add
,在Git的2.5及更高版本,這不再是真實的。額外的工作樹當然提供他們自己的工作樹,但也提供他們自己的單獨HEAD
,也是他們自己的索引。
可以提供使用環境變量GIT_INDEX_FILE
,它總是覆蓋Git的正常計算自己的指數。這也提供了一種方法來執行多個分支部署:讓一個分支使用默認索引,併爲其餘索引文件(每個分配一個)。
對於push.denyCurrentBranch
,使用多個工作區和新的updateInstead
模式可能是自動化部署的更好方法,但我沒有真正測試過。
最近的Git版本引入了一個「分割索引」,其中非常大的索引文件被「分割」爲不會變化很大的部分,以及爲了做出努力而做的部分Git更快。該指數分裂略魔術(雖然明顯的確定性和可預測到底),並且知道如何處理備用索引文件,這樣你就不會真的需要知道這事,但它使「一個索引文件」要求一有點懷疑。在任何情況下,增加從git worktree add
worktrees仍然獲得自己的索引文件(或索引對),因爲這是必要的。