2016-12-06 47 views
0

我在用作中央存儲庫的服務器上有一個裸露的git存儲庫。我已經安裝了後收到鉤,這樣,當提交被推到這個倉庫,在提交的更改使用以下命令部署到工作目錄在同一臺服務器上:執行git針對裸存儲庫提交的合法性

git --git-dir=path-to-repository --work-tree=path-to-working-directory checkout -f 

我意識到,通過設置GIT_DIRGIT_WORK_TREE環境變量在post-receive hook中,我也可以從命令行發出任意的Git命令。我並不是建議修改文件並從這個工作目錄提交更改是一種很好的開發實踐,特別是如果這是我的生產環境,但我是否從Git的角度來做任何事情非法

回答

0

......但我從Git的角度來做任何違法的事情嗎?

不是。然而,重要的是要認識到這個稍微奇怪的狀態的一些事情。

  1. Git只有一個存儲庫,--git-dir告訴它在哪裏找到這個存儲庫。

  2. Git有隻有一個工作樹,和--work-tree告訴它在哪裏可以找到一個工作樹(和覆蓋core.bare設置)。

  3. Git只有一個HEAD(但看腳註1),而--git-dir告訴它在哪裏可以找到那個HEAD文件。

  4. Git只有一個索引,和... --git-dir告訴它在哪裏可以找到一個索引,如果沒有被環境變量設置覆蓋。

這一趟的人了,使用主要是當post-receive腳本部署一些特殊的分支,這些最後一位。

如果您只將一個分支部署到一個工作樹,那麼這個索引不是問題。如果您開始將兩個或更多分支部署到兩個工作樹,則一個索引成爲問題。

同樣,單個HEAD文件通常不是問題,尤其是當您以常規方式創建裸倉庫時僅部署分支master,其中master作爲其當前分支。 (一個裸存儲庫仍然有一個當前分支,這是HEAD文件中的一個。)當人們克隆裸倉庫時,他們的克隆默認檢查裸存儲庫中當前哪個分支是最新的 - 所以如果你開始部署幾個不同的分支,人們可以從其存儲庫QAtestdevelop或其他什麼,而不是master開始的克隆感到驚訝。

HEAD這個事情只是要求人們意識到他們的默認克隆分支可能會讓他們感到驚訝,並且他們應該檢查開發分支,如果這是他們想要的,那是單個索引文件造成真正的麻煩,所以請參閱腳註1。)


如果使用git worktree add,在Git的2.5及更高版本,這不再是真實的。額外的工作樹當然提供他們自己的工作樹,但也提供他們自己的單獨HEAD,也是他們自己的索引。

可以提供使用環境變量GIT_INDEX_FILE,它總是覆蓋Git的正常計算自己的指數。這也提供了一種方法來執行多個分支部署:讓一個分支使用默認索引,併爲其餘索引文件(每個分配一個)。

對於push.denyCurrentBranch,使用多個工作區和新的updateInstead模式可能是自動化部署的更好方法,但我沒有真正測試過。

最近的Git版本引入了一個「分割索引」,其中非常大的索引文件被「分割」爲不會變化很大的部分,以及爲了做出努力而做的部分Git更快。該指數分裂略魔術(雖然明顯的確定性和可預測到底),並且知道如何處理備用索引文件,這樣你就不會真的需要知道這事,但它使「一個索引文件」要求一有點懷疑。在任何情況下,增加從git worktree add worktrees仍然獲得自己的索引文件(或索引對),因爲這是必要的。