tl; dr:
git svn
tworzy te "@" - oddziały jeśli oddział (lub tag) został stworzony do podkatalogu (lub do innego katalogu, który nie jest śledzony przez git-svn). Zawsze będzie też "zwykła" gałąź o tej samej nazwie, ale bez przyrostka "@". Odcinek "@" istnieje tylko jako punkt rozgałęzienia dla zwykłej gałęzi.
Uwaga: Przesłałem do tego łatkę; Zmieniona wersja tego objaśnienia jest teraz częścią oficjalnej strony git svn
, jako nowa sekcja "OBSŁUGA ODDZIAŁÓW SVN" (od Git 1.8.1).
W Subversion, gałęzie i tagi są tylko kopie drzewa katalogów, więc jest to możliwe (choć zwykle zniechęca), aby utworzyć oddział z katalogu, który sam nie oddział (lub tułowia) jest. Na przykład, przez kopiowanie/trunk/foo do/branches/bar, zamiast do kopiowania/trunk ("gałąź podkatalogów", że tak powiem), lub przez kopiowanie katalogu, który leży poza strukturą trunk/tags/branches (która jest możliwe w SVN).
W git jednak gałąź jest zawsze dla całego repo, gałęzie podkatalogów nie istnieją. W związku z tym git svn
używa obejścia. Jeśli wykryje gałąź, która została skopiowana z katalogu, który sam nie jest śledzony jako gałąź przez git-svn, utworzy nową historię. Na przykład, dla oddziału podkatalogu gdzie/trunk/foo jest kopiowany do/oddziały/baru w r1234, stworzy:
- Nowa git commit dla każdej wersji SVN z r1233 z tyłu (pamiętać, że liczba jest ostatnia wersja przed utworzeniem oddziału). Drzewa tych zatwierdzeń będą zawierać tylko podkatalog, który został rozgałęziony. Tak więc dla każdej wersji od r1233 do tyłu, zwykle będą dwa zatwierdzenia git, jeden z całym drzewem (utworzonym, gdy git-svn przetworzył historię
trunk
), i nowymi.
- Fałszywa gałąź o nazwie "bar @ 1233" (nazwa oddziału @ rewizja), która została dodana do zatwierdzenia utworzonego z r1233 powyżej.
- Zatwierdzenie z r1234, zatwierdzenie, które utworzyło gałąź. To zatwierdzenie będzie miało gałąź powyżej jako jej (jedyny) przodek.
- Oddział o nazwie "bar", który wskazuje na drugie zatwierdzenie.
W ten sposób, za podkatalogu pasku oddziału, masz dwa oddziały w git
- bar @ 1233, która reprezentuje stan repozytorium że oddział został utworzony z
- baru, który reprezentuje oddział
Nie jestem do końca pewien, dlaczego utworzono gałąź fikcyjną. Myślę, że robi się to, aby reprezentować informacje o rewizji, od której rozgałęziono oddział, i mieć pełną historię dla oddziału.
Należy zauważyć, że cały mechanizm można wyłączyć za pomocą flagi --no-follow-parent
. W takim przypadku każdy oddział SVN wygeneruje gałąź git z tylko zatwierdzeniami z katalogu gałęzi SVN. Każda gałąź będzie niezwiązana z resztą historii i będzie miała własne zatwierdzenie root, odpowiadające pierwszemu zatwierdzeniu w oddziale.
Naprawdę ciężko mi się dowiedzieć, skąd się wzięło to nazewnictwo, ale wygląda na to, że te gałęzie powstają z przywilejów SVN, które, jak się okazało, nie są już przywoływane przez gałąź lub znacznik svn, na którym zostały pierwotnie wykonane. Podobnie jak nieokreślone zatwierdzenia w Git, z wyjątkiem tego, że można odzyskać nazwę oddziału dla zatwierdzenia. – fork0
@ fork0: Dzięki za odpowiedź. Ale nie rozumiem jasno, w jaki sposób nieuznane zatwierdzenia mogą być obecne w svn. W jaki sposób można utracić referencje? Czy możesz podzielić się swoimi przemyśleniami na ten temat? – crankparty
Nie wiem. Może opiekun repozytorium SVN nigdy ich nie wyczyścił (lub SVN nie ma w ogóle zdolności?). Nie chciałem powiedzieć, że referencje zostały utracone, a raczej ktoś dopiero zaczął popełniać z wcześniejszego punktu w historii. – fork0