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 --mirror
klon różni się od --bare
klonu.
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 --mirror
klon różni się od --bare
klonu.
Odpowiedzi:
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
,--mirror
nie 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 przezgit remote update
w 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/master
i zdalnych oddziałów origin/next
, origin/pu
oraz 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 maint
gałę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
, pu
i maint
, zdalne branże devA/master
i devB/master
, inne pozycje literatury refs/foo/bar
i 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 update
wszystkie 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.
$ 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
,--mirror
nie 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 przezgit remote update
w repozytorium docelowym .
git fetch
za 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?”.
basename
to normalne narzędzie uniksowe, które usuwa część katalogu ze ścieżki i $()
jest po prostu podstawieniem poleceń bash.
--mirror
w sobie. Byłaby to akceptowalna odpowiedź tylko, gdyby wyjaśniła, co git remote add --mirror
robi.
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
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.
--prune
podczas uruchamiania git fetch, aby usunąć lokalne odwołania, których już nie ma na pilocie.
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.
$ 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 .