Saya telah bereksperimen dengan menggunakan subtree git dan telah mengalami situasi berikut.
Saya menggunakan subtree git untuk menambahkan proyek eksternal ke repo saya, saya sengaja menyimpan semua sejarah untuk proyek hulu karena saya ingin dapat merujuk ke sejarah proyek dan juga berkontribusi kembali ke proyek hulu nanti.
Ternyata, kontributor lain untuk proyek upstream secara tidak sengaja mendorong file besar ke cabang master. Untuk mengatasinya, proyek hulu menulis ulang sejarah dan kekuatan didorong ke master. Saat membuat "monorepo" saya, saya menyertakan komit ini dan saya juga ingin menghapusnya.
Bagaimana saya bisa memperbarui repositori saya untuk mencerminkan sejarah baru subtree?
Upaya pertama saya adalah menggunakan cabang-filter untuk sepenuhnya menghapus subtree dan semua riwayat.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch upstream-project-dir' --prune-empty HEAD
Setelah versi subtree lama dihapus, saya bisa menambahkan ulang subtree menggunakan master hulu yang baru. Namun, ini tidak berhasil karena untuk beberapa alasan sejarah komit masih muncul di git log output.
Memperbarui
Saya telah menulis langkah-langkah untuk membuat contoh yang dapat direproduksi secara minimal.
Pertama buat git repo kosong.
git init test-monorepo cd ./test-monorepo
Buat komit awal.
echo hello world > README git add README git commit -m 'initial commit'
Sekarang tambahkan subtree untuk proyek eksternal.
git remote add thirdparty git@github.com:teivah/algodeck.git git fetch thirdparty git subtree add --prefix algodeck thirdparty master
Buat beberapa komitmen di monorepo
echo dont panic >> algodeck/README.md git commit -a -m 'test commit'
Sekarang coba gunakan cabang-filter git untuk menghapus subtree.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch algodeck' --prune-empty HEAD
Memeriksa output log git, saya berharap hanya melihat komit awal saya.
git log
git gc --prune=now
hanya menghapus komit yang tidak muncul git log
?
git log
, tidak ada argumen dan saya masih melihat komitmen lama.