2009-09-14 31 views
3

欲一個Git倉庫(ģ)導出到SVN庫(小號)。 S已使用標準佈局(分支/標籤/主幹)初始化,並且G迄今已有發展歷史。我遵循Google Open Source Blog中的建議,詳細說明如何輸出GS的作品。基本上,博客建議GIT中 - svn的克隆小號到一個空的目錄,ģ到一個臨時。分支和rebase,以「掌握」,從而成爲第二個Git存儲庫(G')。前面加上一個單個提交到一個Git倉庫的根/出口GIT中顛覆

我既不想放棄不在源代碼管理下的文件,也不想在源文件中不可用的分支。這就是爲什麼我不想繼續使用G',而是G。有沒有辦法取回代表版式提交的新提交到S?我沒有成功嘗試合併G'G(當然沒有共同的祖先)。

+0

好問題,我試圖學習如何使用git加上與svn集成在同一時間很混亂。 – Jacob 2009-09-14 12:51:57

回答

3

你應該能夠合併G「使用git merge --strategy=ours,即忽略祖先,創造新的commit使用的G中的樹」但似乎兼得提交父母。結果會有點難看,因爲歷史記錄將包含每個提交的兩個副本,但您應該可以無縫地繼續工作於G

+0

我希望有更好的東西。遵循[1]完美保存歷史記錄 - 唯一需要添加的是git-svn需要識別的單個提交* S *。考慮到git工具包的豐富性,應該可以將其放在我的歷史記錄中。 – yawn 2009-09-16 09:55:08

+0

由於提交的標識取決於其父代的身份,所以嚴格來說,不可能進行預先配置。我能想到的唯一方法就是將其他分支重新分配到S. – legoscia 2009-09-16 13:36:16

+0

接受盡力而爲:-) – yawn 2009-09-23 19:07:18

2

我不確定是否有更簡單的方法來添加初始提交,但有一種相當簡單的方法可以讓SVN佈局從一開始就顯現出來。

您可以使用git filter-branch改寫歷史,讓每一個文件的SVN「主幹」目錄下存在,從第一次開始承諾:

git filter-branch --tree-filter 'mkdir trunk; git ls-files | xargs -I {} mv {} trunk' 

你可以同樣的文件移動到標籤和分支目錄,如果你想要,但你如何決定在那裏移動哪些文件將完全取決於分支是什麼,或者當你想要標籤添加到歷史中。

+0

非常有趣!我會在早上嘗試這個第一件事! – yawn 2009-09-22 20:11:17

+0

我沒有正確地閱讀你的答案 - 我真正在做的是代表git-svn的初始佈局的提交,而不是佈局本身。儘管如此,+1的過濾器分支。 – yawn 2009-09-23 19:06:45

+0

@yawn:爲什麼不創建SVN std。在一個新的(否則爲空)Git倉庫(讓我們稱之爲repo「T」)中進行佈局提交,然後將T的主倉庫提取到你的G倉庫中。然後在G中,將FETCH_HEAD分配給主倉庫? G中的任何其他分支都需要保留,並且已經從新的「初始」提交中下降,您也必須重新分配(對於每個分支,您必須找到與原始基礎相對應的新提交儘管)。 – 2009-09-24 01:57:38