2017-05-31 168 views
0

我需要重寫一些修改的歷史,以「黑客」的一些分支機構同步傳送用git-svn的(我的意思是修訂這裏...不想改寫分支機構的全部歷史) 。如果我們拿出混帳svn的細節,我要做的就是基本上重新建立一個分支重新定義父母的一段歷史上的修訂(只有父母被修改,沒有別的)。如何「輕鬆」修改父母的修改?

爲了讓您更清楚地瞭解我打算做的事情:我想刪除許多分支的修訂,並將用我將手動創建的單個修訂(使用commit-tree)替換它們。 ..我將使用最新版本的樹,我將從分支中刪除)。然後,我將重新創建放在我刪除的修訂版的「頂部」的修訂版。鑑於我正在取代歷史上的修訂版,我可以「修改」修改其父母的子修訂版,以使用「重寫」過程本身產生的新修訂版(將它看作是櫻桃選擇或重新命名操作。 ....只是我不想做櫻桃挑選或rebase,因爲我已經從我原來修改過的樹中嘗試重寫了,對不對?)。

它看起來像git 提交樹將是我可以用來完成這項工作的工具(我可以使用修改的樹對象我想重寫,然後我會設置父母的修訂......嗯,幾百個修訂)然而細節,如信息,作者,提交者並不那麼簡單與承諾樹來定義(必須使用環境變量,可以從標準輸入中讀取消息)。如果不是使用commit-tree,最簡單的方法是什麼?

+0

'GIT中replace'具有'--edit'模式,基本上是圍繞做'git的承諾-tree'的包裝,隨後當然由寫'參/更換/'參考。這似乎是要走的路。 – torek

+0

不能腳本,所以它不會持有水(需要這樣做數百次)。現在我想知道我能做什麼是通過使用''''git hash-object'''來創建對象,通過使用我想要「重寫」的對象,然後修改它的父項以匹配我需要的。 – eftshift0

+0

啊,好吧,如果你想在腳本代碼中這樣做,'git-sh-setup'中有'git filter-branch'用於將所有提交信息提取到魔術env變量中的代碼。請參閱,例如'get_author_ident_from_commit'和過濾器分支腳本,'set_ident'和'finish_ident'。 – torek

回答

0

追問我原來的問題。還記得第一個是什麼嗎?我想重寫一個SVN分支的歷史(改本地。在svn的分支不會被觸及),這樣我可以創建一個沒有關係的分支「真正合並」,而不是一系列的修訂正在合併。

我結束了創建一個基於git的承諾樹的解決方案。我已經將它發佈在githug上,以防有人試圖達到同樣的效果。

https://github.com/eantoranz/git_svn_rewrite/blob/master/blend-git.txt

乾杯!