Saya telah mewarisi repositori git yang berisi banyak proyek dalam direktori terpisah. Saya ingin membagi repositori menjadi repositori individu baru, satu untuk setiap proyek dan kemudian memiliki repositori master berisi proyek-proyek sebagai submodul. Saya ingin melakukan semua ini sambil mempertahankan riwayat revisi masing-masing proyek jika memungkinkan.
Saya bisa mengkloning repositori untuk setiap proyek dan menghapus semua proyek lain setiap saat, tetapi apakah ada cara yang lebih baik untuk menghindari riwayat kloning di setiap repositori proyek baru?
git
git-submodules
cidered
sumber
sumber
Jawaban:
Anda dapat menggunakan
git filter-branch
untuk menulis ulang sejarah proyek. Dari dokumentasi:Buat beberapa salinan repo Anda, lakukan itu untuk setiap subdirektori yang ingin Anda pisahkan, dan Anda akan mendapatkan apa yang Anda cari.
sumber
--subdirectory-filter
beberapa kali. EGgit filter-branch --subdirectory-filter foodir --subdirectory-filter bardir
, dll. Tidak--subdirectory
akan mengambil banyak direktori, tetapi dapat ditentukan beberapa kali.foodir
dalam proyek asli, tidak menulis ulang riwayatnya,git rm -r foodir
sebaiknya cukup (itu juga akan menghapus salinan di pohon kerja Anda; jika Anda tidak menginginkannya, gunakan--cached
). Jika Anda ingin menghapus seluruhnya dari riwayat (menjawab pertanyaan @ ilius juga), Anda menginginkan sesuatu sepertigit filter-branch --index-filter 'git rm -r --cached --ignore-unmatched foodir' -- --all
--index-filter
solusinya lebih cepat daripada--tree-filter
, karena tidak harus benar-benar memeriksa file, itu hanya dapat memanipulasi indeks secara langsung. Namun,--tree-filter
ini bisa sedikit lebih mudah digunakan, karena Anda dapat menggunakan operasi filsystem biasa daripada harus bekerja dengan operasi manipulasi indeks.Untuk mengekspor folder sebagai repositori baru, Anda memerlukan:
Buka folder repositori kloning dan jalankan perintah ini:
sumber
git subtree
tidak tersedia sebagai paket Cygwin. Jika Anda membutuhkannya: stackoverflow.com/a/27116828/2484903Inti dari git adalah bahwa sejarah diwujudkan dalam setiap komit dengan melakukan hashing pada komit induk. Anda dapat "memutar ulang" komit (pada dasarnya ini adalah cara kerja svn-importer) ke dalam repositori baru dan hanya menyimpan setiap sub-proyek. Ini, bagaimanapun, akan menghancurkan arti dari hash komit. Jika Anda tidak memiliki masalah dengan itu maka biarlah.
Di masa lalu saya baru saja mengkloningnya dan melanjutkan. Hal ini membuat segalanya lebih besar tetapi ruang disk murah; waktu saya mahal.
Saya juga tidak tahu alat apa pun untuk memisahkan direktori. Saya kira Anda bisa git-log di direktori untuk menemukan semua komit di dalamnya lalu memutar ulang komit dengan sesuatu seperti git-fast-export?
sumber