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.
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.
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?
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 .
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
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.
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.
Dodaję zdjęcie, pokazuję configróżnicę między lustrem a gołym.
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
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 .
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:
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
, imaint
), 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łuorigin/master
i zdalnych oddziałóworigin/next
,origin/pu
orazorigin/maint
. Gałęzie śledzące są skonfigurowane tak, że jeśli zrobisz coś takiegogit 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łówmaster (HEAD)
,next
,pu
, imaint
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łymaster (HEAD)
,next
,pu
imaint
, zdalne branżedevA/master
idevB/master
, inne pozycje literaturyrefs/foo/bar
irefs/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.źródło
jest skrótem do
(Kopiowane bezpośrednio stąd )
Jak to przedstawia obecna strona podręcznika:
źródło
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, cogit 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”.
źródło
Szczegółowe wyjaśnienie z dokumentacji GitHub na temat powielania repozytorium :
źródło
--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.
źródło
Dodaję zdjęcie, pokazuję
config
różnicę między lustrem a gołym. Lewy jest nagi, prawy to lustro. Możesz być czysty, plik konfiguracyjny kopii lustrzanej mafetch
klucz, co oznacza, że możesz go zaktualizować za pomocągit remote update
lubgit fetch --all
źródło
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.
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 .
źródło