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.
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.
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:
--mirrorSkonfiguruj 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 przezgit 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.
$ 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 przezgit remote updatew repozytorium docelowym .
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?”.
basenameto normalne narzędzie uniksowe, które usuwa część katalogu ze ścieżki i $()jest po prostu podstawieniem poleceń bash.
--mirrorw sobie. Byłaby to akceptowalna odpowiedź tylko, gdyby wyjaśniła, co git remote add --mirrorrobi.
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.
--prunepodczas 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 .