2013-04-17 28 views
5

Chcę połączyć repozytorium cvs i svn w nowe repozytorium git bez utraty historii. Połów to repozytorium svn to bezpośrednia kontynuacja repozytorium cvs. Ktoś właśnie stworzył repozytorium svn i niezdarnie dodał ostatni stan z cvs bez zachowania historii. Najnowsze źródła są w svn. Nie chcę zachować starych repozytoriów.Połącz dwie historie repozytoriów git:

Historia w grafice:

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

Czego chcę:

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

Zrobiłem repo git z CVS z cvs2git i innego repo git z svn z git svn clone jak wskazano w http://john.albin.net/git/convert-subversion-to-git ale po prostu nie mogę wymyślić, jak połączyć te dwa. Zrobiłem to:

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

Co teraz? git merge -s ours svn/master wydaje się robić to, co chcę, ale nie tworzy liniowy historia:

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

Wszelkie eksperymenty z git rebase nie dostał mnie wszędzie.

Odpowiedz

5

Użyj .git/info/grafts, aby połączyć historię, a następnie git filter-branch, aby stała. Jest jakiś opis jak ktoś to zrobił: http://bugsquash.blogspot.co.uk/2010/03/stitching-git-histories.html

+0

Wielkie dzięki, to się udało. Nigdy bym tego nie znalazł. Napiszę odpowiedź, jak w końcu to zrobiłem. –

+0

@MichaelLemke Tak ... 'rebase' jest czerwonym śledziem - działa z różnicami i ponownie nakłada zestawy zmian, podczas gdy przeszczepy pozwalają bezpośrednio manipulować wykresem historii. – kan

+0

Właściwie nigdy nie spotkałem się z przeszczepami (z tym gitem). –

2

Korzystanie co kan napisał wymyśliłem tego rozwiązania:

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

użytkowania git log --all znaleźć niezwiązane historie:

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

Znajdź pełny SHA1:

git show 1985b93 
git show 12e0ed4 

Tworzenie przeszczep:

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

Teraz historie są połączone, ale jeszcze nie na stałe:

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

Zrób to trwały, jak pokazano na http://bugsquash.blogspot.co.uk/2010/03/stitching-git-histories.html:

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

Stwarza to nowe rewizje, ale także pozostawia oryginalny svn zatwierdza. git log --all pokaże:

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

Usuń przeszczep, duplikat historia zniknie:

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

Clean up:

git reset --hard svnmaster 
git branch -D svnmaster 

i wciśnij:

git push 

Wszystko gotowe!

Powiązane problemy