Saya memiliki repositori Git saya yang, pada dasarnya, memiliki dua sub direktori:
/finisht
/static
Ketika ini di SVN , /finisht
diperiksa di satu tempat, sementara /static
diperiksa di tempat lain, seperti:
svn co svn+ssh://[email protected]/home/admin/repos/finisht/static static
Apakah ada cara untuk melakukan ini dengan Git?
git
repository
subdirectory
git-clone
sparse-checkout
Nick Sersan
sumber
sumber
git clone
perintah apa yang paling sederhana ?? Saya menggunakan jawaban sederhana ini . Jika ada sesuatu yang lebih sederhana, silakan komentarJawaban:
EDIT : Pada Git 2.19, ini akhirnya mungkin, seperti yang dapat dilihat dalam jawaban ini .
Pertimbangkan untuk membatalkan jawaban itu.
Catatan: di Git 2.19, hanya dukungan sisi-klien yang diimplementasikan, dukungan sisi-server masih hilang, sehingga hanya berfungsi saat kloning repositori lokal. Perhatikan juga bahwa host Git yang besar, misalnya GitHub, tidak benar-benar menggunakan server Git, mereka menggunakan implementasinya sendiri, jadi walaupun dukungan muncul di server Git, itu tidak secara otomatis berarti bahwa ia bekerja pada host Git. (OTOH, karena mereka tidak menggunakan server Git, mereka dapat mengimplementasikannya lebih cepat dalam implementasi mereka sendiri sebelum muncul di server Git.)
Tidak, itu tidak mungkin di Git.
Menerapkan sesuatu seperti ini di Git akan menjadi upaya yang substansial dan itu berarti bahwa integritas repositori klien tidak dapat lagi dijamin. Jika Anda tertarik, cari diskusi tentang "sparse clone" dan "sparse fetch" di milis git.
Secara umum, konsensus dalam komunitas Git adalah bahwa jika Anda memiliki beberapa direktori yang selalu diperiksa secara independen, maka ini benar-benar dua proyek yang berbeda dan harus hidup dalam dua repositori yang berbeda. Anda dapat merekatkannya kembali menggunakan Git Submodules .
sumber
git-read-tree
, yang lama setelah ituget-fetch
. Pertanyaannya bukan tentang memeriksa hanya sebuah subdirektori, tetapi tentang mengkloning hanya subdirektori. Saya tidak melihat bagaimana jarangnya checkout bisa melakukan itu, karenagit-read-tree
berjalan setelah klon telah selesai.Apa yang Anda coba lakukan disebut sparse checkout , dan fitur itu ditambahkan di git 1.7.0 (Feb. 2012). Langkah-langkah untuk melakukan klon jarang adalah sebagai berikut:
Ini membuat repositori kosong dengan remote Anda, dan mengambil semua objek tetapi tidak memeriksanya. Lalu lakukan:
Sekarang Anda perlu menentukan file / folder mana yang ingin Anda periksa. Ini dilakukan dengan mendaftarkan mereka
.git/info/sparse-checkout
, misalnya:Last but not least, perbarui repo kosong Anda dengan status dari jarak jauh:
Anda sekarang akan memiliki file "check out" untuk
some/dir
dananother/sub/tree
pada sistem file Anda (dengan jalur tersebut masih), dan tidak ada jalur lain yang ada.Anda mungkin ingin melihat tutorial yang diperluas dan Anda mungkin harus membaca dokumentasi resmi untuk checkout jarang .
Sebagai fungsi:
Pemakaian:
Perhatikan bahwa ini masih akan mengunduh seluruh repositori dari server - hanya ukuran checkout yang dikurangi. Saat ini tidak mungkin untuk mengkloning hanya satu direktori. Tetapi jika Anda tidak memerlukan riwayat repositori, Anda setidaknya dapat menghemat bandwidth dengan membuat klon yang dangkal. Lihat jawaban udondan di bawah ini untuk informasi tentang cara menggabungkan clone dangkal dan checkout jarang.
Pada git 2.25.0 (Jan 2020) perintah sparse-checkout eksperimental ditambahkan di git:
sumber
https://github.com/Umkus/nginx-boilerplate/tree/master/src
langsung ke/etc/nginx
git remote add
Perintah ini tidak menyiratkan pengambilan, tetapigit remote add -f
, seperti yang digunakan di sini, tidak! Itulah-f
artinya.--depth=1
saya mengkloning Chromium Devtools dalam 338 MB, bukannya 4,9 GB riwayat + sumber Blink penuh. Luar biasa.git clone --filter
dari Git 2.19Pilihan ini sebenarnya akan melewatkan mengambil objek yang tidak dibutuhkan dari server. Juga termasuk
--filter=tree:0
dari Git 2.20 dan--filter=combine
filter komposit yang ditambahkan di Git 2.24, kita berakhir dengan:Server harus dikonfigurasi dengan:
Ekstensi dibuat untuk protokol jarak jauh Git untuk mendukung fitur ini
v2.19.0
dan benar-benar melewatkan mengambil objek yang tidak dibutuhkan, tetapi tidak ada dukungan server pada saat itu. Tetapi sudah bisa diuji secara lokal.Perintah rusak:
--filter=blob:none
melompati semua gumpalan, tetapi masih mengambil semua objek pohon--filter=tree:0
melompati pohon yang tidak dibutuhkan: https://www.spinics.net/lists/git/msg342006.html--depth 1
sudah tersirat--single-branch
, lihat juga: Bagaimana cara mengkloning satu cabang di Git?file://$(path)
diperlukan untuk mengatasigit clone
protokol shenanigans: Bagaimana cara dangkal mengkloning repositori git lokal dengan path relatif?--filter=combine:FILTER1+FILTER2
adalah sintaks untuk menggunakan beberapa filter sekaligus, mencoba--filter
untuk beberapa alasan gagal dengan: "beberapa filter-spesifikasi tidak dapat digabungkan". Ini ditambahkan di Git 2.24 di e987df5fe62b8b29be4cdcdeb3704681ada2b29e "daftar-objek-filter: implement filter komposit"Format
--filter
didokumentasikan padaman git-rev-list
.Documents on Git tree:
Uji itu
GitHub hulu .
Output dalam Git v2.19.0:
Kesimpulan: semua gumpalan dari luar
d1/
hilang. Misalnya0975df9b39e23c15f63db194df7f45c76528bccb
, yangd2/b
tidak ada di sana setelah check outd1/a
.Perhatikan itu
root/root
danmybranch/mybranch
juga hilang, tetapi--depth 1
menyembunyikannya dari daftar file yang hilang. Jika Anda menghapus--depth 1
, maka mereka muncul di daftar file yang hilang.Aku mempunyai impian
Fitur ini dapat merevolusi Git.
Bayangkan memiliki semua basis kode perusahaan Anda dalam satu repo tanpa alat pihak ketiga yang jelek
repo
.Bayangkan menyimpan gumpalan besar langsung di repo tanpa ekstensi pihak ketiga yang jelek .
Bayangkan jika GitHub akan mengizinkan metadata file / direktori seperti bintang dan izin, sehingga Anda dapat menyimpan semua barang pribadi Anda dalam satu repo.
Bayangkan jika submodula diperlakukan persis seperti direktori biasa : cukup minta SHA pohon, dan mekanisme mirip DNS menyelesaikan permintaan Anda , pertama cari di lokal
~/.git
Anda , lalu pertama-tama ke server yang lebih dekat (mirror / cache perusahaan Anda) dan berakhir di GitHub.sumber
fatal: invalid filter-spec 'combine:blob:none+tree:0'
Bagaimanapun, terima kasih! Mungkin ini akan bekerja dengan versi yang lebih baru.Anda dapat menggabungkan checkout jarang dan fitur klon dangkal . The dangkal clone pemotongan off sejarah dan checkout jarang hanya menarik file yang cocok pola Anda.
Anda membutuhkan minimum git 1.9 agar ini berfungsi. Mengujinya sendiri hanya dengan 2.2.0 dan 2.2.2.
Dengan cara ini Anda masih bisa mendorong , yang tidak mungkin dilakukan dengan
git archive
.sumber
git pull --depth=1 origin master
tetapigit pull --depth=1 origin <any-other-branch>
. ini sangat aneh, lihat pertanyaan saya di sini :stackoverflow.com/questions/35820630/…Untuk pengguna lain yang hanya ingin mengunduh file / folder dari github, cukup gunakan:
misalnya
(ya, itu svn di sini. rupanya pada tahun 2016 Anda masih perlu svn untuk cukup mengunduh beberapa file github)
Courtesy: Unduh satu folder atau direktori dari repo GitHub
Penting - Pastikan Anda memperbarui URL github dan ganti
/tree/master/
dengan '/ trunk /'.Sebagai skrip bash:
Catatan Metode ini mengunduh folder, tidak mengkloning / checkout. Anda tidak dapat mendorong perubahan kembali ke repositori. Di sisi lain - ini menghasilkan unduhan lebih kecil dibandingkan dengan checkout jarang atau checkout dangkal.
sumber
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/trunk/udacity
tetapi mendapatsvn: E170000: URL 'https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/trunk/udacity' doesn't exist
kesalahan :(Jika Anda tidak pernah berencana untuk berinteraksi dengan repositori tempat Anda melakukan kloning, Anda dapat melakukan klon git penuh dan menulis ulang repositori Anda menggunakan git-cabang -subdirectory-filter . Dengan cara ini, setidaknya sejarah akan dilestarikan.
sumber
git filter-branch --subdirectory-filter <subdirectory>
git clone https://github.com/your/repo_xx.git && cd repo_xx && git filter-branch --subdirectory-filter repo_xx_subdir
Ini terlihat jauh lebih sederhana:
sumber
svn export
bukannyaGit 1.7.0 memiliki "sparse checkout". Lihat “core.sparseCheckout” di git config manualnya , “checkout Jarang” di git baca-pohon manualnya , dan “Lewati-worktree bit” di git update-indeks manualnya .
Antarmuka tidak senyaman SVN's (misalnya tidak ada cara untuk membuat checkout jarang pada saat klon awal), tetapi fungsi dasar di mana antarmuka yang lebih sederhana dapat dibangun sekarang tersedia.
sumber
Tidak mungkin untuk mengkloning subdirektori hanya dengan Git, tetapi di bawah ini ada beberapa solusi.
Saring cabang
Anda mungkin ingin menulis ulang repositori agar seolah-olah
trunk/public_html/
telah menjadi root proyeknya, dan membuang semua riwayat lainnya (menggunakanfilter-branch
), coba pada cabang checkout yang sudah ada:Catatan: Opsi
--
yang memisahkan opsi cabang-filter dari opsi revisi, dan--all
untuk menulis ulang semua cabang dan tag. Semua informasi termasuk waktu komit asli atau menggabungkan informasi akan dipertahankan . Perintah ini menghargai.git/info/grafts
file dan referensi direfs/replace/
namespace, jadi jika Anda memiliki graf atau penggantian yangrefs
ditentukan, menjalankan perintah ini akan membuatnya permanen.Checkout jarang
Berikut adalah langkah-langkah sederhana dengan pendekatan checkout jarang yang akan mengisi direktori kerja secara jarang, sehingga Anda dapat memberi tahu Git folder atau file mana di direktori kerja yang layak untuk dicoba.
Repositori klon seperti biasa (
--no-checkout
opsional):Anda dapat melewati langkah ini, jika repositori Anda sudah dikloning.
Petunjuk: Untuk repo besar, pertimbangkan clone dangkal (
--depth 1
) untuk checkout hanya revisi terbaru atau / dan--single-branch
hanya.Aktifkan
sparseCheckout
opsi:Tentukan folder untuk checkout jarang ( tanpa ruang di bagian akhir):
atau edit
.git/info/sparse-checkout
.Periksa cabang (mis.
master
):Sekarang Anda harus memiliki folder yang dipilih di direktori Anda saat ini.
Anda dapat mempertimbangkan tautan simbolis jika Anda memiliki terlalu banyak direktori atau cabang penyaringan sebagai gantinya.
sumber
pull
?filter-branch
akan menulis ulang komit induk sehingga mereka memiliki ID SHA1 yang berbeda, dan dengan demikian pohon yang Anda filterkan tidak memiliki komit yang sama dengan pohon jarak jauh.git pull
tidak akan tahu dari mana harus mencoba untuk bergabung.Saya baru saja menulis naskah untuk GitHub .
Pemakaian:
sumber
Ini akan mengkloning folder tertentu dan menghapus semua riwayat yang tidak terkait dengannya.
sumber
Berikut ini adalah skrip shell yang saya tulis untuk kasus penggunaan checkout subdirektori tunggal
coSubDir.sh
sumber
ln -s ./.$localRepo/$subDir $localRepo
bukanln -s ./.$localRepo$subDir $localRepo
Saya menulis
.gitconfig
[alias]
untuk melakukan "checkout jarang". Lihatlah (tidak ada permainan kata-kata yang dimaksudkan):Pada Windows dijalankan
cmd.exe
Jika tidak:
Penggunaan :
The
git config
perintah adalah 'minified' untuk kenyamanan dan penyimpanan, tapi di sini adalah alias diperluas:sumber
L=${1##*/} L=${L%.git}
:? Apakah ruang operator?Menggunakan Linux? Dan hanya ingin akses mudah dan membersihkan pohon yang bekerja? tanpa mengganggu sisa kode di mesin Anda. coba symlink !
Uji
sumber
Hanya untuk memperjelas beberapa jawaban hebat di sini, langkah-langkah yang dijabarkan dalam banyak jawaban mengasumsikan bahwa Anda sudah memiliki repositori jarak jauh di suatu tempat.
Diberikan: repositori git yang ada, misalnya
[email protected]:some-user/full-repo.git
, dengan satu atau lebih direktori yang ingin Anda tarik secara independen dari sisa repo, misalnya direktori yang dinamaiapp1
danapp2
Dengan asumsi Anda memiliki repositori git seperti di atas ...
Kemudian: Anda dapat menjalankan langkah-langkah seperti berikut ini untuk menarik hanya direktori tertentu dari repo yang lebih besar:
Saya keliru berpikir bahwa opsi checkout jarang harus ditetapkan pada repositori asli: ini tidak terjadi. Anda menentukan direktori mana yang Anda inginkan secara lokal, sebelum menarik dari remote. Semoga klarifikasi ini membantu orang lain.
sumber
Walaupun saya benci sebenarnya harus menggunakan svn ketika berhadapan dengan git repos: / Saya menggunakan ini sepanjang waktu;
Ini memungkinkan Anda menyalin dari url github tanpa modifikasi. Pemakaian;
sumber
Jika Anda benar-benar tertarik pada file revisi terbaru dari sebuah direktori, Github memungkinkan Anda mengunduh repositori sebagai file Zip, yang tidak mengandung histori. Jadi mengunduh sangat cepat.
sumber
Jadi saya mencoba semuanya dalam tapak ini dan tidak ada yang berhasil untuk saya ... Ternyata pada versi 2.24 dari Git (yang ada pada cpanel pada saat jawaban ini), Anda tidak perlu melakukan ini
yang Anda butuhkan hanyalah nama folder
Jadi singkatnya Anda melakukan ini
Anda kemudian mengedit .git / info / sparse-checkout dan menambahkan nama folder (satu per baris) dengan / * di akhir untuk mendapatkan subfolder dan file
Simpan dan jalankan perintah checkout
Hasilnya adalah folder yang diharapkan dari repo saya dan tidak ada yang lain Upvote jika ini berhasil untuk Anda
sumber