Saya memiliki aplikasi web yang mengeksplorasi aplikasi web lain dengan cara tertentu. Ini berisi beberapa demo web dalam demos
folder dan salah satu demo sekarang harus memiliki repositori sendiri. Saya ingin membuat repositori terpisah untuk aplikasi demo ini dan menjadikannya sebagaisubpaket submodule dari repositori utama tanpa kehilangan riwayat komitnya.
Apakah mungkin untuk menyimpan riwayat komit dari file dalam folder repositori dan membuat repositori darinya dan menggunakannya sebagai submodul ?
git
git-submodules
revision-history
GabLeRoux
sumber
sumber
Jawaban:
Solusi Terperinci
Dalam jawaban berikut, Anda akan mengetahui cara mengekstrak folder dari repositori dan membuat repositori git darinya dan kemudian memasukkannya sebagai submodul, bukan folder.
Terinspirasi dari artikel Gerg Bayer Memindahkan File dari satu Repositori Git ke Repositori Git Lainnya, Melestarikan Sejarah
Pada awalnya, kami memiliki sesuatu seperti ini:
Pada langkah-langkah di bawah ini, saya akan menyebutnya
someLib
sebagai<directory 1>
.Pada akhirnya, kita akan mendapatkan sesuatu seperti ini:
Buat repositori git baru dari folder di repositori lain
Langkah 1
Dapatkan salinan baru dari repositori untuk dipisahkan.
Langkah 2
Folder saat ini akan menjadi repositori baru jadi hapus remote saat ini.
LANGKAH 3
Ekstrak riwayat folder yang diinginkan dan komit
Anda sekarang harus memiliki repositori git dengan file-file dari
directory 1
root repo Anda dengan semua riwayat komit terkait.LANGKAH 4
Buat repositori online Anda dan dorong repositori baru Anda!
Anda mungkin perlu mengatur
upstream
cabang untuk dorongan pertama AndaBersih
<git repository A>
(opsional, lihat komentar)Kami ingin menghapus jejak (file dan riwayat komit)
<git repository B>
dari<git repository A>
jadi riwayat untuk folder ini hanya ada sekali.Ini didasarkan pada Menghapus data sensitif dari github.
Buka folder baru dan
Ganti
<directory 1>
dengan folder yang ingin Anda hapus.-r
akan melakukannya secara rekursif di dalam direktori yang ditentukan :). Sekarang dorong keorigin/master
dengan--force
Tahap Bos (Lihat Catatan di bawah)
Buat submodul dari
<git repository B>
dalam<git repository A>
Verifikasi apakah semuanya bekerja seperti yang diharapkan dan
push
Catatan
Setelah melakukan semua ini, saya menyadari dalam kasus saya bahwa lebih tepat menggunakan npm untuk mengelola dependensi saya sendiri. Kita dapat menentukan url dan versi git, lihat url git package.json sebagai dependensi .
Jika Anda melakukannya dengan cara ini, repositori yang ingin Anda gunakan sebagai syarat harus menjadi modul NPM sehingga harus berisi
package.json
file atau Anda akan mendapatkan error ini:Error: ENOENT, open 'tmp.tgz-unpack/package.json'
.tldr (solusi alternatif)
Anda mungkin merasa lebih mudah menggunakan npm dan mengelola dependensi dengan url git :
npm init
di dalam kedua repositorinpm install --save git://github.com/user/project.git#commit-ish
mana Anda ingin dependensi Anda diinstalsumber
cd someLib
sebelum Langkah 2? Anda mengatakan "Folder saat ini akan menjadi repositori baru" tetapi sebenarnya tidak; repositori baru (submodule) ada di dalam folder itu.refs/original/...
yang dibuat pada langkah 3.Solusi oleh @GabLeRoux menghancurkan cabang, dan komit terkait.
Cara sederhana untuk mengkloning dan menyimpan semua cabang dan komitmen ekstra itu:
1 - Pastikan Anda memiliki alias git ini
2 - Kloning remote, tarik semua cabang, ubah remote, filter direktori Anda, dorong
sumber
Solusi GabLeRoux bekerja dengan baik kecuali jika Anda menggunakan
git lfs
dan memiliki file besar di bawah direktori yang ingin Anda lepaskan. Dalam hal ini, setelah langkah 3 semua file besar akan tetap menjadi file penunjuk, bukan file asli. Saya kira itu mungkin karena.gitattributes
file tersebut dihapus dalam proses cabang filter.Menyadari hal ini, saya menemukan solusi berikut berfungsi untuk saya:
Menyalin
.gitattributes
git lfs mana yang digunakan untuk melacak file besar ke.git/
direktori agar tidak terhapus.Ketika filter-branch selesai, jangan lupa untuk mengembalikan
.gitattributes
jika Anda masih ingin menggunakan git lfs untuk repositori baru:sumber