Git clone --mirror ve git clone --bare arasındaki fark nedir


486

Git klon yardım sayfası hakkında şunları söyleyebilir --mirror:

Uzak deponun bir aynasını ayarlayın. Bu ima eder --bare.

Ancak, --mirrorklonun bir --bareklondan nasıl farklı olduğu hakkında ayrıntılara girmez .


3
yararlı, ancak bu aynayı github gibi uzak bir repoya da itmek istiyorsanız, bu bağlantıyı kullanışlı buldum .
yemek yiyin

Yanıtlar:


569

Fark kullanırken olmasıdır --mirror, bütün hakemler kopyalanır olduğu gibi . Bu her şey anlamına gelir: uzaktan izleme dalları, notlar, referanslar / orijinaller / * (filtre kolundan yedeklemeler). Klonlanmış repo her şeye sahiptir. Ayrıca, uzaktan güncellemenin başlangıçtan itibaren her şeyi yeniden alacağı şekilde ayarlanır (kopyalanan referansların üzerine yazılır). Buradaki fikir, veri havuzunu yansıtmak, toplam bir kopyaya sahip olmaktır, böylece örneğin merkezi deponuzu birden fazla yerde barındırabilir veya yedekleyebilirsiniz. Çok daha zarif bir git yolu dışında, repoyu kopyalamayı düşünün.

Yeni belgeler hemen hemen tüm bunları söylüyor:

--mirror

Kaynak havuzun bir aynasını ayarlayın. Bu ima eder --bare. İle karşılaştırıldığında --bare, --mirrorsadece hedefin yerel dallarına kaynağının yerel şubesi haritalar, bütün bu hakemler bir tarafından yazılır böyle bir refspec konfigürasyonda yukarı ve setleri (uzaktan dalları, notlar vb dahil) tüm ref eşleyen git remote updatehedef depoda .

Orijinal cevabım ayrıca çıplak bir klon ile normal (çıplak olmayan) bir klon arasındaki farkları da kaydetti - çıplak olmayan klon, uzaktan izleme dallarını kurar, sadece yerel bir dal HEADyaratırken, çıplak klon dalları doğrudan kopyalar.

Varsayalım kökenli birkaç şubesi (sahiptir master (HEAD), next, pu, ve maint), bazı etiketler ( v1, v2, v3), bazı uzak dalları ( devA/master, devB/master) ve diğer bazı ref ( refs/foo/bar, refs/foo/baz, notlar, miktarlarsa, diğer DEVS' ad, kim bilir olabilir).

  • git clone origin-url(non-çıplak): Sen kopyalanan etiketlerinin tüm alacak, yerel bir şube master (HEAD)uzak şube izleme origin/masterve uzaktan dalları origin/next, origin/puve origin/maint. İzleme dalları, böyle bir şey git fetch originyaparsanız, beklediğiniz gibi getirilecek şekilde ayarlanır . Tüm uzak dallar (klonlanmış uzaktan kumandada) ve diğer referanslar tamamen yok sayılır.

  • git clone --bare origin-url: Sen Kopyalanan etiketleri, yerel şubeleri tüm alacak master (HEAD), next, pu, ve maint, uzaktan izleme dalları. Yani, tüm dallar olduğu gibi kopyalanır ve tamamen bağımsızdır, tekrar getirme beklentisi yoktur. Tüm uzak dallar (klonlanmış uzaktan kumandada) ve diğer referanslar tamamen yok sayılır.

  • git clone --mirror origin-url: Bu referanslardan her biri olduğu gibi kopyalanacaktır. Sen tüm etiketler yerel kollarının alırsınız master (HEAD), next, pu, ve maint, uzaktan dalları devA/masterve devB/masterdiğer ref refs/foo/barve refs/foo/baz. Her şey tam olarak klonlanmış uzaktan kumandadaki gibi. Uzaktan izleme, git remote updatetüm aynaları silerseniz, aynayı silip yeniden kurmuş gibi tüm referansların üzerine yazılacak şekilde ayarlanır . Dokümanların başlangıçta söylediği gibi, bir ayna. Orijinaliyle değiştirilebilir, işlevsel olarak aynı bir kopya olması gerekiyordu.


"Normal klon", - çıplak veya ayna bayraksız bir klon mu ifade eder?
Sam

1
Evet öyle. Çıplak bir klonla, man sayfasında söylendiği gibi, dallar da doğrudan kopyalanır (refs / uzaktan kumanda / orijin yok, izleme yok). Düzenlendi.
Cascabel

Sadece git-internal farkları değil, fark hakkında biraz daha kullanım örneği ekleyebilir misiniz?
cmcginty

@Casey aradığın şey bu mu? Başlangıçta yazdığım şeyin "iç" olduğunu düşünmemiştim - etiketler ve dallar çok porselen özellikler.
Cascabel

"Olduğu gibi kopyalanan dallar", dalların klondaki aynı göreli yola kopyalandığı anlamına mı gelir? Yoksa dalların bir şekilde dönüştüğü anlamına mı geliyor?
Sam

56
$ git clone --mirror $URL

için kısa el

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

(Doğrudan buradan kopyalanır )

Mevcut kılavuz sayfanın nasıl koyduğu:

İle karşılaştırıldığında --bare, --mirrorsadece hedefin yerel dallarına kaynağının yerel şubesi haritalar, bütün bu hakemler bir tarafından yazılır böyle bir refspec konfigürasyonda yukarı ve setleri (uzaktan dalları, notlar vb dahil) tüm ref eşleyen git remote updatehedef depoda .


4
git fetchAslında aynı olması için bunu bir ile takip etmek zorunda kalacağınıza inanıyorum . Her neyse, bu bir çeşit cevap vermiyor - sorunun amacı "bir ayna uzaktan kumandası / klonu normal olandan nasıl farklı?"
Cascabel

6
Aslında farkı göstermenin bu yolunu seviyorum. Umarım doğrudur! Umarım hfs getirme komutunu ekler.
joeytwiddle

çok net değil, ör. $ (basename $ URL) ne tercüme ediliyor vb.
Kzqai

5
basenamebir yolun dizin bölümünü kaplayan normal unix yardımcı programıdır ve $()bash komutunun yerine kullanılır.
Victor Zamanian

6
Bu hala --mirroriçinde. Bu sadece ne yaptığını git remote add --mirroraçıklarsa kabul edilebilir bir cevap olacaktır .
Zenexer

24

Bugün git-2.0.0 ile yaptığım testler --mirror seçeneğinin kancaları, yapılandırma dosyasını, açıklama dosyasını, bilgi / hariç tutma dosyasını ve en azından test durumumda birkaç referans ( anladım.) Buna "orijinaliyle değiştirilebilir, işlevsel olarak özdeş bir kopya" demezdim.

-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

14

Bir Havuzu Çoğaltma ile ilgili GitHub belgelerinden nüanslı bir açıklama :

Çıplak bir klonda olduğu gibi, yansıtılmış bir klon tüm uzak dalları ve etiketleri içerir, ancak her getirdiğinizde tüm yerel referansların üzerine yazılır, bu nedenle her zaman orijinal havuzla aynı olacaktır.


1
Teşekkür ederim; bu benim için yansıtılmış bir klon kullanılarak yerel etiketlerin ve dalların üzerine yazılacağını açıkladı . Çok yararlı.
Wildcard

2
--pruneGit uzaklığını çalıştırırken, artık uzaktan kumandada olmayan yerel başvuruları kaldırmak için de kullanmak isteyebilirsiniz .
nishanths

13

Bir klon referansları uzaktan kumandadan kopyalar ve bunları 'bunlar uzaktan kumandanın sahip olduğu referanslardır' adlı bir alt dizine doldurur.

Bir ayna referansları uzaktan kumandadan kopyalar ve kendi üst seviyesine koyar - kendi referanslarını uzaktan kumanda ile değiştirir.

Bu, birisi aynanızdan çekip aynanın referanslarını alt dizinine doldurduğunda, orijinalindekiyle aynı referansları alacakları anlamına gelir. Güncel bir aynadan getirmenin sonucu, doğrudan ilk repodan getirmeyle aynıdır.


12

Bir resim ekliyorum, configayna ve çıplak arasındaki farkı gösteriyorum . resim açıklamasını buraya girin Sol çıplak, sağ ayna. Net olabilirsiniz, mirror'ın yapılandırma dosyasında bir fetchanahtar vardır, yani git remote updateveya tarafından güncelleyebilirsinizgit fetch --all


3
$ git clone --bare https://github.com/example

Bu komut yeninin kendisini $ GIT_DIR yapar. Ayrıca uzaktan kumandadaki dal başları, haritalama yapılmadan doğrudan ilgili yerel dal başlarına kopyalanır. Bu seçenek kullanıldığında, ne uzaktan izleme dalları ne de ilgili yapılandırma değişkenleri oluşturulur.

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

Çıplak bir klonda olduğu gibi, yansıtılmış bir klon tüm uzak dalları ve etiketleri içerir, ancak her getirdiğinizde tüm yerel referansların (uzaktan izleme dalları, notlar vb. Dahil) üzerine yazılır, bu nedenle her zaman orijinal havuzla aynı olacaktır. .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.