Używam git-svn
do pracy z centralnym repozytorium Subversion mojej firmy. Niedawno utworzyliśmy nową gałąź funkcji w centralnym repozytorium.
Jak mam o tym powiedzieć Gitowi? Kiedy uruchamiam, git branch -r
widzę tylko gałęzie, które istniały, gdy działałem fetch
przeciwko repozytorium Subversion, aby zainicjować moje repozytorium Git?
Odpowiedzi:
Możesz ręcznie dodać zdalną gałąź,
źródło
fatal: Cannot setup tracking information; starting point 'newbranch' is not a branch.
na krok kasy.Jeśli chcesz śledzić WSZYSTKIE zdalne gałęzie svn, rozwiązanie jest tak proste, jak:
Spowoduje to pobranie WSZYSTKICH zdalnych gałęzi, które nie zostały jeszcze pobrane.
Dodatkowa wskazówka: jeśli najpierw sprawdziłeś tylko pień, a później chcesz śledzić WSZYSTKIE gałęzie, edytuj,
.git/config
aby wyglądać tak i uruchom ponowniegit svn fetch
:Kluczowe punkty
url
powinny wskazywać na katalog główny repozytorium, a ścieżki zdefiniowane wfetch
ibranches
powinny być względneurl
.Jeśli chcesz pobrać tylko określone gałęzie zamiast WSZYSTKICH, istnieje ładny przykład w
git svn --help
:W starszych wersjach
git-svn
, po określeniu takich gałęzi, możesz nie być w stanie uzyskać nowych gałęzigit svn fetch
. Jednym obejściem jest dodanie kolejnychfetch
linii, takich jak to:Kolejne obejście autorstwa @AndyEstes: edytuj
.git/svn/.metadata
i zmień wartośćbranches-maxRev
lubtags-maxRev
na wersję przed utworzeniem nowo określonych gałęzi lub znaczników. Gdy to zrobisz, uruchom,git svn fetch
aby śledzić nową gałąź zdalną svn.źródło
.git/svn/.metadata
była bardzo pomocna! Dodawałem do siebie dodatkowe gałęzie.git/config
, któregit svn fetch
nie odbierały, ponieważ numer wersji metadanych był „zbyt daleko”. W jednym przypadku pobrano tylko ostatnie zatwierdzenie z gałęzi. Ręcznie pozbyłem się wadliwej gałęzi (zmieniłem.git/svn/refs/remotes/svn/qa/XYZ
jej nazwę.git/svn/refs/remotes/svn/qa/XYZ~
, porzuciłem jej istnienie.git/packed-refs
itp.) ... wybrałem „wcześniejszą” wersję rewizji dla metadanych… pobiegłem,git svn fetch
by w końcu uzyskać pełną historię z poprawnym połączonym wykresem.git svn fetch --all
.Wygląda na to, że po prostu potrzebowałem
git svn fetch
; jakoś przekonałem się, że ściągnę całe repo zamiast samych zmian.źródło
Może jakoś to pomieszałem, ale postępowałem zgodnie z instrukcjami zawartymi w odpowiedzi Vjangusa i prawie się udało. Jedynym problemem było to, że Newbranch nie wydawał się być rozgałęziony z pnia. W gitk było to jakby „pływanie” na własną rękę; nie miał wspólnego przodka z pniem.
Rozwiązaniem tego było:
git diff-tree <sha1 from step 1> <sha1 from step 2>
- nie powinno być wyjścia. Jeśli jest wyjście, być może wybrano nieprawidłowe zatwierdzenia.git checkout local-newbranch
potemgit rebase <sha1 from step 1>
. Spowoduje tolocal-newbranch
zmianę bazy na nowe drzewo, aleremotes/newbranch
nadal będzie rozłączone..git/refs/remotes/newbranch
i edytuj go, aby zawierał pełny SHA1 nowego zatwierdzenia (w wersji bazowejnewbranch
), który odpowiada staremu zatwierdzeniu, na które obecnie wskazuje. (A może użyjgit-update-ref refs/remotes/newbranch <new-SHA>
. Dziękuję inger.)git svn dcommit
sięnewbranch
, dostaniesz kilka wiadomości o nim aktualizujących jakiś dziennik. Myślę, że to normalne.Zalecam utrzymywanie
gitk --all
otwartego przez cały czas i odświeżanie go często, aby śledzić to, co robisz. Nadal jestem trochę nowy w git i git svn, więc proszę zasugerować ulepszenia tej metody.źródło
Uproszczenie odpowiedzi Vjangusa:
Jeśli używasz standardowego układu w SVN i wykonałeś zwykłą inicjalizację svn, git-svn wykona konfigurację za Ciebie. Właśnie:
Przykład. Adres URL SVN to
svn+ssh://[email protected]/repo
. Oddział SVN, którego szukam, tonewbranch
. Lokalny oddział git (śledzenie zdalnenewbranch
) będziegit-newbranch
.Krok 1: znajdź wersję kopii oddziału
Zatem punktem rozgałęzienia w SVN jest wersja 7802.
Krok 2: Pobierz wersję
git-svn wykonał całą pracę i teraz wie o pilocie:
Krok 3: Utwórz nowy oddział lokalny śledzący oddział zdalny:
źródło
show-ref
jest bezcenne)! Dla każdego, kto utknął z nieprawidłowymi odniesieniami do zdalnych gałęzi, możesz je usunąć (musiałem to zrobić,git branch -d newbranch
a następnie wymusić usunięcie katalogu referencyjnego.git/svn/refs/remotes/newbranch
), a następnie zacząć od nowa w kroku 2 (powyżej).Nie znalazłem żadnej dokumentacji na temat tej funkcji, ale wygląda na to, że konfiguracja git svn obsługuje wiele wpisów pobierania. W ten sposób możesz również dodawać gałęzie osobno, bez potrzeby dodawania kolejnego wpisu zdalnego repozytorium svn do swojej konfiguracji ani używania symboli wieloznacznych, aby uzyskać wszystkie gałęzie określonego katalogu.
Załóżmy, że twoje drzewo SVN jest naprawdę paskudne, mając wiele gałęzi bez logiki co do ich lokalizacji, np. Mając gałęzie i podkatalogi zawierające bardziej rozgałęzione.
to znaczy
i po prostu chcesz ręcznie wybrać niektóre gałęzie, które zostaną włączone do Twojego repozytorium git.
Możesz najpierw zainicjować swoje repozytorium tylko z pniem bez żadnych dodatkowych gałęzi:
Następnie powinieneś zobaczyć następującą konfigurację:
kiedy chcesz pobrać nowy oddział z MyRepo, możesz po prostu dodać nowe wpisy pobierania do konfiguracji poprzez:
Lub możesz edytować tę samą konfigurację w .git / config
Aby pobrać nowe gałęzie po dodaniu ich do konfiguracji, po prostu uruchom:
[Edytuj] Czasami wydaje się konieczne uruchomienie pobierania z parametrem --all, aby pobrać nowo dodane gałęzie:
źródło
Zamiast zajmować się dziwactwami git-svn, możesz wypróbować SubGit .
Trzeba zainstalować SubGit w repozytorium Subversion. Następnie można użyć standardowego przepływu pracy git zamiast specjalnych poleceń git-svn:
Wprowadzanie nowych zatwierdzeń:
git-svn:
SubGit:
Pobieranie nadchodzących zmian
git-svn:
SubGit:
Tworzenie nowego oddziału:
git-svn:
SubGit:
Więcej informacji znajduje się w dokumentacji SubGit .
źródło
Aby dodać do odpowiedzi vjangusa, która pomogła mi, uznałem również za przydatne dodanie przeszczepów git, aby związać gałęzie z pniem w odpowiednim punkcie - pozwalając gitowi zobaczyć historię i poprawnie połączyć.
Jest to po prostu przypadek dodania linii do
.git/info/grafts
skrótów:na przykład.
Kredyt na http://evan-tech.livejournal.com/255341.html
(Dodałbym to jako komentarz, ale nie mam wystarczającej reputacji).
źródło
Jeśli nie wyewidencjonujesz prawidłowego układu, nie będziesz w stanie wyewidencjonować zdalnego oddziału.
Tym się właśnie zajmuję:
Następnie możesz przejść do zdalnego oddziału:
Następnie zostaniesz automatycznie przełączony do oddziału.
źródło