Jaka jest różnica między git clone --mirror a git clone --bare

486

Strona pomocy git clone zawiera następujące informacje --mirror:

Skonfiguruj kopię lustrzaną zdalnego repozytorium. To implikuje --bare.

Ale nie zagłębia się szczegółowo w to, czym --mirrorklon różni się od --bareklonu.

Sam
źródło
3
pomocna, ale jeśli chcesz również zepchnąć to lustro do zdalnego repozytorium, takiego jak github, znalazłem ten link przydatny.
Zjedz w Joes

Odpowiedzi:

568

Różnica polega na tym, że podczas używania --mirror, wszyscy sędziowie są kopiowane jak jest . Oznacza to wszystko: zdalne śledzenie gałęzi, notatek, referencji / oryginałów / * (kopie zapasowe z gałęzi filter). Sklonowane repo ma to wszystko. Jest również skonfigurowany tak, aby zdalna aktualizacja ponownie pobierała wszystko z miejsca początkowego (zastępując skopiowane referencje). Chodzi o to, aby naprawdę wykonać kopię lustrzaną repozytorium, aby mieć całkowitą kopię, abyś mógł na przykład umieścić swoje centralne repozytorium w wielu miejscach lub wykonać jego kopię zapasową. Pomyśl o prostym skopiowaniu repozytorium, chyba że w bardziej elegancki sposób git.

Nowa dokumentacja mówi prawie wszystko:

--mirror

Skonfiguruj kopię lustrzaną repozytorium źródłowego. To implikuje --bare. W porównaniu do --bare, --mirrornie tylko mapuje lokalne oddziały źródła do lokalnych oddziałów cel, mapuje wszystkie pozycje literatury (w tym zdalnych oddziałów, notatki itp) i konfiguruje refspec konfiguracji takiej, że wszystkie te pozycje literaturowe są zastępowane przez git remote updatew repozytorium docelowym .

W mojej pierwotnej odpowiedzi zauważyłem również różnice między gołym klonem a normalnym (nie nagim) klonem - nie nagi klon tworzy zdalne gałęzie śledzenia, tworząc tylko gałąź lokalną HEAD, podczas gdy nagi klon kopiuje gałęzie bezpośrednio.

Pochodzenie Załóżmy ma kilka oddziałów ( master (HEAD), next, pu, i maint), niektóre znaczniki ( v1, v2, v3), niektóre zdalnych oddziałów ( devA/master, devB/master), oraz niektóre inne pozycje literatury ( refs/foo/bar, refs/foo/baz, co może być notatki, stashes, nazw innych deweloperów, kto wie).

  • git clone origin-url(non-gołe): Dostaniesz wszystkie znaczniki skopiowanych, lokalny oddział master (HEAD)śledzenia zdalnego oddziału origin/masteri zdalnych oddziałów origin/next, origin/puoraz origin/maint. Gałęzie śledzące są skonfigurowane tak, że jeśli zrobisz coś takiego git fetch origin, zostaną one pobrane zgodnie z oczekiwaniami. Wszelkie zdalne gałęzie (w sklonowanym pilocie) i inne referencje są całkowicie ignorowane.

  • git clone --bare origin-url: Dostaniesz wszystkie znaczniki skopiowaniu lokalnych oddziałów master (HEAD), next, pu, i maintgałęzie, bez zdalnego śledzenia. Oznacza to, że wszystkie gałęzie są kopiowane bez zmian, a konfiguracja jest całkowicie niezależna, bez oczekiwania na ponowne pobranie. Wszelkie zdalne gałęzie (w sklonowanym pilocie) i inne referencje są całkowicie ignorowane.

  • git clone --mirror origin-url: Każda ostatnia referencja zostanie skopiowana w obecnej postaci. Dostaniesz wszystkie znaczniki, lokalne oddziały master (HEAD), next, pui maint, zdalne branże devA/masteri devB/master, inne pozycje literatury refs/foo/bari refs/foo/baz. Wszystko jest dokładnie tak, jak było w sklonowanym pilocie. Zdalne śledzenie jest skonfigurowane tak, że jeśli uruchomisz, git remote updatewszystkie referencje zostaną nadpisane od początku, tak jakbyś właśnie usunął lustro i ponownie go sklonował. Jak pierwotnie powiedzieli doktorzy, jest to lustro. Ma to być funkcjonalnie identyczna kopia, wymienna z oryginałem.

Cascabel
źródło
Czy „normalny klon” odnosi się do klonu bez flag --bare lub --mirror?
Sam
1
Tak, to działa. Z czystym klonem, jak napisano na stronie man, gałęzie są również kopiowane bezpośrednio (bez referencji / pilotów / pochodzenia, bez śledzenia). Edytowano w.
Cascabel
Czy możesz dodać więcej przykładów użycia dotyczących różnicy, a nie tylko wewnętrznych różnic git?
cmcginty,
@Casey jest tym, czego szukałeś? Nie sądziłem, że to, co pierwotnie napisałem, było w ogóle „wewnętrzne” - metki i gałęzie są bardzo porcelanowe.
Cascabel
Czy „gałęzie skopiowane jak są” oznaczają, że gałęzie są kopiowane na tę samą ścieżkę względną w klonie? A może oznacza to, że gałęzie są w jakiś sposób przekształcane?
Sam
56
$ git clone --mirror $URL

jest skrótem do

$ git clone --bare $URL
$ (cd $(basename $URL) && git remote add --mirror=fetch origin $URL)

(Kopiowane bezpośrednio stąd )

Jak to przedstawia obecna strona podręcznika:

W porównaniu do --bare, --mirrornie tylko mapuje lokalne oddziały źródła do lokalnych oddziałów cel, mapuje wszystkie pozycje literatury (w tym zdalnych oddziałów, notatki itp) i konfiguruje refspec konfiguracji takiej, że wszystkie te pozycje literaturowe są zastępowane przez git remote updatew repozytorium docelowym .

hfs
źródło
4
Sądzę, że musiałbyś podążać git fetchza tym, żeby faktycznie było identyczne. W każdym razie jest to rodzaj braku odpowiedzi - pytanie brzmi „w jaki sposób lustro zdalne / klon różni się od normalnego?”.
Cascabel
6
Właściwie podoba mi się ten sposób wykazania różnicy. Mam nadzieję, że to jest dokładne! Mam nadzieję, że hfs doda polecenie pobierania.
joeytwiddle
niezupełnie
5
basenameto normalne narzędzie uniksowe, które usuwa część katalogu ze ścieżki i $()jest po prostu podstawieniem poleceń bash.
Victor Zamanian
6
To wciąż ma --mirrorw sobie. Byłaby to akceptowalna odpowiedź tylko, gdyby wyjaśniła, co git remote add --mirrorrobi.
Zenexer
24

Moje testy z git-2.0.0 dzisiaj wskazują, że opcja --mirror nie kopiuje hooków, pliku konfiguracyjnego, pliku opisu, pliku informacji / wykluczenia, a przynajmniej w moim przypadku testowym kilka odnośników (których nie „ rozumiem.) Nie nazwałbym tego „funkcjonalnie identyczną kopią, zamienną z oryginałem”.

-bash-3.2$ git --version
git version 2.0.0
-bash-3.2$ git clone --mirror /git/hooks
Cloning into bare repository 'hooks.git'...
done.

-bash-3.2$ diff --brief -r /git/hooks.git hooks.git
Files /git/hooks.git/config and hooks.git/config differ
Files /git/hooks.git/description and hooks.git/description differ
...
Only in hooks.git/hooks: applypatch-msg.sample
...
Only in /git/hooks.git/hooks: post-receive
...
Files /git/hooks.git/info/exclude and hooks.git/info/exclude differ
...
Files /git/hooks.git/packed-refs and hooks.git/packed-refs differ
Only in /git/hooks.git/refs/heads: fake_branch
Only in /git/hooks.git/refs/heads: master
Only in /git/hooks.git/refs: meta
Mark E. Hamilton
źródło
14

Szczegółowe wyjaśnienie z dokumentacji GitHub na temat powielania repozytorium :

Podobnie jak w przypadku samego klonu, klon lustrzany zawiera wszystkie zdalne gałęzie i znaczniki, ale wszystkie lokalne odniesienia będą nadpisywane przy każdym pobieraniu, więc zawsze będą takie same jak oryginalne repozytorium.

Feckmore
źródło
1
Dziękuję Ci; to wyjaśniło mi, że lokalne tagi zostaną nadpisane, a także gałęzie za pomocą dublowanego klonu. Bardzo pomocny.
Wildcard,
2
Możesz także użyć --prunepodczas uruchamiania git fetch, aby usunąć lokalne odwołania, których już nie ma na pilocie.
nishanths,
13

Klon kopiuje referencje z pilota i umieszcza je w podkatalogu o nazwie „są to referencje, które ma pilot”.

Lustro kopiuje referencje z pilota i umieszcza je na swoim najwyższym poziomie - zastępuje własne referencje pilotem.

Oznacza to, że gdy ktoś wyciągnie z twojego lustra i wrzuci odnośniki do swojego podkatalogu, otrzyma takie same odnośniki jak w oryginale. Wynik pobierania z aktualnego serwera lustrzanego jest taki sam, jak pobieranie bezpośrednio z początkowego repozytorium.

PaulMurrayCbr
źródło
12

Dodaję zdjęcie, pokazuję configróżnicę między lustrem a gołym. wprowadź opis zdjęcia tutaj Lewy jest nagi, prawy to lustro. Możesz być czysty, plik konfiguracyjny kopii lustrzanej ma fetchklucz, co oznacza, że ​​możesz go zaktualizować za pomocą git remote updatelubgit fetch --all

yanzi1225627
źródło
3
$ git clone --bare https://github.com/example

To polecenie sprawi, że nowy sam stanie się $ GIT_DIR. Również głowy oddziałów na pilocie są kopiowane bezpośrednio do odpowiednich lokalnych oddziałów, bez mapowania. Gdy ta opcja jest używana, nie są tworzone gałęzie zdalnego śledzenia ani powiązane zmienne konfiguracyjne.

$ git clone --mirror https://github.com/example

Podobnie jak w przypadku samego klonu, klon lustrzany zawiera wszystkie zdalne gałęzie i znaczniki, ale wszystkie lokalne odniesienia (w tym gałęzie zdalnego śledzenia, notatki itp.) Zostaną zastąpione przy każdym pobieraniu, więc zawsze będą takie same jak oryginalne repozytorium .

Shantanu Singh
źródło