Güzel ve basit bir soru - "git fetch" işlevi katı bir alt küme git fetch --tags
midir?
Yani koşarsam git fetch --tags
, hemen git fetch
sonra koşmak için bir sebep var mı?
Ne hakkında git pull
ve git pull --tags
? Aynı durum?
Güzel ve basit bir soru - "git fetch" işlevi katı bir alt küme git fetch --tags
midir?
Yani koşarsam git fetch --tags
, hemen git fetch
sonra koşmak için bir sebep var mı?
Ne hakkında git pull
ve git pull --tags
? Aynı durum?
Yanıtlar:
Not: ile başlayan Git 1.9 / 2.0 (Q1 2014) , git fetch --tags
etiketler getirir ilaveten seçeneği olmadan aynı komut satırı ile getirilen nelerdir.
Michael Haggerty (mhagger) tarafından taahhüt c5a84e9'a bakınız :
Önceden, getirme işleminin "
--tags
" seçeneği refspec belirtmeye eşdeğer olarak kabul ediliyordurefs/tags/*:refs/tags/*
komut satırında; özellikle,
remote.<name>.refspec
yapılandırmanın göz ardı edilmesine neden oldu .Ancak diğer referanslar getirilmeden etiketlerin getirilmesi çok yararlı olmazken, diğer referanslara ek olarak etiketlerin getirilmesi de oldukça yararlıdır . Bu yüzden ikincisini yapmak için bu seçeneğin anlamını değiştirin.
Bir kullanıcı yalnızca etiketleri almak istiyorsa , açık bir refspec belirtmek yine de mümkündür:
git fetch <remote> 'refs/tags/*:refs/tags/*'
1.8.0.3'ten önceki belgelerin "
fetch --tags
" davranışının bu yönü hakkında belirsiz olduğunu lütfen unutmayın .
F0cb2f1 ( 2012-12-14 ) taahhüdüfetch --tags
dokümantasyonu eski davranışa uygun hale getirdi.
Bu işlem, belgeleri yeni davranışa uyacak şekilde değiştirir (bkz.Documentation/fetch-options.txt
).Alınan her şeye ek olarak tüm etiketlerin uzaktan kumandadan getirilmesini isteyin .
Git 2.5 (2. Çeyrek 2015) git pull --tags
daha sağlam olduğu için:
Bkz 19d122b taahhüt tarafından Paul Tan ( pyokagan
) , 13 Mayıs 2015
(tarafından Birleştirilmiş Junio C Hamano - gitster
- içinde cc77b99 işlemek 2015 22 Mayıs)
pull
:--tags
birleştirme adayı durumunda hatayı kaldırYana 441ed41 ("
git pull --tags
:". Daha iyi bir mesajla dışarı hatası, 2007-12-28, Git 1.5.4+),git pull --tags
eğer farklı bir hata mesajı yazdırmak istiyorumgit-fetch
herhangi birleştirme adayları dönmedi:It doesn't make sense to pull all tags; you probably meant: git fetch --tags
Bunun nedeni, o sırada
git-fetch --tags
yapılandırılmış refspec'leri geçersiz kılacağı ve dolayısıyla birleştirme adayı olmayacağıdır. Hata mesajı böylece karışıklığı önlemek için getirildi.Ancak, c5a84e9 (
fetch --tags
: diğer öğelere ek olarak etiketleri getir , 2013-10-30, Git 1.9.0+),git fetch --tags
yapılandırılmış refspec'lere ek olarak etiketleri getirir.
Bu nedenle, herhangi bir birleştirme adayı durumu meydana gelmezse, bunun nedeni--tags
belirlenmiş değildir . Bu nedenle, bu özel hata mesajı artık önemsizdir.Karışıklığı önlemek için bu hata iletisini kaldırın.
Git 2.11+ (2016 4. Çeyrek) git fetch
ile daha hızlı.
Bkz. Taahhüt: 5827a03 (13 Ekim 2016) - Jeff King ( peff
) .
(Göre Birleştirilmiş - Junio Cı Hamano gitster
- içinde 9fcd144 tamamlama 2016, 26 Eki)
fetch
:has_sha1_file
etiket takibi için "hızlı" kullanınTakip ettiğimiz dallarla alakasız birçok etiketi olan bir uzaktan kumandadan getirilirken, depomuzda (getirmeyeceğimiz!) Bir etiketin işaret ettiği nesnenin var olup olmadığını kontrol ederken çok fazla döngü harcıyorduk. dikkatlice.
Bu yama, eşzamanlı bir yeniden paketleme ile açık olabileceğimiz durumlarda, hız doğruluğunu feda etmek için HAS_SHA1_QUICK'i kullanmayı öğretir.
Yukarıda belirtilene benzer bir durum oluşturan dahil edilen mükemmel komut dosyasının sonuçları şunlardır:
Test HEAD^ HEAD
----------------------------------------------------------
5550.4: fetch 11.21(10.42+0.78) 0.08(0.04+0.02) -99.3%
Bu sadece aşağıdaki durumlarda geçerlidir:
reprepare_packed_git()
Pahalı hale getirmek için müşteri tarafında çok fazla paketiniz var (en pahalı kısım, şu anda ikinci dereceden olan sıralanmamış bir listede kopyaları bulmaktır).- Sunucu tarafında, otomatik takip için aday olan (yani istemcinin sahip olmadığı) çok sayıda etiket referansına ihtiyacınız vardır. Her biri paket dizininin yeniden okunmasını tetikler.
- Normal şartlar altında, müşteri bu etiketleri otomatik olarak takip eder ve bir büyük getirmeden sonra (2) artık doğru olmaz.
Ancak bu etiketler, istemcinin başka şekilde getirdiği bağlantıdan kopmuş bir tarihe işaret ediyorsa, asla otomatik olarak takip edilmez ve bu adaylar her getiride etkileyecektir.
Git 2.21 (2019 Şubat) ne zaman bir gerileme oluşturmuş gibi görünüyor yapılandırma remote.origin.fetch
olduğunu değil varsayılan bir ( '+refs/heads/*:refs/remotes/origin/*'
)
fatal: multiple updates for ref 'refs/tags/v1.0.0' not allowed
Git 2.24 (4. Çeyrek 2019) bir optimizasyon daha ekliyor.
Bakınız Masaya Suzuki ( ) tarafından taahhüt edilen b7e2d8b (15 Eyl 2019 ) . (Tarafından Birleştirilmiş - Junio C Hamano - içinde 1d8b0df taahhüt 2019 7 Ekim,)draftcode
gitster
fetch
:oidset
daha hızlı arama için istenen OID'leri tutmak için kullanınSırasında
git fetch
istemci, reklamı yapılan etiketlerin OID'lerinin getirme isteğinin OID ayarında olup olmadığını kontrol eder.
Bu kontrol doğrusal bir taramada yapılır.
Çok fazla referansa sahip bir havuz için, bu taramayı tekrarlamak 15 dakikadan fazla sürer.Bunu hızlandırmak için,
oid_set
diğer referansların OID'leri için bir a oluşturun .
git fetch <remote> <branch>
otomatik takip etiketlerinin davranışını değiştirme olasılığını tartışıyor (orijinal hedeflere göre uzaktan izlemeleri zaten güncellediğinden): public-inbox.org/git/…
Not: Bu cevap yalnızca git v1.8 ve daha eski sürümler için geçerlidir.
Bunların çoğu diğer cevaplarda ve yorumlarda söylendi, ancak kısa bir açıklama:
git fetch
tüm şube başlıklarını (veya remote.fetch yapılandırma seçeneği tarafından belirtilenleri), onlar için gerekli olan tüm işlemleri ve bu şubelerden erişilebilen tüm etiketleri getirir. Çoğu durumda, tüm etiketlere bu şekilde erişilebilir.git fetch --tags
tüm etiketleri getirir, onlar için gerekli olan tüm taahhütler. Bu olacak değil onlar getirilen vardı etiketlerinden ulaşılabilir bile, şube başkanları güncelleyin.Özet: Yalnızca getirmeyi kullanarak gerçekten güncel olmak istiyorsanız, her ikisini de yapmanız gerekir.
Komut satırına yazmayı kastediyorsanız, bu durumda takma adlar sorununuzu çözmezse "iki kat daha yavaş" değildir. Farklı bilgi talep ettiklerinden, iki talebin yapılmasında esasen herhangi bir ek yük yoktur.
git remote update
aslında yerini değildir git fetch
ve git fetch --tags
. git remote update
yeni etiketler getirmesine rağmen, var olan etiketleri güncellemez. Yalnızca git fetch --tags
mevcut etiketleri güncelleyecektir.
Buna kendim cevap vereceğim.
Bir fark olduğunu belirledim. "git fetch --tags" tüm etiketleri getirebilir, ancak yeni taahhüt getirmez!
Tamamen "güncel" olmak için bunu yapmak zorunda olduğu ortaya çıkıyor, yani bir "git pull" birleştirmeden çoğaltılmış:
$ git fetch --tags
$ git fetch
Bu bir utanç, çünkü iki kat daha yavaş. Sadece "git fetch" in normalde yaptığı şeyi yapma ve tüm etiketleri getirme seçeneği olsaydı .
git remote update myRemoteRepo
': Bu uzak içeriği ve etiketleri getirir mi?
git fetch
zaman yaparım ve sürekli olarak yeni taahhütleri ve yeni etiketleri çeker . Git'in hangi sürümünü kullanıyorsunuz?
git fetch
bir dalın taahhüt günlüğünde olmayan etiketleri almaz. jQuery UI bunu örneğin bir yayın etiketinde yapar. Bir git checkout -b temp-branch
sürüm yapıyoruz, sürümümüzü yapıyoruz, sürüm için gerekli dosyaları ekliyoruz, sürüm güncellemesini git commit -m "1.10.x" ; git tag 1.10.x; git push --tags
yapıyoruz , sonra yerel geçici şubemizi siliyoruz. Bu etikete ulaşan ve git fetch
hiçbir zaman indirmeyecek bir uzak şube yok .
Buradaki genel sorun git fetch
, getirilecek olmasıdır +refs/heads/*:refs/remotes/$remote/*
. Bu işlemlerden herhangi birinin etiketi varsa, bu etiketler de getirilir. Ancak, uzaktan kumandadaki herhangi bir dal tarafından erişilemeyen etiketler varsa, bunlar getirilmez.
--tags
Seçeneğini refspec geçer +refs/tags/*:refs/tags/*
. Sen olabilir sormak git fetch
hem kapmak için. Sadece git fetch && git fetch -t
aşağıdaki komutu kullanacağınızdan eminim :
git fetch origin "+refs/heads/*:refs/remotes/origin/*" "+refs/tags/*:refs/tags/*"
Bunu bu repo için varsayılan yapmak istiyorsanız, varsayılan getirmeye ikinci bir refspec ekleyebilirsiniz:
git config --local --add remote.origin.fetch "+refs/tags/*:refs/tags/*"
Bu, bu uzaktan kumanda için ikinci bir fetch =
satır ekleyecektir .git/config
.
Bunu bir proje için halletmenin yolunu aramak için biraz zaman harcadım. Ben de bunu buldum.
git fetch -fup origin "+refs/*:refs/*"
Benim durumumda bu özellikleri istedim
refs/*:refs/*
+
Refspec'den önce hızlı ileri olmayan yerel şubelerin ve etiketlerin üzerine yaz-u
-p
-f
--tags
Seçenek refspec değerini +refs/tags/*:refs/tags/*
" olarak değiştirir. Rağmen, man git-fetch
lider +
( refs/tags/*:refs/tags/*
) olmadan bu refspec belirtmek gibi görünüyor .
remote.origin.fetch
varsayılan +refs/heads/*:refs/remotes/origin/*
, yani +
sürüm, değil mi? (Bu, menşe / şube şu anda yerel olarak nerede olursa olsun, menşe / şubenin üzerine yazılacağı anlamına gelir.)
git --tags
etiketler getiriliyordu . @VonC'nin cevabına bakınız.
Çoğu durumda, git fetch
'uzak depodan yeni bir şey alın ve yerel şubelerinizle birleşmeden yerel kopyanıza koyun' olan istediğinizi yapmalısınız. git fetch --tags
tam olarak bunu yapar, ancak yeni etiketler dışında hiçbir şey almaz.
Bu anlamda, git fetch --tags
hiçbir şekilde bir üst küme değildir git fetch
. Aslında tam tersi.
git pull
, elbette, a için bir sarıcıdan başka bir şey değildir git fetch <thisrefspec>; git merge
. Atlamayı yapmadan önce manuel git fetch
ing ve git merge
ing yapmaya alışmanız önerilir, git pull
çünkü git pull
ilk etapta ne yaptığınızı anlamanıza yardımcı olur .
Bununla birlikte, ilişki tam olarak aynıdır git fetch
. git pull
'nin süper setidir git pull --tags
.
git pull
mu değil almak bütün etiketleri ancak mevcut şube kafalarından yalnızca ulaşılabilir. Ancak, git pull --tags
tüm etiketleri alır ve görünüşte eşdeğerdir git fetch --tags
.
git fetch upstream --tags
gayet iyi çalışıyor, sadece yeni etiketler alacak ve başka bir kod tabanı almayacak.
upstream
normalde denir origin
. Bence upstream
GitHub tarafından kullanılan bir isim. Her durumda, kullanılacak isim ile gösterilen addır git remote
.