2010-11-15 269 views
1

過去我已經使用GitHub的導入功能來導入SVN倉庫。 版本庫現在與沒有任何SVN歷史連接的裸Git一樣。該提交不包括svn-id信息。如何合併svn倉庫與git克隆倉庫(通過github從SVN導入)

一段時間過去了,提交被添加到SVN倉庫,但正如預期的那樣,git倉庫保持不變。

所以,現在我想用添加到原始SVN的提交'更新'git倉庫。我試過git-svn,但我無法讓git識別克隆的svn和克隆的git之間的共同歷史。

我已經考慮過使用format-patch,我相信這個動作應該可以解決這個問題,但是我正在尋找一種更自動化的方式。

唯一的限制是應該維護git歷史記錄(沒有rebase'ing),並且提交與SVN存儲庫儘可能忠實(沒有svn-id添加到提交消息中)。

回答

1

正如你所猜測的,獲得提交「合併」的承諾並不真正在這裏工作。您將不得不使用format-patch。這裏是我會怎麼做:

$ git svn clone --no-metadata svn://.../ new-svn-repo 
$ cd new-svn-repo 
$ git log 

(您可能希望將-A選項添加到git svn clone[email protected]格式SVN作者信息改寫成正確的Joe User <[email protected]>作者信息,請參閱第man git-svn。)

查看日誌並找到與github存儲庫中最新提交對應的提交。如果是提交abcdef則:

$ git format-patch -k abcdef 

現在,您將有*.patch文件對應於你想將在新提交的整體轉換。所以...

$ cp *.patch /github/repository/location 
$ cd /github/repository/location 
$ git am -k --keep-cr *.patch 

田田!現在只需把主人推到Github上。

(如果你的Git是不足夠的新可能抱怨的--keep-cr參數git am。如果源文件不包含的CR則只是刪除--keep-cr,但如果他們這樣做,你可能需要自git mailsplit升級你的Git, (由git am調用)將在處理補丁文件時去除補丁文件中的所有CR,這可能會導致補丁無法應用。)

+0

我發現的唯一問題是,git-am將我的用戶添加爲「commiter 」。你有什麼想法如何防止這種情況?我檢查了git-am文檔,但找不到任何明確的內容。 – Unode 2010-11-16 19:28:21

+0

呃,應該,不應該嗎?你是提交給Git倉庫的人。如果你不喜歡,你可以使用'git-filter-branch'來重寫你導入的歷史記錄。 – cdhowie 2010-11-16 20:31:12