2010-10-18 13 views
340

Klon git help strona ma do powiedzenia na temat --mirror:Jaka jest różnica między git clone --mirror i git clone --bare

Ustaw lustro zdalnego repozytorium. To implikuje --bare.

Ale nie wchodzi w szczegóły co do tego, jak klon jest inny niż klon --bare.

+1

pomocne, ale jeśli chcesz, aby wcisnąć ten lustro do zdalnego repo jak github, znalazłem [link] (https://help.github.com/articles/duplicating-a-repository#mirroring-a-repositoryory) przydatne. –

Odpowiedz

404

Różnica polega na tym, że podczas korzystania --mirror, wszystko sędziowie są kopiowane jak jest. Oznacza to wszystko: zdalne śledzenie oddziałów, notatek, refs/originalals/* (kopie zapasowe z gałęzi filtru). Sklonowane repo ma to wszystko. Jest również skonfigurowany w taki sposób, aby zdalna aktualizacja ponownie pobierała wszystko od miejsca pochodzenia (nadpisywanie skopiowanych punktów odniesienia). Pomysł polega na odzwierciedleniu repozytorium, aby mieć całkowitą kopię, aby można było na przykład przechowywać centralne repozytorium w wielu miejscach lub tworzyć kopie zapasowe. Pomyśl o prostym kopiowaniu repo, z wyjątkiem znacznie bardziej eleganckiego sposobu.

Nowy documentation dość dużo mówi wszystko:

--mirror

Ustaw lustro repozytorium źródłowego. To implikuje --bare. W porównaniu do --bare, --mirror nie tylko mapuje lokalne gałęzie źródła do lokalnych oddziałów celu, mapuje wszystkie odwołania (w tym odległe gałęzie, notatki itp.) I konfiguruje konfigurację refspec tak, że wszystkie te dane są zastępowane przez git remote update w docelowe repozytorium.

Mój oryginalny odpowiedź również zauważyć różnice między nagim klonu i normalnym (nie gołej) klon - non-gołe klon konfiguruje zdalne śledzenie oddziałów, tylko tworzenie lokalnego oddziału dla HEAD, natomiast gołej klonu bezpośrednio kopiuje gałęzie.

Załóżmy pochodzenie 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 literaturowe (refs/foo/bar, refs/foo/baz, który mogą to być notatki, skrytki, przestrzenie nazw innych programistów, kto wie).

  • git clone origin-url (non-gołe): dostaniesz wszystkie znaczniki skopiowanych, lokalny oddział master (HEAD) śledzenia zdalnego oddział origin/master i zdalnych oddziałów origin/next, origin/pu i origin/maint. Oddziały śledzenia są skonfigurowane tak, że jeśli zrobisz coś takiego jak git fetch origin, zostaną one pobrane zgodnie z oczekiwaniami. Wszelkie odległe gałęzie (w klonowanym pilocie) i inne informacje są całkowicie ignorowane.

  • git clone --bare origin-url: dostaniesz wszystkie znaczniki kopiowane, lokalne oddziały master (HEAD), next, pu i maint żadnych zdalnych oddziałów śledzenia. Oznacza to, że wszystkie gałęzie są kopiowane tak jak są i są całkowicie niezależne, bez oczekiwania ponownego pobierania. Wszelkie odległe gałęzie (w klonowanym pilocie) i inne informacje są całkowicie ignorowane.

  • git clone --mirror origin-url: każdy ostatni z tych dokumentów zostanie skopiowany tak jak jest. Dostaniesz wszystkie znaczniki, lokalne oddziały master (HEAD), next, pu i maint, odległe oddziały devA/master i devB/master, inne pozycje refs/foo/bar i refs/foo/baz. Wszystko jest dokładnie tak, jak było w klonowanym pilocie. Zdalne śledzenie jest skonfigurowane tak, że jeśli uruchomisz git remote update, wszystkie odwołania będą nadpisywane z punktu początkowego, tak jakbyś właśnie je skasował i zreklonował. Jak początkowo mówili doktorzy, jest to lustro. Ma być funkcjonalnie identyczną kopią, wymienną z oryginałem.

+0

Czy "normalny klon" odnosi się do klonu bez flag --bare lub --mirror? – Sam

+1

Tak, to prawda. Z gołym klonem, jak to jest napisane na stronie podręcznika, gałęzie są kopiowane również bezpośrednio (bez odwołań/zdalnych/pochodzenia, bez śledzenia). Edytowane w. – Cascabel

+0

Czy możesz dodać więcej przykładów użycia na temat różnicy, a nie tylko różnice wewnętrzne git? – cmcginty

39
$ git clone --mirror $URL 

jest krótko dłoń na

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

(skopiowane bezpośrednio z here)

Jak obecny człowiek-strona mówi:

porównaniu do --bare, --mirror nie tylko mapuje lokalne oddziały źródła do lokalnych oddziałów celu, mapuje wszystkie dane (tj włączając odległe gałęzie, notatki itp.) i konfiguruje konfigurację refspec tak, że wszystkie te dane są nadpisywane przez git remote update w repozytorium docelowym.

+3

Sądzę, że musiałbyś naśladować to za pomocą 'git fetch', żeby był identyczny. W każdym razie jest to rodzaj braku odpowiedzi - pytanie brzmi: "w jaki sposób pilot lustrzany/klon różnią się od normalnego?" – Cascabel

+0

nawet ja uważam, że to nie jest poprawna odpowiedź. –

+3

Naprawdę podoba mi się ten sposób demonstrowania różnicy. Mam nadzieję, że jest dokładna! Mam nadzieję, że hfs doda polecenie pobierania. – joeytwiddle

10

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

Lustro kopiuje dane z pilota i umieszcza je na własnym najwyższym poziomie - zastępuje własne pliki z danymi pilota.

Oznacza to, że gdy ktoś wyrywa z lustra i umieszcza lustrzane odbicie w swoim podkatalogu, otrzyma takie same znaki, jak na oryginale. Wynik pobierania z aktualnego lustra jest taki sam, jak pobieranie bezpośrednio z początkowego repozytorium.

18

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 odwołań (czego nie rozumiem.) Nie nazwałbym tego "funkcjonalnie identyczną kopią, wymienną 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 
9

nawet niejednoznaczny wyjaśnienie z dokumentacji GitHub na Duplicating a Repository:

Jak z nagim klonu, lustrzany klon obejmuje wszystkie zdalnych oddziałów i znaczniki, ale wszystkie odwołania lokalnych zostaną nadpisane przy każdym pobierał , więc zawsze będzie takie samo jak oryginalne repozytorium.

+1

Dziękuję; to wyjaśniło mi, że lokalne * znaczniki * zostaną nadpisane, a także gałęzie przy użyciu klonu lustrzanego. Bardzo pomocne. – Wildcard

+0

Możesz także użyć '--prune' podczas uruchamiania git fetch, aby usunąć lokalne odwołania, które nie są już na pilocie. – nishanths

7

Dodaję obrazek, pokaż config różnicę między lustrem a gołym. enter image description here Lewy jest pusty, prawy jest lustrem.Możesz być jasne, plik konfiguracyjny lustra mają fetch klucz, co oznacza, że ​​można go zaktualizować, przez git remote update lub git fetch --all