2014-12-11 17 views
5

Przeprowadzam migrację mojego repozytorium SVN zgodnie z odpowiedzią this. Wszystko idzie gładko, z tym, że w końcu nie mam pełnej historii. Mogłem śledzić źródło problemu aż do "ruchu SVN", który zrobiłem.svn to git migration: incomplete history

Oto, co zrobiłem: Na początku moje repozytorium SVN nie miało żadnych katalogów trunkbranchestags. Gdzieś je przedstawiłem i przeniosłem wszystko do bagażnika (a potem stworzyłem gałąź, dlatego zdecydowałem się wprowadzić nową strukturę folderów).

Po przeniesieniu repozytorium SVN do git dostępna jest tylko historia po wprowadzeniu nowej struktury folderów.

Powtórzyłem ten problem w bardzo prosty scenariusz.

Historia w SVN: enter image description here

Historia w git: enter image description here

Zip, który zawiera SVN repo/git repo:

https://www.dropbox.com/s/ecy54st05qah4up/svn_git_problem.zip?dl=0

jest jakiś sposób aby to naprawić ?

+0

Dostaję dużo wyskakujących okienek i błędów wirusów z linkiem do pliku zip repo. Czy możesz opublikować go na stronie takiej jak dropbox.com, która nie ma wyskakujących okienek i reklam? –

+2

zrobione. moje przeprosiny za zły link. –

Odpowiedz

2

Po podaniu wartości --stdlayout, git svn clone będzie zwracać uwagę tylko na svn commit, które modyfikują pliki w ścieżkach/trunk,/branches lub/tags - inne zatwierdzenia będą ignorowane. Wciąż otrzymujesz poprawny klon twojego repozytorium, ale historia od r1 aż do stworzenia twojego standardowego układu zostanie utracona, jak zauważyłeś. Ponieważ chcesz, aby twoje repozytorium Git zrozumiało trunk, gałęzie i znaczniki po zmianie układu, nadal chcesz --stdlayout, inaczej klon git połączy wszystkie gałęzie w jedno drzewo z/trunk/branches/tagami, co nie jest tym, czego potrzebujesz.

Co możesz zrobić, jeśli naprawdę głęboko interesujesz się historią zmiany wcześniejszego układu (a jeśli jest to ściśle jednorazowa migracja, nie jest wymagana żadna SVN po przejściu na Git), to należy uruchomić dwukrotnie: git svn clone - jeden raz --stdlayout i raz bez. Wersja stdlayout stanie się twoim ostatecznym repozytorium, a wersja non-stdlayout może być używana tylko podczas migracji, aby zszyć historię zmiany wcześniejszego układu pod nowym układem w momencie reorganizacji. Można to zrobić, wybierając wszystkie swoje zatwierdzenia z okresu post-rego na migawkę repozytorium w czasie re-org.

Po sklonowaniu obu repozytoriów zauważysz, że w miejscu kopiowania do nowego layoutu znajduje się wspólny skrót drzewa dla pnia. Oto przykład (nie używając repo przykro, więc hashe się różnić):

(w stdlayout repo):

# git log --pretty=raw 
commit 44f2f60e00117dfd51fd7d6431b697ec0ccc863d 
tree 5cf62e006bb7b58171010fc0ffaba08ca97520da 
parent d403c6ce0789cf584af9abb945bcfd88721e391e 
author (no author) <(no author)@4ed80924-4846-11e4-8279-c5809b3f22e4> 1420411603 +0000 
committer (no author) <(no author)@4ed80924-4846-11e4-8279-c5809b3f22e4> 1420411603 +0000 

    change 4 after folder structure & branch 

    git-svn-id: http://<redacted>/[email protected] 4ed80924-4846-11e4-8279-c5809b3f22e4 

commit d403c6ce0789cf584af9abb945bcfd88721e391e 
tree d6c0d6cf271be5146b26781ab9bd78736d86ace3 
parent 0c5873eab204942ffe56370cc6e1d31e5372da13 
author (no author) <(no author)@4ed80924-4846-11e4-8279-c5809b3f22e4> 1420411513 +0000 
committer (no author) <(no author)@4ed80924-4846-11e4-8279-c5809b3f22e4> 1420411513 +0000 

    changed: moved to new folder structure 

    git-svn-id: http://<redacted>/[email protected] 4ed80924-4846-11e4-8279-c5809b3f22e4 

commit 0c5873eab204942ffe56370cc6e1d31e5372da13 
tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 
author (no author) <(no author)@4ed80924-4846-11e4-8279-c5809b3f22e4> 1420411460 +0000 
committer (no author) <(no author)@4ed80924-4846-11e4-8279-c5809b3f22e4> 1420411460 +0000 

    new folder structure 

    git-svn-id: http://<redacted>/[email protected] 4ed80924-4846-11e4-8279-c5809b3f22e4 

(w pełnej wersji, bez stdlayout repo):

commit ec52fff6ee1d65eadfa1d18aa4b74b553fc693e1 
tree cfda32eb39248fa5969d15a21d2f8014189e88c2 
parent 685fe9961abfee4d4913e83cf5a4a7e8d459a1a1 
author (no author) <(no author)@4ed80924-4846-11e4-8279-c5809b3f22e4> 1420411603 +0000 
committer (no author) <(no author)@4ed80924-4846-11e4-8279-c5809b3f22e4> 1420411603 +0000 

    change 4 after folder structure & branch 

    git-svn-id: http://<redacted>@9 4ed80924-4846-11e4-8279-c5809b3f22e4 

commit 685fe9961abfee4d4913e83cf5a4a7e8d459a1a1 
tree 817306fad0ed5466d877437cdda12ff39a0df725 
parent 02caf52174c588f1d394815201b764f9abdaa640 
author (no author) <(no author)@4ed80924-4846-11e4-8279-c5809b3f22e4> 1420411565 +0000 
committer (no author) <(no author)@4ed80924-4846-11e4-8279-c5809b3f22e4> 1420411565 +0000 

    created new branch 

    git-svn-id: http://<redacted>@8 4ed80924-4846-11e4-8279-c5809b3f22e4 

commit 02caf52174c588f1d394815201b764f9abdaa640 
tree c041405a580beaef0a4e50923e9279e179c917a8 
parent 37d77b8f1168d00b943e0bca3cab277cf89e7e84 
author (no author) <(no author)@4ed80924-4846-11e4-8279-c5809b3f22e4> 1420411513 +0000 
committer (no author) <(no author)@4ed80924-4846-11e4-8279-c5809b3f22e4> 1420411513 +0000 

    changed: moved to new folder structure 

    git-svn-id: http://<redacted>@7 4ed80924-4846-11e4-8279-c5809b3f22e4 

commit 37d77b8f1168d00b943e0bca3cab277cf89e7e84 
tree d6c0d6cf271be5146b26781ab9bd78736d86ace3 
parent 3a4784719bd95af5bf59de96310a1d6a38af562e 
author (no author) <(no author)@4ed80924-4846-11e4-8279-c5809b3f22e4> 1420411460 +0000 
committer (no author) <(no author)@4ed80924-4846-11e4-8279-c5809b3f22e4> 1420411460 +0000 

    new folder structure 

    git-svn-id: http://<redacted>@6 4ed80924-4846-11e4-8279-c5809b3f22e4 

commit 3a4784719bd95af5bf59de96310a1d6a38af562e 
tree d6c0d6cf271be5146b26781ab9bd78736d86ace3 
parent 2fb41dab5a7389ab32419b8b270d955631aaaefa 
author (no author) <(no author)@4ed80924-4846-11e4-8279-c5809b3f22e4> 1420411421 +0000 
committer (no author) <(no author)@4ed80924-4846-11e4-8279-c5809b3f22e4> 1420411421 +0000 

    update 4 

... etc., continues. 

Należy zauważyć, że w repozytorium stdlayout zatwierdzenie d403c6c jest drzewem d6c0d6c, a w pełnym klonie, oba zatwierdza 37d77b8 i jego rodzic 3a47847 również mają to samo drzewo.Na początku możesz pomyśleć, że to dziwne, dopóki nie zdasz sobie sprawy, że tworzenie/trunk/branches/tagów w kliencie git-svn faktycznie nie działa, ponieważ Git nie śledzi pustych katalogów.

W repo stdlayout można importować pełnym klon niestandardowego Klon:

# git remote add fullclone ../fullclone 
# git fetch fullclone 

Następnie KASY nowy oddział z „nowej struktury folderów” popełnienia od pełnej repo:

# git checkout -b fix-history 37d77b8 

Następnie odtworzyć wszystkie rewizje od tego momentu w repo standardowego układu:

# git cherry-pick d403c6c..master 

Uruchomienie tego może zająć trochę czasu, jeśli masz wiele ponownych zatwierdzeń po opublikowaniu, ponieważ każde zatwierdzenie jest ponownie zatwierdzane w nowym oddziale. Wynik powinien być połączoną historią pnia przed i po reorganizacji.