--Depth 1 ile sığ klonlama, taahhüt oluşturma ve güncellemeleri tekrar çekme güvenli midir?


280

--depth 1Seçeneğindeki git clone:

Belirtilen revizyon sayısına kesilmiş bir geçmişe sahip sığ bir klon oluşturun . Sığ bir havuzun birtakım sınırlamaları vardır (ondan klonlayamaz veya getiremez, ne de ondan içeri itemezsiniz), ancak yalnızca uzun bir geçmişe sahip büyük bir projenin yakın geçmişiyle ilgileniyorsanız ve düzeltmeleri yama olarak gönder.

Ama başarılı bir şekilde sığ bir klon yaptım, bazı değişiklikler yaptım ve bu değişiklikleri (çıplak klon) kökenine geri ittim .

Bana mantıklı geliyor - yani neden olmasın? klonlanmış KAFA başlangıçta tanımlanabilir olduğunda ve benim taahhüdüm bunun üstüne geldiğinde, hiçbir neden yok gibi görünüyor. Ancak kılavuz aksini söylüyor.

Sığ klon fikrini seviyorum - örneğin drupal çekirdek: 7'den başladığımda drupal 4'te neler olduğunu bilmem mümkün değil - ama kendimi ayağımdan vurmak istemiyorum.

Peki sığ klonlamak, içinde taahhütler geliştirmek, menşei güncellemelerine ayak uydurmak için tekrar çekmek güvenli midir?


13
İşte klon derinliği hakkında iyi bir tartışma oldu
Andy

Evet, ben de okurum, teşekkürler Andy. --orphankavram benziyor ve ben bir oyun hazırlamış olacaklar. Yine de dokümanların gerçeklerle eşleşmediğinden biraz sinirlenmiş [çünkü bunun için dokümanlar --orphan
doğruyu


1
Git 1.9 (1. Çeyrek 2014) sığ repo klonlamasını tamamen destekleyecek! Aşağıdaki cevabımı
VonC

1
Git 2.5 (2. Çeyrek 2015) tek bir getirme işlemini destekliyor! Cevabımı düzenledim, " Uzak git deposundan belirli bir taahhüdü çekin ".
VonC

Yanıtlar:


304

Git 1.9 / 2.0'ın (1. Çeyrek 2014) bu sınırlamayı kaldırdığını unutmayın . Nguyễn Thái Ngọc Duy ( ) ' dan gelen taahhüt 82fba2b'ye
bakınız :pclouds

Git artık sığ bir klondan veri aktarımını desteklediğine göre, bu sınırlamalar artık doğru değil.

Dokümantasyon şimdi okur :

--depth <depth>::

Geçmişi belirtilen sayıda düzeltmeye kesilmiş bir 'sığ' klon oluşturun.

Bu klon, sığ klonları olan / gelen klon, gönderme-paketi / alma-paketini destekleyen 0d7d285 , f2c681c ve c29a7b8 gibi taahhütlerden kaynaklanmaktadır .
smart-http artık sığ getirme / klonu da destekliyor .

Tüm ayrıntılar " shallow.c: yeni işlemlerin seçilmesi için 8 adım.git/shallow " içindedir .

Haziran 2015 Güncellemesi: Git 2.5 tek bir işlem yapılmasına bile izin verecek !
(Ultimate sığ kasa)


Ocak 2016 Güncellemesi: Git 2.8 (Mach 2016) artık resmi olarak minimal bir tarih edinme uygulamasını belgeliyor.
Bkz 99487cf işlemek , 9cfde9e işlemek , (30 Aralık 2015) 9cfde9e işlemek , (2015 Aralık 30) bac5874 işlemek (2015 29 Aralık) ve 1de2e44 taahhüt tarafından (28 Ara 2015) ( ``) Stephen P. Smith .
(Göre Birleştirilmiş Junio Cı Hamano - gitster- içinde işlemek 7e3e80a , 20 Ocak 2016)

Bu " Documentation/user-manual.txt"

A <<def_shallow_clone,shallow clone>>, git-clone --depthanahtar belirtilerek oluşturulur .
Derinlik daha sonra git-fetch --depthanahtarla değiştirilebilir veya tam geçmiş geri yüklenebilir --unshallow.

A içinde <<def_shallow_clone,shallow clone>>birleştirmek yakın tarihte bir birleştirme tabanı olduğu sürece çalışır.
Aksi takdirde, ilgisiz geçmişleri birleştirmek gibi bir şey olacaktır ve büyük çatışmalara neden olabilir.
Bu sınırlama, böyle bir havuzun birleştirme tabanlı iş akışlarında kullanılması uygun olmayabilir.

2020 Güncellemesi:

  • git 2.11.1 git fetch --shallow-exclude=tüm geçmişin getirilmesini önleme seçeneği sunuldu
  • git 2.11.1 git fetch --shallow-since=eski taahhütlerin alınmasını önlemek için bir seçenek sundu .

Sığ klon güncelleme işlemi hakkında daha fazla bilgi için bkz. " Git sığ klon nasıl güncellenir? ".


Richard Michael tarafından yorumlandığı gibi :

geçmişi doldurmak için: git pull --unshallow

Ve Olle Härstedt yorumlara şunları ekliyor :

Doldururuz için kısmını tarihin: git fetch --depth=100.


3
Sadece " evet , git sürümünüz 4+ yaşında ve birleştirme tabanı yakın tarihte olduğu sürece " diyecek çok fazla metin
Boris

3
@Boris bu cevap bana çok yardımcı çünkü sığ klon kullanmaya şüpheliydim. Daha önce bir taahhüt ve birleştirme yaparken bazen kırılıyor. bu cevap kısa bir tarihçedir, neden şimdi gerçekleştiğini ve nasıl düzgün bir şekilde yapılacağını açıklar.
Yana Agun Siswanto

6

Benzer sorumun cevaplarından bazılarına neden-cant-i-push-from-a-shallow clone ve git listesindeki son iş parçacığının bağlantısına bakın.

Nihayetinde, 'derinlik' ölçümü depolar arasında tutarlı değildir, çünkü (a) Kafanız veya (b) klonladığınız / getirdiğiniz taahhüt (ler) veya (c) başka bir şey yerine kendi HEAD'lerinden ölçerler aklınızda vardı.

Sabit bit, kişinin Kullanım Durumunu doğru (yani kendi kendine tutarlı) hale getiriyor, böylece dağıtılmış ve bu nedenle muhtemelen ıraksak depolar yine de birlikte mutlu bir şekilde çalışacak.

checkout --orphanDoğru 'kurulum' aşamasına benziyor , ancak yine de "klon" adımında temiz (yani basit bir anlaşılabilir tek satır komutu) rehberlikten yoksundur. Aksine, initbir repoya sahip olmanız gibi görünüyor , bir remoteizleme dalı (sadece bir dal mı istiyorsunuz?) Ve daha sonra fetchhatalar için daha fazla fırsatla uzun süre sarılmış hisseden tek dal.

Düzenleme: 'Klon' adımı için bu cevaba bakınız


1
Tanklar Philip. Uzak bir dalın getirilmesi geçmişin tamamını çekecektir (AFAIK). Göreceli derinlikler hakkında haklısın, gerçekten tarihte uygun bir nokta istiyorum (git merge-base 7.x 7.0 benim durumumda gibi)
artfulrobot

@artfulrobot: '--orphan' yöntemi, kısa bir dar 'klon' (yani odaklanmış bir segment) oluşturmanıza ve daha sonra uygun bir repo gibi kullanmanıza olanak tanır. Henüz öfkeyle denemediğim bir şey ama yakında kanıtlamam gereken bir şey.
Philip Oakley
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.