2016-05-17 23 views
1

爲什麼git允許你提交分離頭?有沒有可以禁用它的預提交鉤子?什麼目的?許多新開發人員這樣做,我想找到一種方法來禁用它。如何防止分離頭中的提交

回答

3

這隻能由本地git pre-commit掛鉤阻止,因此開發人員需要創建它。添加your-local-project/.git/hooks/pre-commit文件,內容如下:

#!/bin/sh 

if ! git symbolic-ref HEAD &> /dev/null; then 
    echo "You are in a detached head state! Commit has been blocked. (Use --no-verify to bypass this check.)" 
    exit 1 
fi 

確保它是可執行文件。 Credits go to svachalek

爲什麼git應該阻止分離HEAD中的提交?分離HEAD意味着只有沒有指向您正在處理的存儲庫狀態的指針。它假定你知道你在做什麼。

我寧願調查爲什麼很多開發者在你的團隊中進入這個狀態?也許他們應用了一些奇怪的工作流程?

+1

雖然這會阻止提交分離的頭部,但它也會干擾(交互式)rebase操作。在內部,rebase使用分離的頭來重放提交。 – ad22

+1

允許rebases需要[檢測它們]在鉤子中(http://stackoverflow.com/questions/3921409/how-to-know-if-there-is-a-git-rebase-in-progress)。但是,我很難想象一個開發人員會進行交互式重新分配,並且害怕同時承諾分離的HEAD。 – fracz

1

git checkout $commit-sha1可能會導致分離的HEAD。 git checkout FETCH_HEAD也是如此。分離的HEAD可以被視爲沒有名字的分支。如果它不會讓你感到困惑,你可以忽略它。正如@fracz所說,你可以通過pre-commit來阻止它。你也可以用git checkout -b some_name作爲它的名字。 A post-checkout掛鉤可以幫助您檢測分離的HEAD狀態並使其成爲分支。

+0

+1在'post-checkout'鉤子中創建分支的想法。但是,它將不得不創建隨機名稱的分支,這反過來會隨着時間的推移而產生大量混亂。 – fracz

+0

@fracz是的,隨機分支名稱確實是一個問題。我們可以用一些邏輯來找到一個合適的名字,但相比之下它仍然有點麻煩。所以只要忽略它或找到根本原因並提前阻止它。據我所知,沒有'repo start'的'repo sync'如果使用Repo也會導致分離的HEAD狀態。 – ElpieKay

+0

在'post-commit'鉤子中創建分支將避免在用戶實際上不想提交任何內容時創建分支。見https://gist.github.com/ben-cohen/316f89c763e9d8a027335261a44c4954 –

0

Git在內部使用它來執行許多操作。分離的HEAD模式簡單地讓你進入(單一,特殊)匿名分支,並且匿名分支可以稍後被賦予一個名字。

例如,這是git rebase如何設法將提交從原始鏈複製到新鏈。首先使用這種分離的HEAD模式檢出--onto目標提交(--onto默認爲<upstream>)。然後,對於每個要複製的提交,它會複製該提交(使用git cherry-pick或其他類似的內容:具體取決於交互式與非交互式底圖,以及交互式更多細節)。最後,它移動現有的分支標籤,使其指向最終的複製提交。