簡體   English   中英

合並兩個git存儲庫歷史記錄

[英]Merge two git repository histories

我想將cvs和svn存儲庫組合成一個新的git倉庫,當然不會丟失歷史記錄。 捕獲的是svn repo是歷史上cvs repo的直接延續。 有人剛剛創建了svn repo並且笨拙地從cvs添加了最后一個狀態而沒有保留任何歷史記錄。 最近的消息來源是svn。 我不想保留舊的回購。

圖形歷史:

CVS: A - B - C
SVN: D - E - F - G

我想要的是:

GIT: A - B - C - D - E - F - G

我使用cvs2git從cvs制作了一個git repo,並使用git svn clone從svn制作了另一個git repo,如http://john.albin.net/git/convert-subversion-to-git中所述,但是無法弄清楚如何將兩者結合起來。 我這樣做了:

git clone cvs.git
cd cvs
git remote add svn ../../svn.git
git fetch svn

怎么辦? git merge -s ours svn/master似乎做我想要的但不創建線性歷史記錄:

A - B - C - - - H'
               /
D - E - F - G /

任何使用git rebase實驗都沒有讓我感到滿意。

使用.git/info/grafts連接歷史記錄,然后使用git filter-branch使其永久化。 有一些描述如何有人這樣做: http//bugsquash.blogspot.co.uk/2010/03/stitching-git-histories.html

使用kan寫的東西,我提出了這個解決方案:

git clone cvs.git
cd cvs
git remote add svn ../../svn.git
git fetch svn

使用git log --all查找未連接的歷史記錄:

...
|
* ab42f52 2011-09-14 06:03:07 +0000 |  [svnuser]
|
* 1985b93 2011-09-14 06:00:00 +0000 | Migration from CVS [svnuser]

* 12e0ed4 2011-09-14 05:58:10 +0000 | *** empty log message *** (HEAD, origin/master, origin/HEAD, master) [cvsuser]
|
* 5060a7f 2011-04-18 14:07:03 +0000 | *** empty log message *** [cvsuser]
|
...

找到完整的SHA1:

git show 1985b93
git show 12e0ed4

創建移植物:

echo 1985b9305ebc819e760f7ecf8e2abe7963eac055 12e0ed4c3dd75cec396a2d228825702eab73ba19 > .git/info/grafts

現在這些歷史是連通的,但尚未永久化:

|
* ab42f52 2011-09-14 06:03:07 +0000 |  [svnuser]
|
* 1985b93 2011-09-14 06:00:00 +0000 | Migration from CVS (grafted) [svnuser]
|
* 12e0ed4 2011-09-14 05:58:10 +0000 | *** empty log message *** (HEAD, origin/master, origin/HEAD, master) [cvsuser]
|
* 5060a7f 2011-04-18 14:07:03 +0000 | *** empty log message *** [cvsuser]
|

http://bugsquash.blogspot.co.uk/2010/03/stitching-git-histories.html所示,使其永久化:

git branch svnmaster svn/master
git filter-branch -- 12e0ed4c3dd75cec396a2d228825702eab73ba19..svnmaster

這會創建新的提交,但也會保留原始的svn提交。 git log --all會顯示它:

* 849278b 2013-04-15 16:31:44 +0000 | Java 6 in Eclipse.  Deployed. (svnmaster) [svnuser]
|
...
|
* c33f7cc 2011-09-14 06:03:07 +0000 |  [svnuser]
|
* 7acb3ed 2011-09-14 06:00:00 +0000 | Migration from CVS [svnuser]
|
| * b3d5413 2013-04-15 16:31:44 +0000 | Java 6 in Eclipse.  Deployed. (svn/master, refs/original/refs/heads/svnmaster) [svnuser]
| |
...
| |
| * ab42f52 2011-09-14 06:03:07 +0000 |  [svnuser]
| |
| * 1985b93 2011-09-14 06:00:00 +0000 | Migration from CVS (grafted) [svnuser]
|/
|
* 12e0ed4 2011-09-14 05:58:10 +0000 | *** empty log message *** (HEAD, origin/master, origin/HEAD, master) [cvsuser]
|
* 5060a7f 2011-04-18 14:07:03 +0000 | *** empty log message *** [cvsuser]
|

移除移植物,重復的歷史記錄將消失:

rm -r .git/info/grafts .git/refs/original

清理:

git reset --hard svnmaster
git branch -D svnmaster

並推:

git push

全部完成!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM