Git subtree kullanmayı deniyorum ve aşağıdaki durumla karşılaştım.
Repo'ma harici bir proje eklemek için git subtree'yi kullandım, projenin geçmişine atıfta bulunmak ve daha sonra yukarı akış projesine katkıda bulunmak istediğim için kasıtlı olarak yukarı akış projesi için tüm tarihi sakladım.
Anlaşıldığı üzere, yukarı akış projesine başka bir katılımcı yanlışlıkla büyük bir dosyayı ana şubeye itti. Bunu düzeltmek için, yukarı akış projesi tarihi yeniden yazdı ve güç ustaya itti. Benim "monorepo" oluştururken, bu taahhüt dahil ve ben de kaldırmak istiyorum.
Depomu alt ağacın yeni geçmişini yansıtacak şekilde nasıl güncelleyebilirim?
İlk denemem, alt ağacı ve tüm geçmişi tamamen kaldırmak için filtre dalı kullanmaktı.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch upstream-project-dir' --prune-empty HEAD
Alt ağacın eski sürümü kaldırıldıktan sonra, yeni yukarı akış master'ı kullanarak alt ağacı yeniden ekleyebilirim. Ancak, bu işe yaramadı çünkü bazı nedenlerden dolayı kayıt geçmişi hala git log çıktısında görünüyor.
Güncelleme
Minimal tekrarlanabilir bir örnek oluşturma adımlarını yazdım.
Önce boş bir git repo oluşturun.
git init test-monorepo cd ./test-monorepo
Bir başlangıç taahhüdü oluşturun.
echo hello world > README git add README git commit -m 'initial commit'
Şimdi harici bir proje için bir alt ağaç ekleyin.
git remote add thirdparty git@github.com:teivah/algodeck.git git fetch thirdparty git subtree add --prefix algodeck thirdparty master
Monorepo hakkında bazı taahhütlerde bulunun
echo dont panic >> algodeck/README.md git commit -a -m 'test commit'
Şimdi alt ağacı kaldırmak için git filter-branch'u kullanmayı deneyin.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch algodeck' --prune-empty HEAD
Git log çıktısını inceleyin, sadece ilk taahhüdümü görmeyi bekliyorum.
git log
git gc --prune=now
sadece görünmeyen taahhütleri silmekle kalmaz git log
mıydı?
git log
tartışmalar yapıyordum ve hala eski taahhütleri görüyorum.