Apakah mungkin untuk memeriksa subdirektori dari repositori di Git?
Bayangkan saya sedang menyiapkan instalasi WordPress baru. Saya akan membuat dua direktori baru untuk plugin dan penyesuaian tema:
wordpress/wp-content/plugins/myplugins/
wordpress/wp-content/themes/mytheme/
Saya ingin mempertahankan direktori ini melalui Git. Dalam Subversion, saya akan menyelesaikan ini dengan memiliki trunk/myplugins/
dan trunk/mytheme/
direktori dan memeriksa subdirektori. Apakah Git memiliki cara untuk menyelesaikan tugas yang sama menggunakan repositori tunggal?
Saya bisa saja ketinggalan perahu pada beberapa paradigma Git, sebagai pengguna SVN lama dengan sedikit paparan Git.
Sunting: Beberapa cabang menyimpan konten yang berbeda adalah cara yang menarik untuk menangani ini.
git
sparse-checkout
Annika Backstrom
sumber
sumber
Jawaban:
Checkout jarang yang sekarang di Git 1.7 .
Lihat juga pertanyaan “ Apakah mungkin melakukan checkout jarang tanpa memeriksa seluruh repositori terlebih dahulu? ”
Perhatikan bahwa checkout jarang masih mengharuskan Anda untuk mengunduh seluruh repositori, meskipun beberapa file yang diunduh Git tidak akan berakhir di pohon kerja Anda.
sumber
git clone
perintah sederhana ?? Yah, saya menggunakan jawaban ini , berfungsi!/foo/bar/foobar
, apakah mungkin melihatnya hanya/foobar
di repositori lokal saya?Tidak ada cara nyata untuk melakukannya di git. Dan jika Anda tidak akan membuat perubahan yang memengaruhi kedua pohon sekaligus sebagai unit kerja tunggal, tidak ada alasan yang baik untuk menggunakan repositori tunggal untuk keduanya. Saya pikir saya akan kehilangan fitur Subversion ini, tetapi saya menemukan bahwa membuat repositori hanya memiliki sedikit overhead mental administratif (hanya karena fakta bahwa repositori disimpan tepat di sebelah copy pekerjaan mereka, daripada mengharuskan saya untuk secara eksplisit memilih tempat di luar dari copy pekerjaan) yang saya terbiasa hanya membuat banyak repositori kecil tujuan tunggal.
Jika Anda bersikeras (atau benar-benar membutuhkannya), meskipun, Anda bisa membuat repositori git hanya dengan
mytheme
danmyplugins
direktori dan symlink orang dari dalam WordPress install.MDCore menulis:
Perhatikan bahwa ini bukan masalah bagi git, jika Anda memutuskan untuk meletakkan kedua direktori dalam satu repositori, karena git menghilangkan sepenuhnya dengan konsep peningkatan angka revisi dalam bentuk apa pun secara monoton.
Satu-satunya kriteria untuk hal-hal apa yang harus disatukan dalam repositori tunggal di git adalah apakah itu merupakan satu unit, yaitu. dalam kasus Anda apakah ada perubahan di mana tidak masuk akal untuk melihat pengeditan di setiap direktori secara terpisah. Jika Anda memiliki perubahan di mana Anda perlu mengedit file di kedua direktori sekaligus dan edit milik bersama, itu harus menjadi satu repositori. Jika tidak, maka jangan gosok mereka menjadi satu.
Git benar-benar ingin Anda menggunakan repositori terpisah untuk entitas yang terpisah.
Submodules tidak membahas keinginan untuk menyimpan kedua direktori dalam satu repositori, karena mereka sebenarnya akan menegakkan memiliki repositori terpisah untuk setiap direktori, yang kemudian disatukan dalam repositori lain menggunakan submodules. Lebih buruk lagi, karena direktori di dalam instalasi WordPress bukan subdirektori langsung dari direktori yang sama dan juga merupakan bagian dari hierarki dengan banyak file lain, menggunakan repositori per-direktori sebagai submodul dalam repositori terpadu tidak akan memberikan keuntungan apa pun, karena unified repositori tidak akan mencerminkan use case / need.
sumber
git clone
urutan perintah sederhana ?? Yah, saya menggunakan jawaban ini , berfungsi!Satu hal yang saya tidak suka tentang sparse checkout, adalah bahwa jika Anda ingin checkout subdirektori dengan kedalaman beberapa direktori, struktur direktori Anda harus berisi semua direktori yang mengarah ke sana.
Cara saya mengatasinya adalah dengan mengkloning repo di tempat yang bukan merupakan ruang kerja saya dan kemudian membuat tautan simbolis di direktori ruang kerja saya ke subdirektori dalam repositori. Git berfungsi seperti ini dengan cukup baik karena hal-hal seperti status git akan menampilkan perubahan file relatif terhadap direktori kerja Anda saat ini.
sumber
Sebenarnya, pemeriksaan "sempit" atau "parsial" atau "jarang" sedang dalam pengembangan saat ini, berat untuk Git. Catatan, Anda masih memiliki repositori lengkap di bawah
.git
. Jadi, dua posting lainnya adalah terbaru untuk kondisi Git saat ini, tetapi sepertinya kita akan dapat melakukan checkout jarang pada akhirnya. Periksa milis jika Anda tertarik pada detail lebih lanjut - mereka berubah dengan cepat.sumber
git clone --filter
dari Git 2.19Opsi ini sebenarnya akan melewatkan mengambil objek yang tidak dibutuhkan dari server:
Server harus dikonfigurasi dengan:
Tidak ada dukungan server pada v2.19.0, tetapi sudah dapat diuji secara lokal.
file://$(path)
diperlukan untuk mengatasigit clone
protokol shenanigans: Bagaimana cara dangkal mengkloning repositori git lokal dengan path relatif?Ingat yang
--depth 1
sudah tersirat--single-branch
, lihat juga: Bagaimana saya mengkloning satu cabang di Git?TODO:
--filter=blob:none
melompati semua gumpalan, tetapi masih mengambil semua objek pohon. Tetapi pada repo yang normal, ini harus kecil dibandingkan dengan file itu sendiri, jadi ini sudah cukup baik. Ditanya di: https://www.spinics.net/lists/git/msg342006.html Devs menjawab a--filter=tree:0
sedang mengerjakan hal itu.Format
--filter
didokumentasikan padaman git-rev-list
.Ekstensi dibuat untuk protokol jarak jauh Git untuk mendukung fitur ini.
Documents on Git tree:
Uji itu
GitHub hulu .
Output dalam Git v2.19:
Kesimpulan: semua gumpalan dari luar
d1/
hilang.Catat itu
root/root
danmybranch/mybranch
juga hilang, tetapi--depth 1
menyembunyikan itu dari daftar file yang hilang. Jika Anda menghapus--depth 1
, maka mereka muncul di daftar file yang hilang.sumber
Saat hasil edit Anda menunjukkan, Anda dapat menggunakan dua cabang terpisah untuk menyimpan dua direktori terpisah. Ini membuat keduanya tetap dalam repositori yang sama, tetapi Anda masih tidak dapat memiliki komitmen yang mencakup kedua pohon direktori. Jika Anda memiliki perubahan di salah satu yang membutuhkan perubahan di yang lain, Anda harus melakukan itu sebagai dua komit terpisah, dan Anda membuka kemungkinan bahwa sepasang checkout dari dua direktori bisa tidak sinkron.
Jika Anda ingin memperlakukan pasangan direktori sebagai satu unit, Anda dapat menggunakan 'wordpress / wp-content' sebagai root dari repo Anda dan menggunakan file .gitignore di tingkat atas untuk mengabaikan segalanya kecuali dua subdirektori yang menarik. Ini mungkin solusi yang paling masuk akal pada saat ini.
Checkout jarang telah diduga datang selama dua tahun sekarang, tetapi masih belum ada tanda-tanda mereka dalam repo pengembangan git, juga tidak ada indikasi bahwa perubahan yang diperlukan akan pernah tiba di sana. Saya tidak akan mengandalkan mereka.
sumber
Anda tidak dapat checkout direktori tunggal repositori karena seluruh repositori ditangani oleh folder .git tunggal di root proyek alih-alih banyak subversi dari direktori .svn.
Masalah dengan bekerja pada plugin dalam repositori tunggal adalah membuat komit, misalnya, mitos akan menambah angka revisi untuk myplugin , jadi bahkan dalam subversi lebih baik menggunakan repositori terpisah.
Paradigma subversi untuk sub-proyek adalah svn: eksternal yang diterjemahkan agak ke submodul di git (tetapi tidak tepat jika Anda telah menggunakan svn: eksternal sebelumnya.)
sumber
Ada inspirasi di sini. Hanya menggunakan
shell regex
ataugit regex
.Gunakan kutipan untuk menghindari interpretasi shell regex dan berikan wildcard untuk git.
Yang pertama tidak rekursif, hanya file dalam 1-kedalaman
subdir
. Tapi yang kedua bersifat rekursif.Adapun situasi Anda, berikut ini mungkin cukup.
Cukup retas garis sesuai kebutuhan.
sumber
Anda dapat mengembalikan perubahan yang tidak dikomit hanya ke file atau direktori tertentu:
sumber