2013-03-02 125 views
2

當我第一次進入VC時,我使用SVN並且不理解我在做什麼。我在單獨的中繼上維護了一個項目的不同部分,但會一次提交所有中繼,導致多次提交相同的提交消息。大約兩年前,我醒來時把所有的樹幹都sm成了一根樹幹,然後再次醒來,並將回購變爲git。現在我有一個快速,靈活的回購與少數分支機構,我不能更高興...重寫歷史記錄以刪除重複的提交消息

...除了所有這些舊的,重複提交消息正在竊聽我。 (在我的回購中,它們構成了約1/3-1/2的提交)。這正是git rebase的目的,對吧?我嘗試了一批重複測試,除了它看起來像是將我的master分支與其他所有分支分開之外,它的工作原理。我用git rebase -i <sha>做到了這一點,並將所有重複提交壓縮到第一個。我想保持我的分支結構完好無損。

所有我想壓扁的重複郵件都出現在我進行svn=>git轉換之前,並且所有分支都在轉換後啓動。也就是說在svn=>git轉換之前的整個歷史記錄是線性的,沒有分支。

另一個警告 - 這是一個很大的 - 是這個回購已被推到遠程回購。我知道爲共享回購重寫歷史記錄是個壞消息,但我只是在考慮它,因爲還沒有人從我的遠程設備克隆或分支。我希望在將其提供給克隆/分叉之前清理歷史記錄。

那麼有沒有一種方法可以將歷史記錄重寫爲某一點,並保持其餘的不變?任何其他的建議,以幫助我清理這個爛攤子?

回答

3

您可以使用rebase將兩個舊提交壓縮爲一個,但這會導致全新的提交。因此,rebase必須更改所有childs(提交後直接提交)以指向新提交,這將再次導致全新的提交。 - 等等......

修改/重新綁定舊提交會因此導致一個全新的提交圖。其他分支仍然指向舊圖。這就是爲什麼你將你的分支與其他所有分支分開的原因。

根據提交分支的複雜性,清理起來非常棘手。 很可能你應該直接離開你的存儲庫。

如果你真的想改變歷史。你應該創建一個新的分支,指向你最後一次SVN提交,它應該是你所有分支的父代。 git tag oldsvn $SHA1; git checkout -b newsvn oldsvn

您現在可以清理該分支,然後重新綁定該分支上的所有其他分支。 (這是rebase的真正想法,給一個分支新的基地。) 您可以使用git rebase --onto newsvn oldsvn $branch

由於您可能正在重寫具有共同歷史記錄的多個分支,您可能會再次爲您的分支獲得不同的樹。看看Git: How to rebase many branches (with the same base commit) at once?

+0

Ewww。看起來,單獨留下足夠的空間是去這裏的方式。謝謝。 – Clayton 2013-03-14 20:44:21