git sığ klon (klon - derinlik) uzak dalları özlüyor


105

Uzak bir depoyu klonladıktan sonra -a seçeneği ile herhangi bir uzak dalı göstermez. Sorun ne olabilir? Nasıl hata ayıklanır? Bu kod parçacığında uzak dallardan ikisi gösterilmemiştir:

$ git clone --depth 1 git://git.savannah.gnu.org/pythonwebkit.git
$ cd pythonwebkit
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
$ git --version
git version 1.8.3.1

Aynı komutu başka bir makinede denedim, iyi çalışıyor:

$ git clone --depth 1 git://git.savannah.gnu.org/pythonwebkit.git
Receiving objects: 100% (186886/186886), 818.91 MiB | 3.44 MiB/s, done.
$ cd pythonwebkit/
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/debian
  remotes/origin/master
  remotes/origin/python_codegen
$ git --version
git version 1.7.1

Başka bir depoyu da klonlamayı denedim, iyi çalışıyor. Bu makinede tekrar deneyebilirim ama neyin yanlış olduğunu bilmek daha iyi olur.

Herhangi bir öneri veya ipucu memnuniyetle karşılanacaktır.

Düzenleme: Cevap özeti: Git sürüm 1.8.3.2'den beri, "--depth" ve "--no-single-branch" önceki gibi aynı davranışı elde etmek için birlikte kullanılmalıdır. Bu bir hata düzeltmesi olarak kabul edilir.


3
masteryerel şubeniz. remotes/origin/masterkarşılık gelen uzak daldır. Soru tam olarak nedir?
michas

1
Ayrıntıları unuttunuz mu? Deneyingit branch -avv
jthill

Michas vs için: genellikle master'ı bir dal olarak adlandırmayız, kafa karışıklığı için üzgünüz. "iki uzak dal gösterilmiyor" eklendi. Jthill'e: Hatırlattığın için teşekkürler, haklısın.
minghua

1
Tanıttığın için teşekkürler git clone --depth=1 --no-single-branch, çoğu durumda ihtiyacım olan şey bu.
Alireza Muhammedadi

Yanıtlar:


62

Davranış doğrudur, son revizyondan sonra ana dal (çünkü bu birincil uzaktaki HEAD'dir), depodaki tek uzak daldır:

florianb$ git branch -a
        * master
          remotes/origin/HEAD -> origin/master
          remotes/origin/master

Tam klon, yeni (tümü) dallar sunar:

florianb$ git branch -a
        * master
          remotes/origin/HEAD -> origin/master
          remotes/origin/debian
          remotes/origin/master
          remotes/origin/python_codegen

Sığ klonlar

Teknik dokümantasyondaki yüzeysel tanım nedeniyle , " git-clone --depth 20 repo[...] en fazla 20 uzunluğa sahip taahhüt zincirlerinde [s] sonuçlanır. Bu nedenle sığ bir klon, bir dalın ucundan itibaren istenen taahhüt derinliğini içermelidir.

As - ek - belgelenmesi git cloneiçin --single-branch-seçenek açıklar:

"Tek bir dalın ucuna götüren geçmişi klonlayın, ya --branchseçenekle ya da uzaktaki birincil dalın HEADişaret ettiği nokta. Seçenekle sığ bir klon oluştururken , geçmişleri yakınına getirmek için verilmediği --depthsürece bu varsayılandır --no-single-branch. tüm dalların ipuçları. "

Bu nedenle sığ bir klon ( ile derinlik -Option) sadece getirir sadece tek dal (İstediğiniz derinlikte).


Maalesef her iki seçenek ( --depthve --single-branch) geçmişte hatalıydı ve sığ klonların kullanımı, verilen geçmişin yeniden yazılmasının neden olduğu çözülmemiş sorunları (yukarıda göndermiş olduğum bağlantıda okuyabileceğiniz gibi) ortaya çıkarıyor. Bu, özel durumlarda genel olarak biraz karmaşık davranışlara yol açar.


1
florianb: git sürümünüz nedir? denediğiniz için teşekkürler. 1.7.1'de --depth 1'i yaptım, şimdi tüm uzak dalları gösteriyor. soruyu bununla güncelledi. Sorunu doğrulamak için +1.
minghua

1
@minghua: 1.8.4 kullanıyorum - bu konuda bir yama varsa biraz araştırma yapacağım.
Florian Neumann

1
@minghua: "Sığ klonlar" hakkındaki yeni bulguları yansıtmak için düzenledim.
Florian Neumann

1
Tek bir şey dışında neredeyse mükemmel: "Depo sahibi diğer şubeleri kesmeye karar verdi" demek ne anlama geliyor? Sanırım o dallar hala orada.
minghua

2
--no-single-branch ayrıca tüm etiketleri klonlar. Yeni bir depo oluşturarak, tüm uzaktan kumandaları getirmek için aynı yapılandırmayı kullanarak, yani fetch = +refs/heads/*:refs/remotes/origin/*ve koşarak git fetch --depth 1(olmadan --tags) bunu önleyebiliriz . Config like kullanarak, getirilecek belirli etiketleri de ekleyebiliriz fetch = +refs/tags/v2.0.0:refs/tags/v2.0.0.
Sam Watkins

221

Sığ bir klon yaptıktan sonra, diğer şubeleri uzaktan kontrol edebilmek için ,

  1. Çalıştır (teşekkürler @jthill):

    git remote set-branches origin '*'
    
  2. Bundan sonra git fetch -v

  3. En sonunda git checkout the-branch-i-ve-been-looking-for


Adım 1, düzenleyerek manuel olarak da yapılabilir .git/config.

Örneğin, aşağıdaki satırı şundan değiştirin:

fetch = +refs/heads/master:refs/remotes/origin/master

için (değiştirmek masterile *):

fetch = +refs/heads/*:refs/remotes/origin/*

59
Ayrıca git remote set-branches origin '*'tüm şubeler için kullanabilirsiniz , *birini bir şube adı ile değiştirebilirsiniz .
jthill

Teşekkür ederim! Bu günümü kurtardı.
Steven Xu

Ne anlama -vvvgeliyor git fetch -vvv? Git-fetch belgesinde bununla ilgili herhangi bir bilgi bulamadım
guo

@guo, verbosityveya debuggünlükleme seviyesi içindir git. fetchYöntemden değil .
marlo

1
@ kawing-chiu Bu, çok fazla şubeniz varsa ve boyutu daha önce 'internet bağlantısı' için çok büyükse ve şimdi tüm bu dalları almaya gücünüz yetiyorsa yararlıdır. :)
marlo

68

Yanıtları ve @jthill'den gelen yorumları okumaktan, benim için en çok işe yarayan şey, komuttaki set-branchesseçeneği kullanmaktı git remote:

$ git clone --depth 1 https://github.com/dogescript/dogescript.git
$ git remote set-branches origin 'remote_branch_name'
$ git fetch --depth 1 origin remote_branch_name
$ git checkout remote_branch_name

Bu, adlandırılmış uzaktan kumanda tarafından izlenen dalların listesini değiştirir, böylece sadece gerekli dalı alıp ödünç alabiliriz.


18
git remote set-branches --add origin 'remote_branch_name'Yeni dalın, .git / config dosyasına getirmek için uzaktaki dallar listesinde (veya dal desenleri) yer değiştirmek yerine, var olanlara ek olması için kullanılması daha iyi olabilir .
dumbledad

2
OMG, tek alıntı 'önemlidirgit remote set-branches --add origin 'remote_branch_name'
Hafta Sonu

@Weekend Tek alıntıları dışarıda bırakana kadar bunu çalıştıramadım
PandaWood

@PandaWood Muhtemelen Windows kullanıyorsunuz. Yanıttaki "$" işareti Bash'i ima eder (Unix veya Cygwin / MSYS'de).
Yongwei Wu

Dokümanlarda gerekli olan tek alıntılarla ilgili hiçbir şey görmüyorum ve en azından macOS'ta bir tane olmadan iyi çalışıyor gibi görünüyor.
Nickolay
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.