Tôi đã thử nghiệm sử dụng cây con git và đã gặp phải tình huống sau.
Tôi đã sử dụng git Subree để thêm một dự án bên ngoài vào repo của mình, tôi cố tình giữ tất cả lịch sử cho dự án ngược dòng vì tôi muốn có thể tham khảo lịch sử của dự án và cũng đóng góp lại cho dự án ngược dòng sau này.
Hóa ra, một người đóng góp khác cho dự án ngược dòng đã vô tình đẩy một tệp lớn vào nhánh chính. Để khắc phục điều này, dự án ngược dòng viết lại lịch sử và lực đẩy lên chủ. Khi tạo "monorepo" của mình, tôi đã bao gồm cam kết này và tôi cũng muốn xóa nó.
Làm cách nào tôi có thể cập nhật kho lưu trữ của mình để phản ánh lịch sử mới của cây con?
Nỗ lực đầu tiên của tôi là sử dụng nhánh lọc để loại bỏ hoàn toàn cây con và tất cả lịch sử.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch upstream-project-dir' --prune-empty HEAD
Khi phiên bản cũ của cây con đã bị xóa, tôi có thể thêm lại cây con bằng cách sử dụng tổng thể ngược dòng mới. Tuy nhiên, điều này không hoạt động vì một số lý do, lịch sử cam kết vẫn hiển thị trong đầu ra nhật ký git.
Cập nhật
Tôi đã viết lên các bước để tạo một ví dụ có thể tái tạo tối thiểu.
Đầu tiên tạo một repo git trống.
git init test-monorepo cd ./test-monorepo
Tạo một cam kết ban đầu.
echo hello world > README git add README git commit -m 'initial commit'
Bây giờ thêm một cây con cho một dự án bên ngoài.
git remote add thirdparty git@github.com:teivah/algodeck.git git fetch thirdparty git subtree add --prefix algodeck thirdparty master
Thực hiện một số cam kết trên monorepo
echo dont panic >> algodeck/README.md git commit -a -m 'test commit'
Bây giờ hãy thử sử dụng nhánh lọc git để loại bỏ cây con.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch algodeck' --prune-empty HEAD
Kiểm tra đầu ra git log, tôi hy vọng sẽ chỉ thấy cam kết ban đầu của tôi.
git log
git gc --prune=now
xóa các cam kết không xuất hiện trong git log
?
git log
, không tranh luận và tôi vẫn thấy những cam kết cũ.