2013-04-17 32 views
5

Tôi muốn kết hợp một cvs và một kho lưu trữ svn vào một repo git mới, mà không mất lịch sử của khóa học. Bắt là repo svn là một sự tiếp nối trực tiếp của repo cvs theo lịch sử. Ai đó vừa tạo ra repo svn và clumsily thêm trạng thái cuối cùng từ cvs mà không giữ bất kỳ lịch sử nào. Các nguồn gần đây nhất là trong svn. Tôi không muốn giữ bản repo cũ.Hợp nhất hai lịch sử kho lưu trữ git

Lịch sử trong đồ họa:

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

Những gì tôi muốn:

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

tôi đã thực hiện một repo git từ cvs với cvs2git, và một git repo từ svn với git svn clone như được nêu trong http://john.albin.net/git/convert-subversion-to-git nhưng không thể tìm ra cách kết hợp cả hai. Tôi đã làm điều này:

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

Bây giờ những gì? git merge -s ours svn/master dường như làm những gì tôi muốn nhưng không tạo ra một lịch sử tuyến tính:

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

Bất kỳ thí nghiệm với git rebase không làm cho tôi bất cứ nơi nào.

Trả lời

5

Sử dụng .git/info/grafts để kết nối lịch sử và sau đó git filter-branch để đặt giá trị vĩnh viễn. Có một số mô tả như thế nào ai đó thực hiện nó: http://bugsquash.blogspot.co.uk/2010/03/stitching-git-histories.html

+0

Cảm ơn rất nhiều, điều đó đã xảy ra. Tôi sẽ không bao giờ tìm thấy điều này bản thân mình. Tôi sẽ đăng một câu trả lời như thế nào tôi cuối cùng đã làm nó. –

+0

@MichaelLemke Có ... 'rebase' là một cá trích đỏ - nó hoạt động với những khác biệt, và áp dụng lại các thay đổi, trong khi ghép cho phép thao tác trực tiếp đồ thị lịch sử. – kan

+0

Thực ra, tôi chưa bao giờ bắt gặp những mảnh ghép trước đây (với git đó). –

2

Sử dụng những gì kan viết tôi đã đưa ra giải pháp này:

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

Sử dụng git log --all để tìm lịch sử chưa được nối:

... 
| 
* 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] 
| 
... 

Tìm toàn bộ SHA1:

git show 1985b93 
git show 12e0ed4 

Tạo ghép:

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

Bây giờ lịch sử được kết nối nhưng chưa vĩnh viễn:

| 
* 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] 
| 

Làm cho nó vĩnh viễn như trong http://bugsquash.blogspot.co.uk/2010/03/stitching-git-histories.html:

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

Điều này tạo ra các cam kết mới mà còn để lại các cam kết svn gốc. git log --all sẽ hiển thị nó:

* 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] 
| 

Tháo ghép, lịch sử trùng lặp sẽ được đi:

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

Dọn dẹp:

git reset --hard svnmaster 
git branch -D svnmaster 

Và đẩy:

git push 

Tất cả đã được làm xong!

Các vấn đề liên quan