Solusi Terperinci
Lihat catatan di akhir jawaban ini (paragraf terakhir) untuk alternatif cepat untuk git submodul menggunakan npm;)
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:
<git repository A>
someFolders
someFiles
someLib <-- we want this to be a new repo and a git submodule!
some files
Pada langkah-langkah di bawah ini, saya akan menyebutnya someLib
sebagai <directory 1>
.
Pada akhirnya, kita akan mendapatkan sesuatu seperti ini:
<git repository A>
someFolders
someFiles
@submodule --> <git repository B>
<git repository B>
someFolders
someFiles
Buat repositori git baru dari folder di repositori lain
Langkah 1
Dapatkan salinan baru dari repositori untuk dipisahkan.
git clone <git repository A url>
cd <git repository A directory>
Langkah 2
Folder saat ini akan menjadi repositori baru jadi hapus remote saat ini.
git remote rm origin
LANGKAH 3
Ekstrak riwayat folder yang diinginkan dan komit
git filter-branch --subdirectory-filter <directory 1> -- --all
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!
git remote add origin <git repository B url>
git push
Anda mungkin perlu mengatur upstream
cabang untuk dorongan pertama Anda
git push --set-upstream origin master
Bersih <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
git clone <git repository A url>
cd <git repository A directory>
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <directory 1> -r' --prune-empty --tag-name-filter cat -- --all
Ganti <directory 1>
dengan folder yang ingin Anda hapus. -r
akan melakukannya secara rekursif di dalam direktori yang ditentukan :). Sekarang dorong ke origin/master
dengan--force
git push origin master --force
Tahap Bos (Lihat Catatan di bawah)
Buat submodul dari <git repository B>
dalam<git repository A>
git submodule add <git repository B url>
git submodule update
git commit
Verifikasi apakah semuanya bekerja seperti yang diharapkan dan push
git push origin master
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 :
- Pindahkan folder ke repositori baru
- dijalankan
npm init
di dalam kedua repositori
- jalankan di
npm install --save git://github.com/user/project.git#commit-ish
mana Anda ingin dependensi Anda diinstal