Cara menarik direktori tertentu dengan git


193

Saya punya proyek dengan git, dan saya hanya ingin mengkloning atau menarik direktori tertentu, seperti myproject / javascript seperti halnya subversi.
buat beberapa perubahan, komit dan dorong kembali.
Itu mungkin?


3
checkout jarang mungkin menarik bagi Anda (meskipun Anda masih perlu mengambil semuanya): lihat stackoverflow.com/questions/2416815/…
VonC

Jawaban:


205
  1. cd ke bagian atas salinan repo Anda
  2. git fetch
  3. git checkout HEAD path/to/your/dir/or/file

    • Di mana " path/..." dalam (3) dimulai pada direktori tepat di bawah akar repo yang berisi " .../file" Anda

    • Perhatikan bahwa alih-alih "HEAD", kode hash dari komit tertentu dapat digunakan, dan kemudian Anda akan mendapatkan revisi (file) atau revisi (dir) khusus untuk komit itu.


1
Baru sadar saya salah paham soal itu. Sebaliknya, saya menjawab bagaimana cara checkout satu file, yang kemudian dapat dimodifikasi dan dikomit.
vergueishon

Anda menjawab judul pertanyaan, yang cukup bagus. Ini hanya menyelamatkan saya, jadi sejauh yang saya ketahui, ini adalah jawaban yang benar - terutama karena ini adalah hit teratas di Google untuk masalah ini.
Morgon

21
Ini masih mendapatkan seluruh repo. Untuk proyek berukuran 2GB, ini tidak menghemat banyak waktu ..
Pithikos

5
Bagi mereka yang membaca komentar ini dan tidak tahu bagaimana ini tidak menjawab pertanyaan, apa solusi ini adalah memberi Anda salinan hanya dari satu folder, tetapi itu bukan salinan yang berfungsi, yang berarti Anda tidak dapat memodifikasi dan kembali -melakukan. Jadi seperti yang dikatakan @Morgon, ini membahas judul pertanyaan (Anda BISA hanya menarik satu dir), tetapi tidak menjawab isi pertanyaan ("buat beberapa perubahan, komit, dan tekan kembali").
msb

@StanHolodnak --tidak diperlukan. Itu memaksa bit setelah itu untuk ditafsirkan sebagai jalan. Jadi, ya, jika Anda memiliki file dengan nama --helpyang ingin Anda checkout, awalan dengan tanda hubung ini diperlukan:git checkout HEAD -- --help
Tim Visée

105

Dalam direktori kosong:

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

ini berfungsi jika Anda hanya ingin menggunakan versi file yang jauh untuk mengganti file lokal, saya kira
John

ini tarik folder juga, bagaimana tidak meng-donwload folder, tetapi hanya hal-hal di dalam folder?
Al Kasih

Tidak perlu fetchatau checkoutperintah, kita bisa membuat permintaan tarik demi remote addperintah untuk mendapatkan seluruh cabang master.
Iqra.

2
Seperti yang ditunjukkan Pithkos dalam jawaban yang diterima, jawaban ini juga akan mengunduh repositori jarak jauh SELURUH ke mesin lokal Anda. jawaban shingara adalah yang paling jelas - tidak ada cara untuk menarik sebagian repo dari jarak jauh. Namun, bagi mereka yang tidak keberatan dengan bandwidth WHOLE fetch, dan tertarik untuk membuat copy pekerjaan dari sebagian cache lokal, maka jawaban yang diterima menunjukkan caranya. Tapi saya hanya ingin memperjelas seluruh sejarah repo (dalam format terkompresi) harus diunduh ke mesin Anda.
Gabe Halsmer

39

Setelah banyak mencari jawaban, tidak menemukan, menyerah, mencoba lagi dan seterusnya, saya akhirnya menemukan solusi untuk ini di utas SO lainnya:

Cara git-pull semua kecuali satu folder

Untuk menyalin-rekatkan apa yang ada di sana:

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

Untuk melakukan apa yang diinginkan OP (hanya bekerja pada satu dir), cukup tambahkan satu dir ke .git/info/sparse-checkout, ketika melakukan langkah-langkah di atas.

Banyak terima kasih banyak kepada @cforbish!


2
Saya mempostingnya di sini sebagian besar karena setiap kali saya mencoba google cara melakukan itu, ini adalah hasil teratas, dan utas itu bahkan tidak dekat untuk ditampilkan. :( Saya merasa copy-paste buruk, tapi saya rasa ini adalah praktik terbaik?
msb

1
Ini adalah satu-satunya solusi bersih. Mencoba jawaban di atas. Setelah saya memeriksa cabang saya dengan jawaban lain, saya tidak bisa menarik, dan memiliki beberapa file baru yang perlu dilakukan. Dengan solusi ini semuanya terlihat benar. Tetapi CATATAN: Terlepas dari cabang yang diperiksa, git akan berpikir Anda berada di master. Pastikan Anda melakukannya git branch --set-upstream-to=origin/<branch>dengan benar
seebiscuit

12

Itu tidak mungkin. Anda perlu menarik semua repositori atau tidak sama sekali.


1
Meskipun Anda perlu mengambil semuanya, apakah tarikan pada pohon yang berfungsi jarang menarik dalam kasus ini? Lihat stackoverflow.com/questions/2416815/…
VonC

10
Hanya untuk menambahkan ini, alasan mengapa Anda tidak dapat menarik hanya direktori adalah karena git menggunakan pelacakan semantik data, bukan pelacakan semantik file, sehingga Anda dapat dengan mulus memindahkan kode (atau data lain) masuk dan keluar dari file tanpa harus memberi tahu sumbernya sistem pelacakan (sampai Anda memperbarui tentu saja.) Karena itu, kode dapat bergerak masuk dan keluar dari direktori juga, jadi mengambil satu direktori saja tidak masuk akal. Semoga ini membantu.
OmnipotentEntity

12
@OmnipotentEntity Maaf tapi IMHO itu tidak masuk akal. Implementasinya seharusnya tidak membatasi penggunaan. Git tahu direktori apa itu (setidaknya ketika membuat copy pekerjaan lokal) sehingga tidak ada alasan ia tidak dapat melakukan beberapa operasi serupa di server dan hanya mengirim output yang relevan. Memang, itu tidak diterapkan saat ini tetapi itu karena kurangnya fitur, bukan ketidakmungkinan mendasar. Secara pribadi saya pikir ini adalah fitur yang cukup penting tapi hei, itu salah satu alasan saya menghindari git jika memungkinkan.
Dasar

10

Mungkin perintah ini bisa membantu:

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

"Et voilà"


2
Ini mengunduh direktori file tertentu untuk keperluan pengarsipan, ini tidak menarik salinan yang dapat Anda modifikasi dan tekan kembali.
leetNightshade

Sangat keren. Mungkin tidak dapat diterima sebagai solusi untuk OP tetapi sebenarnya apa yang saya cari sejak saya hanya perlu mencari isi folder besar dalam repo yang lebih besar saya pasti tidak ingin mengambil, dan saya tidak perlu memodifikasi / Dorong.
Oliver

7

Jika Anda ingin mendapatkan perubahan terbaru dalam direktori tanpa memasukkannya, Anda dapat melakukan:

$ git -C <Path to directory> pull


2

Mencoba dan menguji ini berhasil!

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>

Semoga ini bermanfaat!


0

Kadang-kadang, Anda hanya ingin melihat salinan file sebelumnya tanpa kesulitan melalui diffs.

Dalam kasus seperti itu, sangat mudah untuk membuat klon dari repositori dan memeriksa komit spesifik yang Anda minati dan melihat subdirektori dalam repositori yang dikloning itu. Karena semuanya lokal Anda hanya dapat menghapus klon ini ketika Anda selesai.


-1

Untuk semua perjuangan dengan jalur file teoretis dan contoh-contoh seperti yang saya lakukan, di sini contoh nyata: Microsoft menawarkan dokumen dan contoh mereka di git hub, sayangnya mereka mengumpulkan semua file contoh mereka untuk sejumlah besar topik dalam repositori ini:

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

Saya hanya tertarik pada file Microsoft Dynamics js di path

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

jadi saya melakukan yang berikut

membuat

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

file di folder repositori saya pada disk

git sparse-checkout init

dalam direktori itu menggunakan cmd di windows

Isi file

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

adalah

Sdk.Soap.js/*

akhirnya lakukan a

git pull origin master
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.