Czy różne klony git-svn tego samego repozytorium svn mogą oczekiwać, że będą mogły udostępniać zmiany w git svn dcommit?

Czytałem wiele artykułów" przejdź z svn do git "i innych" Git-svn workflow " w Internecie i nadal myślę, że często mają do czynienia z zbyt prostymi sytuacjami. Często są one skierowane do facetów, którzy chcą po prostu używać git i hack lokalnie, bez korzystania z pełnej mocy git, jak pull, fetch, merge i tym podobne między wieloma programistami, którzy wszyscy sklonowali repozytorium svn z git-svn, a następnie nadal oczekiwać, aby być w stanie push ich zmiany w dowolnym momencie do (oficjalnego) svn repozytorium, i wrócić do pracy w git i dzielenia się swoimi rzeczami itp.

Ilekroć te artykuły przyznają, że nie możesz zrobić wszystkiego, co byś zrobił w pure git, konsekwencje i ewentualne wpadki nigdy nie są jasno wyjaśnione (a może to tylko ja ?). Nawet strona podręcznika git-svn wspomina o zastrzeżeniach, ale niezbyt obszernie.

Bazując na tym, co przeczytałem, czuję, że mogą pojawić się problemy, gdy git-svn jest używany w ten konkretny sposób, co opiszę poniżej. Czy ktoś może mi powiedzieć czy Mam rację ?

Oto "poszukiwany" sposób robienia rzeczy:

  1. mamy projekt w repozytorium svn
  2. programista git-svn-clone jest repo svn. Zaczyna hakować rzeczy lokalnie
  3. programista B git-svn-clone jest tym samym repo svn. Zaczyna się włamywać na własną rękę.
  4. Po zrobieniu tego przez jakiś czas, ewentualnie dodanie devs C / D/... i mając innych programistów, którzy wykonują" standardowe " commity svn do oryginalnego repo, użytkownicy git chcieliby udostępnić ich kod i robić wszystkie rodzaje magii Gita.
  5. każdy z tych użytkowników Gita chciałby móc wypchnąć teraz scalone zmiany do svn (dcommit?)

Moje pytanie brzmi: Czy ja śnię? Czytałem jakiś czas temu, w książce git myślę, że git-svn-clone może tworzyć repozytoria git, które są oczywiście "lustrem" repo svn, ale że repozytoria Git utworzone w ten sposób przez różnych deweloperów będą miały różne "ID" i commity będą miały różne hasze. Więc moje zrozumienie było takie, że te repozytoria git nie będą współdzielić żadnego wspólnego przodka git, a tym samym nie będą mogły używać wszystkich komend git potrzebnych do współdzielenia, scalania itd. Czy to prawda, czy będziemy mieli problemy z tym przepływem pracy ?

Czasami czytam, że można to zrobić, używając przynajmniej" oficjalnego " repozytorium git, które byłoby jedynym sklonowanym git-svn, i wszyscy użytkownicy git musieliby zacząć od tego. Następnie potrzebujesz kogoś, kto jest odpowiedzialny za ten centralny Git repo, i zbiera zmiany pomiędzy deweloperami Gita, przed przekazaniem wszystkiego do repo svn. To byłby jedyny sposób, aby użytkownicy git byli "nieświadomi", że oryginalny repo git pochodzi z svn i pozwoliliby im używać wszystkich komend git tak, jak chcą. Jedyną osobą, która musiałaby być biegła zarówno w git jak i svn (i wiedzieć o zastrzeżeniach git-svn), byłby "merge manager" (czy jak on się nazywa).

Czy kompletnie nie rozumiem zastrzeżeń git-svn ? Czy jest jakiś prostszy sposób na zrobienie tego ?

Author: dsh, 2009-12-10

7 answers

Problemem jest oczywiście Krok 4. Dcommit próbuje odtworzyć lokalną historię na serwerze. Dcommit udaje, że jesteś klientem SVN. Jeśli kod, który dodajesz, nie jest tylko od ciebie, to jest coś, co jest trudne do przekazania do SVN.

Oto co pisze guru na ten temat:

  • ze względu na prostotę i współdziałanie z SVN, jest Polecam wszystkim użytkownikom git-svn klonowanie, pobieranie i dcommit bezpośrednio z serwer SVN (zdalny SVN repozytorium, które jest), i uniknąć wszystkich operacje git-clone/pull/merge/push między repozytoriami git a gałęziami które są pobierane przez git svn klon i które są również używane do pchania powrót zestawów zmian do zdalnego SVN repozytorium.
  • zalecana metoda wymiany kodu pomiędzy gałęziami git i użytkowników jest git format-patch i git am, lub po prostu git svn dcommit do SVN repozytorium.
  • ponieważ git svn dcommit używa git svn rebase wewnętrznie, wszelkie gałęzie git we git push to before Git svn dcommit on będą wymagały wymuszenia nadpisania istniejącego ref na zdalnym repozytorium. Jest to na ogół uznane za złe praktyki, zobacz dokumentacja git-push dla szczegółów.
  • uruchamianie git merge lub git pull nie jest zalecane na gałęzi, którą planujemy git svn dcommit from. SVN nie reprezentują wszelkie uzasadnione lub przydatna Moda więc użytkownicy korzystający z SVN nie możemy zobaczyć żadnego połączenia, które dokonaliśmy. Ponadto, jeśli Git merge lub git pull from a Git branch that is a lustro gałęzi SVN, GIT svn dcommit może zobowiązać się do niewłaściwego branch.
  • git clone nie klonuje gałęzi pod refs/ remotes / hierarchia lub wszelkie metadane git-svn lub config. Więc repozytoria tworzone i zarządzane za pomocą używanie git-svn powinno używać rsync do klonowania, jeśli klonowanie ma być wykonane w ogóle.
  • nie powinniśmy używać opcji -- amend w git commit przy zmianie już dcommitted. On uznane za złą praktykę ... zmienić commity, które już zepchnęliśmy do zdalne repozytorium dla innych użytkowników oraz dcommit z SVN jest analogiczny do tego. Więcej informacji na ten temat można znaleźć przy modyfikowaniu pojedynczego commita i problemy z przepisywaniem historii .
 18
Author: nes1983,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-19 15:46:33

[5]} ostatnio dużo z tym eksperymentowałem i myślę, że udało mi się wymyślić konfigurację, która nieco działa. Tak, jest to ścisły system tylko dla rebase, tak to skomplikowane, ale możesz używać Gita do pracy lokalnie (szybkość, historia, stash, indeks, itp.).

Możesz używać gałęzi za kulisami, kiedy współpracujesz z innymi użytkownikami Gita w swoim zespole, ale nie eksperymentowałeś z tym osobiście. Tak długo, jak linearyzować dziennik przed dcommitting powinien praca.

Oto krótka wersja (powtarza wiele tego, co już zostało powiedziane):

    Nie jest to jednak możliwe, ponieważ nie jest to możliwe.]}
  1. Init a "gołe" repo na tym samym serwerze
  2. Push from the fecthing repo to the GOE repo
  3. niech deweloperzy sklonują nagie repo, a następnie
    1. git svn init svnurl aby skonfigurować git-svn remote i
    2. git update-ref refs/remotes/git-svn refs/remotes/origin/master więc git-svn ma wskaźnik do rewizji
  4. automatycznie (commit hook) mają" pobieranie " repo svn rebase i wciskają do nagiego repo
  5. deweloperzy wyciągają z nagiego repo z git pull --rebase
  6. Programiści uruchamiający git svn dcommit muszą najpierw powtórzyć update-ref powyżej w przypadku nowszych wersji pochodzących z SVN.

Jest ilustracja przepływu pracy na tej stronie (potrzebuję więcej punktów reputacji, zanim będę mógł wstawić obraz). Update: Here we go:

 23
Author: Thomas Ferris Nicolaisen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-08 14:29:43

Kiedyś tworzyłem początkowy klon git svn, a następnie udostępniałem he .git wśród programistów używających git, więc mieliśmy dokładnie te same referencje.

Wydawało się, że działa poprawnie, ponieważ byliśmy w stanie używać "specyficznych funkcji Gita" między użytkownikami Gita, tak długo jak pozostaliśmy w liniowym drzewie (tj. rebasing zamiast scalania).

 3
Author: Tryum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-10 11:54:53

Jak tylko wejdziesz do wydania" distributed", lepiej Ci będzie z jednym nagim Git repo sklonowanym wśród deweloperów.
Jeśli chodzi o fazę eksportu-importu do publicznego SVN repo, dla innych do wykorzystania, Skrypty
git2svn i svn2git mogą pomóc w hermetyzacji magii.

Inne uwagi dotyczące pracy w repozytoriach GIT i SVN można znaleźć w pytaniu "Workflow and help with git, 2 projekty svn i jeden "workcopy""

 2
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:03

Istnieje narzędzie, które rozwiązuje problem współdzielenia repozytorium Git zsynchronizowanego z repozytorium Subversion.

SubGit jest dwukierunkowym serwerowym serwerem lustrzanym Git-SVN.

Można zainstalować SubGit w repozytorium Subversion i uzyskać repozytorium Git automatycznie zsynchronizowane z SVN:

$ subgit configure $SVN_REPOS
# Adjust $SVN_REPOS/conf/subgit.conf to specify branches, tags and other options;
# Adjust $SVN_REPOS/conf/authors.txt to specify git & svn authors mapping
$ subgit install $SVN_REPOS
...
$ INSTALLATION SUCCESSFUL

SubGit instaluje haki przed zatwierdzeniem i po zatwierdzeniu do repozytorium Subversion, haki przed odbiorem i po odebraniu do repozytorium Git. W rezultacie natychmiast przekłada przychodzące modyfikacje ze stron SVN i Git. Po instalacji SubGit deweloperzy mogą użyć dowolnego klienta Git do klonowania i pracy z repozytorium Git.

SubGit nie opiera się na git-svn, używa własnego silnika tłumaczeń, który opracował nasz zespół. Więcej szczegółów na ten temat można znaleźć w porównanie SubGit vs.Git-svn . Ogólna dokumentacja SubGit jest dostępna tutaj .

Wersja 1.0 SubGit wymaga lokalnego dostępu do repozytorium Subversion, czyli repozytoriów SVN i Git muszą przebywać na tym samym żywicielu. Ale w wersji 2.0 wprowadzimy tryb proxy Git, kiedy repozytoria Subversion i Git mogą być zlokalizowane w dowolnym miejscu i tylko repozytoria Git mają zainstalowany SubGit, tzn. repozytoria Subversion pozostają nietknięte.

SubGit jest produktem komercyjnym. Jest bezpłatny dla projektów open-source, akademickich, a także dla projektów z maksymalnie 10 osobami.

Disclaimer: jestem jednym z deweloperów SubGit.

 2
Author: vadishev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-11 14:57:47

Znalazłem ten wpis na blogu , który sugeruje pozostawienie oddzielnej gałęzi do synchronizacji z repozytorium Subversion, tak że nadal będzie można wykonać push / pull w gałęzi master.

 2
Author: plindberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-14 21:07:25

Jednym z problemów, które dostrzegam w git-svn jest to, że przechowuje on git-svn-id w komentarzu commit ; ponieważ przepisuje ten commit, zmienia to SHA1, więc nie możesz go wcisnąć gdziekolwiek ludzie będą go udostępniać.

Wolę bzr-svn, ponieważ zamiast tego przechowuje bzr revid w zdalnej rewizji SVN używając właściwości SVN revision, co oznacza brak lokalnego przepisywania rewizji. Ma również pożądaną właściwość, że dwa niezależne ciągi tej samej gałęzi SVN powstanie identycznych i interoperacyjnych oddziałów bzr.

 1
Author: Adrian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-18 15:36:41