Önce tüm depoyu kontrol etmeden seyrek bir ödeme yapmak mümkün mü?


171

Ödeme için saatler süren çok sayıda dosya içeren bir havuzla çalışıyorum. Git'in bu tür bir depo ile iyi çalışıp çalışmadığını şimdi seyrek check-out'ları destekleyip destekleyemeyeceğini, ancak bulabildiğim her örneğin aşağıdakileri yaptığını araştırıyorum:

git clone <path>
git config core.sparsecheckout true
echo <dir> > .git/info/sparse-checkout
git read-tree -m -u HEAD

Bu komut dizisiyle ilgili sorun, orijinal klonun da bir ödeme yapmasıdır. Özgün klon komutuna -n eklerseniz, okuma ağacı komutu aşağıdaki hatayla sonuçlanır:

hata: Seyrek ödeme çalışma dizinine giriş yapmıyor

İlk olarak tüm dosyaları kontrol etmeden seyrek ödeme nasıl yapılır?



Not: git 2.9 (Sadece 2016) ile git worktree add --no-checkoutde (sadece değil git clone --no-checkout) çalışacaktır . Aşağıdaki cevabımı
VonC

Burada tüm çözümleri denedikten sonra, sadece dizin (hayır sonradan iterek!) İndirir sadece bir tanesidir bu .
LondonRob

Yanıtlar:


24

2020'de .git dosyaları hakkında endişelenmenize gerek kalmadan seyrek ödeme ile başa çıkmanın daha basit bir yolu vardır. İşte nasıl yaptım:

git clone <URL> --no-checkout <directory>
cd <directory>
git sparse-checkout init --cone # to fetch only root files
git sparse-checkout set apps/my_app libs/my_lib # etc, to list sub-folders to checkout
# they are checked out immediately after this command, no need to run git pull

Git sürüm 2.25'in yüklü olması gerektiğini unutmayın. Bununla ilgili daha fazla bilgiyi buradan edinebilirsiniz: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/

GÜNCELLEME:

Yukarıdaki git clonekomut, dosyaları kontrol etmeden yine de repoyu tüm geçmişiyle klonlayacaktır. Tam geçmişe ihtiyacınız yoksa , komuta --depth parametresini şu şekilde ekleyebilirsiniz :

# create a shallow clone,
# with only 1 (since depth equals 1) latest commit in history
git clone <URL> --no-checkout <directory> --depth 1

1
Bu doğru, iyi bir nokta. Upvoted. Bu sparse-checkout --coneözelliği stackoverflow.com/a/59515426/6309
VonC

--filterBurada cevabınıza kısmi klon ( ) eklemeye değer .
Tao

1
@mropp, cevabı, --depthsığ bir klon yapmamıza izin veren parametre ekleyerek güncelledim . Bu yardımcı olacak mı? @Tao, --filterbu durumda nasıl kullanılacağından emin değilim, denemedim. Bir örnek verebilir misiniz veya bu konuya başka bir cevap gönderebilir misiniz?
Alexey Grinko

5
2.27 sürümünde aynı işe yaramıyor - neden bilmiyorum.
Blazes

1
Blazes'in 2.27'de artık çalışmadığını söylediği gibi, tekrar nasıl çalıştıracağını bulamıyor.
agemO

162

Bu yanıtın bir depodaki verilerin tam bir kopyasını indirdiğini lütfen unutmayın. git remote add -fKomut tüm depo klonlamak edecektir. Gönderen man sayfalarınagit-remote :

İle -fseçeneği, git fetch <name>uzaktan bilgi kurulduktan sonra hemen çalışır olduğunu.


Bunu dene:

mkdir myrepo
cd myrepo
git init
git config core.sparseCheckout true
git remote add -f origin git://...
echo "path/within_repo/to/desired_subdir/*" > .git/info/sparse-checkout
git checkout [branchname] # ex: master

Şimdi sadece / bu_po / / yolundaki / ve istenen_subdir yolundaki (ve bu yoldaki) dosyaları içeren bir "budama" kasanız olduğunu göreceksiniz.

Windows komut satırında yolu alıntılamamanız gerektiğini, yani 6. komutu bu komutla değiştirmeniz gerektiğini unutmayın:

echo path/within_repo/to/desired_subdir/* > .git/info/sparse-checkout

eğer yoksa, teklifleri seyrek ödeme dosyasında alırsınız ve çalışmaz


3
"Git checkout [branchname]" komutunu kullanamıyorum (ayrıca hata bulundu: Seyrek checkout çalışma dizinine giriş yapmıyor). "Git pull origin master" ı kullandım ve düzgün çalışıyor.
Natty

2
Linux üzerinde git sürüm 1.7.2.5 ile, aşağıdaki sonuçları aldım: echo 'dir / *' sadece dir / ancak alt dizinlerindeki dosyaları denetler ; echo 'dir /' (asterix yok!) dir / altındaki tüm ağacı doğru şekilde kontrol eder. HTH
Pavek

37
Bu sadece düz benim için işe yaramadı - "git remote" komutu tüm repo teslim ile sonuçlandı - bam! - tamam öyleyse; bu nedenle aşağıdaki komutlarda "git config ..." ve ilgilenilen bir alt dizinin belirtiminin bir etkisi olmamıştır. "Git remote" komutunda belirtilen repo URL'si yalnızca üst düzey .git dosyasının yolu mu? Yoksa ilgilenilen alt dirence giden bir yol mu olmalı?
Rob Cranfill

10
İşte akıcı bir sürüm (dizini manuel olarak oluşturmaya, bir init ve uzaktan ekleme yapmaya gerek yok, sadece normal git klonunu + @onionjake tarafından belirtildiği gibi --no-checkout seçeneğiyle ödeme döngüsünü yapın): git clone --no-checkout <project> cd <project> echo <dir>> .git / info / sparse-checkout git checkout <branch>
Gregor

22
git remote addKomut indirme herşey bu ne çünkü -fyapar - Eğer seyrek çıkış seçenekleri tanımladığınız önce hemen, almaya söyler. Ama bu işe yaramıyor ya da yeniden sıralamak yardımcı olmayacak. Seyrek kasalar depoyu değil, sadece çalışma ağacını etkiler. Deponuzun bunun yerine diyet yapmasını istiyorsanız, bunun yerine --depthveya --single-branchseçeneklerine bakmanız gerekir .
Miral

43

Git klonunun istediğinizi yapan bir seçeneği ( --no-checkoutveya -n) vardır.

Komut listenizde şunları değiştirmeniz yeterlidir:

git clone <path>

Buna:

git clone --no-checkout <path>

Daha sonra, soruda belirtildiği gibi seyrek ödemeyi kullanabilirsiniz.


7
Evet, bir ödeme yapmaz, ancak yine de tüm repo geçmişini indirmek için bir getirme yapar
Jason S

9
@ JasonS sorusu özellikle ödeme yapmama ile ilgiliydi. Eğer istemiyorsanız, o zaman tüm geçmiş --depth <depth>git klonundaki seçeneği kullanın . Bu sadece <depth>tarihin son taahhütlerini indirecektir . Şu anda git ile tek bir taahhüdü kısmen indirmenin bir yolu yoktur, ancak uzaktan kumandanız destekliyorsa git archive --remotekısmi dosya kümelerini indirmek için kullanabilirsiniz .
onionjake

Artık vfsforgit.org'u kullanarak herhangi bir dosya indirmeden bir taahhüdü 'kontrol edebilirsiniz' . Birisi yalnızca tek bir taahhüdün küçük bir alt kümesini kontrol etmeye çalışıyorsa bu yararlı olabilir.
onionjake

22

Ben sadece bir etiket için taahhüt ödeme ve dizinleri budamak dışında benzer bir kullanım durumu vardı. Kullanmak --depth 1onu çok seyrek yapar ve işleri hızlandırır.

mkdir myrepo
cd myrepo
git init
git config core.sparseCheckout true
git remote add origin <url>  # Note: no -f option
echo "path/within_repo/to/subdir/" > .git/info/sparse-checkout
git fetch --depth 1 origin tag <tagname>
git checkout <tagname>

3
- derinlik 1'e sığ klon denir, sadece FYI.
Mark Allison

1
Bu yardımcı oldu! Teşekkür ederim
kp123

1
Bunun için teşekkürler. Tüm depoyu indirmeyi önlemek için birçok yolu denedikten sonra bunu doğru anladım.
J ... S

12

Daha önce pavek tarafından gönderilen tek satırdan aradığım cevabı buldum (teşekkürler!) Bu yüzden Linux'ta çalışan tek bir cevapta tam bir cevap vermek istedim (GIT 1.7.1):

1--> mkdir myrepo
2--> cd myrepo
3--> git init
4--> git config core.sparseCheckout true
5--> echo 'path/to/subdir/' > .git/info/sparse-checkout
6--> git remote add -f origin ssh://...
7--> git pull origin master

Komutların sırasını biraz değiştirdim ama bunun bir etkisi yok gibi görünüyor. Anahtar, 5. adımdaki yolun sonunda "/" sondaki eğik çizginin varlığıdır .


3
bunun istediğinden emin misin? -f, tüm verileri almak anlamına gelir, yine de istemediğiniz diğer tüm bilgileri alırsınız ve yavaştır. (Bu hala "tüm depoyu kontrol ediyor")
Shuman

1
Windows'ta yukarıdaki adımları denedim ama yedek ödeme komut isteminde çalışmıyor, bu yüzden Git Bash kabuğunu denedim ve çalıştı !!. komut istemi push, pull vb. gibi tüm git komutlarını yürütebilir ancak seyrek ödeme söz konusu olduğunda başarısız olur.
user593029 06

Yalnızca alt dizinin dosyaları nasıl yapılır. Yalnızca belirli alt dizin içindeki dosyaları almak istiyorum.
Babish Shrestha

@BabishShrestha onionjake tarafından diğer yanıt FWIW yorum görmek: |
rogerdpack

9

Ne yazık ki yukarıdakilerin hiçbiri benim için çalışmadı, bu yüzden farklı kombinasyonları denemek için çok uzun zaman geçirdim sparse-checkout dosya .

Benim durumumda IntelliJ IDEA yapılandırmalarıyla klasörleri atlamak istedim.

İşte yaptım:


Çalıştırmak git clone https://github.com/myaccount/myrepo.git --no-checkout

Çalıştırmak git config core.sparsecheckout true

.git\info\sparse-checkoutAşağıdaki içerikle oluşturuldu

!.idea/*
!.idea_modules/*
/*

Tüm dosyaları almak için 'git checkout -' komutunu çalıştırın.


Çalıştırmak için kritik bir şey, /* klasörün adından sonra .

Gitmiyorum 1.9


3
Hayır, hala her şeyi, tüm taahhütleri ve tüm dosyaları
indiriyor

6
Seyrek kasalar sadece çalışan ağacı etkiler. Havuz boyutunu veya getirilenleri etkilemezler. İsterseniz farklı seçeneklere ihtiyacınız var.
Miral

Windows'ta çalışıyorsanız Git Bash Shell'i bir dahaki sefere deneyin ve 'pbetkier' ile yukarıdaki adımları kullanın
user593029 06

6

Evet, tüm deposu indirmek yerine bir klasör indirmek mümkün. Herhangi bir / son taahhüt bile

Bunu yapmanın güzel yolu

D:\Lab>git svn clone https://github.com/Qamar4P/LolAdapter.git/trunk/lol-adapter -r HEAD
  1. -r HEAD yalnızca son düzeltmeyi indirir, tüm geçmişi yok sayar.

  2. Not gövde ve / özgül-klasör

URL'yi önce ve sonra kopyalayıp değiştirin /trunk/. Umarım bu birisine yardım eder. Zevk almak :)

Güncelleme tarihi: 26 Eylül 2019


sadece svn'den gelen veya kullananlara uygulanabilir. Bunu onaylamaz.
C Johnson

@CJohnson gördüğünüz gibi, git repo klasörünü klonluyorum. İyi çalışıyor
Qamar

1
Bunun git'in kutudan çıktığı bir şey olmadığını, Git hub'ının normal Git teklifinin yanında sunduğu bir şey olduğunu unutmayın . Ancak, kullanabileceğiniz zaman güzel çalışır. Teşekkürler!
Qix - MONICA

1
SO hakkındaki sayısız öneriden sizinki en özlü ve net çözümdür.
boardrider

5

Cevap 2020 güncellendi:

Şimdi Git 2.25 (Q1 2020) ilegit sparse-checkout ayrıntılı olarak sunduğum bir komut var

nicono 'ın cevabı kullanımını gösterir:

git sparse-checkout init --cone # to fetch only root files
git sparse-checkout add apps/my_app
git sparse-checkout add libs/my_lib

Bu gelmiştir Git 2.27 ile gelişti ve, "Yeniden Başvur" seyrek kasada bilen buraya kadar .
Git 2.28 ile git statusseyrek kullanıma alınmış bir depoda olduğunuzu belirtecektir.

Orijinal cevap: 2016

git 2.9 (2016 Haziran) genelleme olacaktır --no-checkoutseçeneği git worktree addile (eser sağlayan komuta bir repo için birden çalışma ağaçları )

Bkz . Ray Zhang ( ) tarafından yapılan ef2a0ac (29 Mar 2016 ) . Yardımcı: Eric Sunshine ( ) ve Junio ​​C Hamano ( ) . (Göre Birleştirilmiş Junio Cı Hamano - - içinde işlemek 0d8683c , 13 Nisan 2016)OneRaynyDay
sunshinecogitster
gitster

git worktreeAdam sayfa şimdi içerir:

--[no-]checkout:

Bununla birlikte, varsayılan olarak addkontroller <branch>, seyrek ödemeyi yapılandırma gibi--no-checkout özelleştirmeler yapmak için ödemeyi bastırmak için kullanılabilir .


4

Seyrek ödeme yalnızca belirli bir klasöre ilişkin adımlar:

1) git clone --no-checkout  <project clone url>  
2) cd <project folder>
3) git config core.sparsecheckout true   [You must do this]
4) echo "<path you want to sparce>/*" > .git/info/sparse-checkout
    [You must enter /* at the end of the path such that it will take all contents of that folder]
5) git checkout <branch name> [Ex: master]

FYI, ilk (1) adımda - no-checkout kullanmanıza gerek yoktur. Sadece tüm repoyu klonlayın ve ardından 2-5 (yukarıda belirtilen) tüm adımları yürütün, çıktıyı istediğiniz gibi elde edersiniz. Eğer anlamadıysan bana haber ver.
SANDEEP MACHIRAJU

4

Dayanarak bu cevabı ile apenwarr ve Bu yoruma göre Miral I klonlama sırasında disk alanı bana neredeyse% 94 kurtardı aşağıdaki çözüm geldi linux git depo yerel tek Belgeler alt dizini istemekle birlikte:

$ cd linux
$ du -sh .git .
2.1G    .git
894M    .
$ du -sh 
2.9G    .
$ mkdir ../linux-sparse-test
$ cd ../linux-sparse-test
$ git init
Initialized empty Git repository in /…/linux-sparse-test/.git/
$ git config core.sparseCheckout true
$ git remote add origin ../linux
# Parameter "origin master" saves a tiny bit if there are other branches
$ git fetch --depth=1 origin master
remote: Enumerating objects: 65839, done.
remote: Counting objects: 100% (65839/65839), done.
remote: Compressing objects: 100% (61140/61140), done.
remote: Total 65839 (delta 6202), reused 22590 (delta 3703)
Receiving objects: 100% (65839/65839), 173.09 MiB | 10.05 MiB/s, done.
Resolving deltas: 100% (6202/6202), done.
From ../linux
 * branch              master     -> FETCH_HEAD
 * [new branch]        master     -> origin/master
$ echo "Documentation/hid/*" > .git/info/sparse-checkout
$ git checkout master
Branch 'master' set up to track remote branch 'master' from 'origin'.
Already on 'master'
$ ls -l
total 4
drwxr-xr-x 3 abe abe 4096 May  3 14:12 Documentation/
$  du -sh .git .
181M    .git
100K    .
$  du -sh
182M    .

Bu yüzden 2.9GB'dan 182MB'ye indim, ki bu zaten sessiz güzel.

Gerçi git clone --depth 1 --no-checkout --filter=blob:none file:///…/linux linux-sparse-test( burada ima ) çalışmak için bu alamadım o zaman eksik dosyalar tüm kaldırıldı dosyaları olarak dizine eklendi. Herkes eşdeğer bilir Yani eğer git clone --filter=blob:noneiçin git fetch, muhtemelen biraz daha megabayt kaydedebilirsiniz. (Man sayfasını okumak git-rev-listda şunun gibi bir şey olduğunu ima eder:--filter=sparse:path=… , ama ben de işe yaramadı.

(Hepsi Debian Buster'dan git 2.20.1 ile denendi.)


1
İlginç geri bildirim. Upvoted. Ben de bilmiyorum --filter=sparse:path=….
VonC

3

Git için yeniyim ama her dizin için git checkout yaparsam işe yarıyor gibi görünüyor. Ayrıca, seyrek ödeme dosyasının belirtildiği gibi her dizinden sonra bir eğik çizgi olması gerekir. Daha tecrübeli biri lütfen bunun işe yarayacağını onaylayın

İlginç bir şekilde, seyrek ödeme dosyasında olmayan bir dizini teslim alırsanız, hiçbir fark yok gibi görünüyor. Git durumunda görünmezler ve git read-tree -m -u HEAD kaldırılmasına neden olmaz. git reset --hard dizinin de kaldırılmasına neden olmaz. Herkes git gitmiş dizinler düşünüyor ama seyrek ödeme dosyasında olmayan dizinler hakkında yorum yapmak için daha deneyimli bakım?


1

Git 2.27'de git seyrek ödeme gelişti. Bu cevaptaki çözüm tam olarak aynı şekilde çalışmaz (git 2.25 ile karşılaştırıldığında)

git clone <URL> --no-checkout <directory>
cd <directory>
git sparse-checkout init --cone # to fetch only root files
git sparse-checkout set apps/my_app libs/my_lib # etc, to list sub-folders to checkout
# they are checked out immediately after this command, no need to run git pull

Bu komutlar daha iyi çalıştı:

git clone --sparse <URL> <directory>
cd <directory>
git sparse-checkout init --cone # to fetch only root files
git sparse-checkout add apps/my_app
git sparse-checkout add libs/my_lib

Ayrıca bakınız: git-clone --sparse ve git-sparse-checkout ekleme


1
İyi güncelleme. Upvoted. Buna göre kendi cevabımı düzenledim. Bu komutu 2019'da sundum: stackoverflow.com/a/59515426/6309
VonC

0

Benim durumumda, Podsprojeyi klonlarken klasörü atlamak istiyorum . Adım adım aşağıdaki gibi yaptım ve bu benim için çalışıyor. Umarım yardımcı olur.

mkdir my_folder
cd my_folder
git init
git remote add origin -f <URL>
git config core.sparseCheckout true 
echo '!Pods/*\n/*' > .git/info/sparse-checkout
git pull origin master

Not: Daha fazla klasör atlamak istiyorsanız, seyrek ödeme dosyasına daha fazla satır ekleyin.

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.