Git ile belirli bir dizin nasıl çekilir


193

Git ile bir proje var ve ben sadece kime veya sadece subversion yaptığı gibi myproject / javascript gibi belirli bir dizini çekmek istiyorum.
bazı değişiklikler yapın, taahhüt edin ve tekrar geri itin.
Mümkün?


3
seyrek ödeme sizi ilgilendirebilir (yine de her şeyi getirmeniz
gerekse de

Yanıtlar:


205
  1. repo kopyanızın üstüne cd
  2. git fetch
  3. git checkout HEAD path/to/your/dir/or/file

    • Nerede " path/..." (3) sadece repo kök içeren altında dizinde başlar içinde sizin " .../file"

    • "HEAD" yerine belirli bir taahhüdün karma kodunun kullanılabileceğini ve daha sonra bu kesinliğe özgü revizyonu (dosya) veya revizyonları (dir) alacağınızı unutmayın.


1
Soruyu yanlış anladığımı fark ettim. Cevabım bunun yerine tek bir dosyanın nasıl teslim alınacağını ele alıyor.
vergueishon

Sorunun başlığını ele aldınız, ki bu yeterince iyi. Bu beni kurtardı, endişelendiğim kadarıyla, bu doğru cevap - özellikle de bu sorun için Google'da en çok hit olduğu için.
Morgon

21
Bu yine de tüm repoyu alıyor. 2GB boyutundaki bir proje için bu çok zaman kazandırmaz ..
Pithikos

5
Bu yorumları okuyan ve bunun soruya nasıl cevap vermediğini bilmeyenler için, bu çözümün yaptığı şey size sadece bir klasörün bir kopyasını vermek, ancak çalışan bir kopya değil, yani değiştiremezsiniz ve yeniden -commit. @Morgon'un dediği gibi, sorunun başlığına hitap eder (sadece bir direk çekebilirsiniz), ancak sorunun gövdesine cevap vermez ("bazı değişiklikler yapın, taahhüt edin ve tekrar geri itin").
msb

@StanHolodnak --gerekli değildir. Bundan sonraki bitleri bir yol olarak yorumlamaya zorlar. Yani, evet, --helpödeme yapmak istediğiniz ada sahip bir dosyanız varsa, bu tire ile ön ek yapmanız gerekir:git checkout HEAD -- --help
Tim Visée

105

Boş bir dizinde:

git init
git remote add [REMOTE_NAME] [GIT_URL]
git fetch REMOTE_NAME
git checkout REMOTE_NAME/BRANCH -- path/to/directory

Bu sadece yerel dosyayı değiştirmek için bir dosyanın uzak sürümünü kullanmak istiyorsanız çalışır, sanırım
John

Bu da klasörü çekmek, nasıl klasör donwload değil, sadece klasör içindeki şeyler?
Al Kasih

Komutlara fetchveya checkoutkomutlara gerek yoktur remote add, tüm ana dalı almak için komuttan sonra çekme isteğini basitçe yapabiliriz .
Iqra.

2
Pithkos'un kabul edilen cevaba işaret ettiği gibi, bu cevap da BÜTÜN uzak deposunu yerel makinenize indirecektir. Shingara'nın cevabı en açık olanıdır - bir repo'nun bir kısmını uzaktan çekmenin bir yolu yoktur. Ancak, BÜTÜN alımının bant genişliğini önemsemeyenler ve yerel önbelleğin bir bölümünün çalışan bir kopyasını almakla ilgilenenler için, kabul edilen cevap size nasıl olduğunu gösterir. Ancak sadece repo tarihinin (sıkıştırılmış biçimde) makinenize indirilmesi gerektiğini netleştirmek istiyorum.
Gabe Halsmer

39

Çok bir cevap aradıktan sonra bulmak değil, vazgeçmek, tekrar denemek vb. Sonunda başka bir SO iş parçacığında buna bir çözüm buldum:

Bir klasör dışında tümünü git-pull nasıl

Neleri kopyalayıp yapıştırmak için:

git init
git remote add -f origin <url>
git config core.sparsecheckout true
echo <dir1>/ >> .git/info/sparse-checkout
echo <dir2>/ >> .git/info/sparse-checkout
echo <dir3>/ >> .git/info/sparse-checkout
git pull origin master

OP'nin istediklerini yapmak için (sadece bir dir üzerinde çalışın), .git/info/sparse-checkoutyukarıdaki adımları uygularken o dir 'ü ekleyin .

@Cforbish'e çok teşekkürler!


2
Ben burada çoğunlukla ben bunu nasıl google denemek çalıştığınızda, bu en iyi sonuç ve bu iş parçacığı görüntülenmeye yakın değildir çünkü ben burada yayınlıyorum. :( Kendimi kötü yapıştırma gibi hissediyorum, ama bunun en iyi uygulamalar olduğunu mu sanıyorum?
msb

1
Tek temiz çözüm budur. Yukarıdaki cevapları denedim. Şubemi diğer cevaplarla kontrol ettikten sonra çekemedim ve işlemek gereken birkaç yeni dosyam vardı. Bu çözümle her şey doğru görünüyor. Ancak NOT: Teslim alınan şubeden bağımsız olarak git, içinde olduğunuzu düşünecektir master. Sadece emin yetinmek git branch --set-upstream-to=origin/<branch>doğru çekmeye
seebiscuit

12

Bu mümkün değil. Tüm havuzu veya hiçbir şeyi çekmeniz gerekiyor.


1
Her şeyi getirmeniz gerekse de, seyrek bir kasa çalışma ağacının çekilmesi bu durumda ilgi çekici olur mu? Bkz. Stackoverflow.com/questions/2416815/…
VonC

10
Sadece bunu eklemek için, sadece bir dizini çekememenizin nedeni git'in dosya semantik izlemeyi değil veri semantik izlemeyi kullanmasıdır, böylece kaynağa söylemek zorunda kalmadan kodu (veya diğer verileri) sorunsuz bir şekilde dosyalara girip çıkarabilirsiniz. izleme sistemi (tabii ki güncelleme kadar.) Bu nedenle, kod sorunsuz bir şekilde dizinlerin içine ve dışına hareket edebilir, bu yüzden sadece bir dizin kapmak çok mantıklı değil. Bu yardımcı olur umarım.
şeye gücü yeten

12
Maalesef @OmnipotentEntity ama IMHO yapar mantıklı. Uygulama kullanımı sınırlandırmamalıdır. Git, dizinlerin ne olduğunu biliyor (en azından yerel bir çalışma kopyası oluştururken), bu yüzden sunucuda benzer bir işlem gerçekleştirememesinin ve sadece ilgili çıktıyı göndermemesinin bir nedeni yok. Kabul ediliyor, bu şu anda uygulanmadı, ancak bu, temel bir imkansızlık değil, bir özellik eksikliğinden kaynaklanıyor. Şahsen ben çok önemli bir özellik olduğunu düşünüyorum ama hey, mümkün olduğunca gitmekten kaçınmamın bir nedeni bu.
Temel

10

Belki bu komut yardımcı olabilir:

git archive --remote=MyRemoteGitRepo --format=tar BranchName_or_commit  path/to/your/dir/or/file > files.tar

"Et voilà"


2
Bu, arşivleme amacıyla belirli bir dosya dizinini indirir, bu değiştirebileceğiniz ve geri itebileceğiniz bir kopya almaz.
leetNightshade

Çok havalı. Muhtemelen OP çözüm olarak kabul edilebilir fakat hangisi aslında değil ben sadece ben kesinlikle getirmek istemiyorum Repo daha da büyük bir büyük bir klasörün içeriğini aramanıza gerek, ve o zamandan beri ben değiştirmek gerekmez sonra oldu / it.
Oliver

7

Bir dizindeki en son değişiklikleri girmeden almak istiyorsanız, şunları yapabilirsiniz:

$ git -C <Path to directory> pull


1

Bu işleri denedim ve test edin!

mkdir <directory name> ;  //Same directory name as the one you want to pull
cd <directory name>;
git remote add origin <GIT_URL>;
git checkout -b '<branch name>';
git config core.sparsecheckout true;
echo <directory name>/ >> .git/info/sparse-checkout;
git pull origin <pull branch name>

Umarım bu yardımcı oldu!


0

Bazen, diffs'den geçmeden önce dosyaların önceki kopyalarına bakmak istersiniz.

Böyle bir durumda, bir havuzun klonunu yapmak ve ilgilendiğiniz belirli taahhüdü kontrol etmek ve o klonlanmış depodaki alt dizine bakmak kolaydır. Her şey yerel olduğundan, işiniz bittiğinde bu klonu silebilirsiniz.


-1

Teorik dosya yolları ve yaptığım gibi örneklerle tüm bu mücadele için, burada gerçek bir dünya örneği: Microsoft, belgelerini ve örneklerini git hub'da sunuyor, maalesef bu depodaki çok sayıda konu için tüm örnek dosyalarını topluyorlar:

https://github.com/microsoftarchive/msdn-code-gallery-community-s-z

Yalnızca yoldaki Microsoft Dynamics js dosyalarıyla ilgileniyordum

msdn-code-gallery-community-s-z/Sdk.Soap.js/

bu yüzden aşağıdakileri yaptım

oluşturmak

msdn-code-gallery-community-s-zSdkSoapjs\.git\info\sparse-checkout

diskteki depolarım klasöründeki dosya

git sparse-checkout init

o dizinde pencerelerde cmd kullanarak

Dosya içeriği

msdn-code-gallery-community-s-zSdkSoapjs\.git\info\sparse-checkout

dır-dir

Sdk.Soap.js/*

sonunda bir

git pull origin master
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.