2016-07-12 106 views
5

Utworzono prosty skrypt do migracji dość dużego repozytorium SVN. Zamiast używać git svn clone, używam git svn init i git svn fetch, dzięki czemu mogę określić wersję i pobrać porcję przez porcję. Bardziej lub mniej, to jest coś takiego:Jak wykonać pobieranie git-svn i zachować pusty katalog?

while [ "$CURRENT_REVISION" -lt "$MAX_REVISION" ]; do 
    END_REVISION=$((CURRENT_REVISION + 100)) 
    if [ "$END_REVISION" -ge "$MAX_REVISION" ] 
    then 
    END_REVISION=$MAX_REVISION 
    fi 

    git svn fetch -r "$CURRENT_REVISION":"$END_REVISION" --authors-file="$AUTHORS_FILE" 

    #increasing the current and end revision 
    CURRENT_REVISION=$END_REVISION 
    END_REVISION=$((CURRENT_REVISION + 100)) 
done 

Jednak rozumiem, że domyślnie zachowanie zwrcania/klon nie zachowa pustych katalogów. Tak więc, być może będę musiał ręcznie sprawdzić w tych pustych katalogach (* których staram się ominąć).

Istnieje parametr --preserve-empty-dirs w git svn clone, ale nie w git svn fetch.

Czy istnieje sposób obejścia tego problemu?

UPDATE

Mimo że nie są one wymienione w dokumentacji urzędowej, które możemy wykorzystać klucz konfiguracyjny dla sprowadzić, to faktycznie działa

Istnieje szczegółowe wyjaśnienie przez @Vampire związane z tym pytanie. Uproszczę to.

Po wykonaniu repozytorium startowy, musiałem zmienić konfigurację mojego odległego oddziału:

git config svn-remote.<remote name>.preserve-empty-dirs "true"

git config svn-remote.<remote name>.placeholder-filename ".gitkeep"

Można sprawdzić konfigurację patrząc na /.git/config. Po prostu wykonaj normalne pobieranie i katalog zostanie zachowany.

+0

Czy używasz tego do jednorazowej konwersji, czy też chcesz użyć git-svn do używania Git jako frontendu do repozytorium Subversion, które nadal będzie kanonicznym źródłem twojego kodu? – Vampire

+0

Tak, mogę powiedzieć, że to jednorazowa konwersja. – alfonzjanfrithz

Odpowiedz

3

git-svn to nie jest to odpowiednie narzędzie do jednorazowych konwersji repozytoriów. To wspaniałe narzędzie, jeśli chcesz używać Git jako nakładki dla istniejącego serwera SVN, ale dla jednorazowych konwersji nie powinieneś używać , a nie używać go, ponieważ jest on bardziej odpowiedni dla tego przypadku.

Istnieją narzędzia pleny o nazwie svn2git, prawdopodobnie najlepiej jest KDE z https://github.com/svn-all-fast-export/svn2git. Zdecydowanie polecam używanie tego narzędzia svn2git. Jest to najlepsze, jakie znam, dostępne i jest bardzo elastyczne w tym, co można zrobić z jego plikami reguł.

Jeśli nie jesteś w 100% o historii swojego repozytorium, svneverever z http://blog.hartwork.org/?p=763 jest doskonałym narzędziem do sprawdzania historii repozytorium SVN podczas migracji do Git.


Jeśli nadal chcesz używać git svn, nie trzeba do manally przystojniak swoją sprowadzania. Po prostu wykonaj git svn clone ..., jeśli chcesz wstrzymać, anuluj wykonanie, a następnie wykonaj git svn fetch, aby kontynuować proces pobierania. Będzie automatycznie kontynuowany tam, gdzie przestanie działać, a nawet sprawdzi ostatnią pobraną wersję, czy została całkowicie pobrana, czy musi zostać ponownie zapisana.


Jeśli nadal chcesz ręcznie przystojniak swoją sprowadzanie, należy pamiętać, że git svn clone ... jest dokładnie taka sama jak git svn init ... następnie git svn fetch, z wyjątkiem tego, że zgodnie z clone specyficznych parametrów właściwości konfiguracyjne svn-remote.<remote name>.preserve-empty-dirs jest ustawione na true i svn-remote.<remote name>.placeholder-filename jest ustawiona na argument podany między init i fetch. Więc rób to ręcznie po twoim init i przed pobraniem i wszystko jest w porządku.

Jedna uwaga jednak:preserve-empty-dirs afair jest konieczne tylko w przypadku trzeba mieć tych pustych katalogów w repozytorium Git i używasz tylko repozytorium Git później. Dopóki używasz tylko git svn jako frontend do wychodzącego repozytorium SVN, emtpy dirs powinny automatycznie zostać utworzone w twoim obszarze roboczym i nie muszą być częścią rzeczywistej historii repozytorium. To, co robi preserve-empty-dirs, to dodanie pustego pliku .gitignore (lub czegoś, co skonfigurowałeś z inną właściwością parameter/config) do zatwierdzenia, aby folder nie był już pusty. Dzieje się tak, ponieważ Git jest narzędziem śledzącym zawartość, a nie systemem śledzenia plików. Śledzi twój kod źródłowy, który jest przechowywany w plikach, a nie same pliki i foldery. Dlatego też nie ma czegoś takiego jak jawna operacja move lub copy w Git, ponieważ ruchy i kopie są określane w locie, gdy jest to konieczne i pożądane. Technicznie jest to tylko remove i add dla move lub prosty add dla copy.

+0

Dzięki! Dam aktualizację tego rozwiązania. Zasadniczo dodaję 'svn-remote. .preserve-empty-dirs' na mojej konfiguracji i ponownie pobrać repozytorium. Szkoda, że ​​oficjalna dokumentacja nie powiedziała jednoznacznie, że 'preserve-empty-dirs' może zostać dodane w kluczu konfiguracyjnym. Dziękuję za oświecenie. Mogę też wypróbować inne rozwiązanie, sprawdzając wszystkie aktywne gałęzie svn. uzyskaj polecenie dotknięcia pliku dummy we wszystkich pustych katalogach, skopiuj te katalogi do obszaru roboczego git i utwórz nowe zatwierdzenie git dla tego pliku. – alfonzjanfrithz

+0

Otrzymuję ten błąd: 'svn-all-fast-export: /build/subversion-8E3yhQ/subversion-1.9.3/subversion/libsvn_subr/dirent_uri.c:972: svn_dirent_join: Assertion \' svn_dirent_is_canonical (base, pool) ' nie powiodło się. "Powrót do' git svn' :-( – peterh

+0

@peterh musisz mieć repozytorium lokalnie. Patrz tutaj: https://github.com/svn-all-fast-export/svn2git/issues/3 – Vampire