2017-08-07 308 views
2

我們團隊使用的自定義Git工具會爲每個正在處理的新功能/錯誤創建一個分支。刪除分支 - >安全地編輯.git/refs/heads文件?

通常情況下,當更改接近完成時,遠程分支將通過另一個工具進行更改,從而使分支的本地副本不同步。

經常出現的一個問題是如何清理所有留在開發人員本地存儲庫中的陳舊分支。因爲輸入很多git branch -D branchname可能會令人厭倦,當有幾十個這些陳舊的分支。

我一直給出的一些建議是從他們的.git/refs/heads文件夾中刪除文件。

這裏是我送出去的全文:

一個手工技巧,在批量快速刪除樹枝是從你的.git/refs/heads folder刪除 文件。你會看到 對應分支的文件名。一個分支只是一個指向sha的指針,它使得文件的內容變爲 ,因此刪除該文件將刪除該分支。 請注意,這將只有刪除指針,而不是指針碰巧指向的實際提交 。

這個建議似乎安全的,但我偏執地認爲存在一種情況,這種做法可能會失敗或導致工作丟失。

除了刪除master文件等明顯錯誤的用戶以外,這是否安全?

編輯:來自這個問題this question不同的,因爲由於我們的內部工具的性質,往往--merged如果本地分支是無效的或不將不足以確定。另外,我們不希望一舉刪除分支......需要爲每個分支手動檢查以避免刪除仍然活動的分支。

+1

根據我的理解,我不會因爲這樣做而失去工作。正如你所說,你只是刪除了頭像,但文件和提交仍然完好無損。最壞的情況,即使你刪除了一個重要的分支頭,你的reflog仍然應該在'.git/logs /'中完成。有可能是一個更好的,整潔/整潔的方法,不涉及手動刪除文件。 – Chris

+0

可能重複的[如何刪除所有已合併的git分支?](https://stackoverflow.com/questions/6127328/how-can-i-delete-all-git-branches-which-have-been -merged) – smarber

回答

2

一個缺陷是,如果引用都被「壓縮」在過去,各種分支機構名稱和相應的哈希ID將在.git/packed-refs而非或除了.git/refs/heads/之中。

如果在兩個地方都出現名稱,刪除分支名稱B.git/refs/heads/B只是顯示舊的打包引用。如果僅在.git/packed-refs中,則不會有單獨的文件要刪除。

這也留下了陳舊的reflogs。這可能暫時是一個功能(如the comment by Chris),但請注意,reflog從不包含@{0}值,僅包含@{1}及更高值。

我強烈懷疑Git的某些未來版本將完全放棄每文件一個分支名稱的技巧,因爲它在Windows和MacOS文件系統上做出了案例摺疊時發生的錯誤。使用git branch -Dgit update-ref -d(請注意,update-ref要求說明完整的參考名稱)顯​​然更好/更安全/更具前瞻性。

+0

關於reflog「@ {0}」值= D的有趣點 – Chris