Tôi có một repo git với một số tệp nhị phân rất lớn trong đó. Tôi không còn cần chúng nữa, và tôi không quan tâm đến việc có thể kiểm tra các tập tin từ các cam kết trước đó. Vì vậy, để giảm kích thước repo, tôi muốn xóa các tệp nhị phân khỏi lịch sử hoàn toàn.Cập nhật nhóm phát triển với lịch sử repo Git được viết lại, xóa các tệp lớn
Sau khi tìm kiếm web, tôi kết luận rằng (chỉ?) Lựa chọn tốt nhất của tôi là sử dụng git-filter-branch
:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch big_1.zip big_2.zip etc.zip' HEAD
Điều này có vẻ giống như một cách tiếp cận tốt cho đến nay?
Giả sử câu trả lời là có, tôi có một vấn đề khác để tranh luận. The git manual has this warning:
CẢNH BÁO! Lịch sử viết lại sẽ có tên đối tượng khác nhau cho tất cả các đối tượng và sẽ không hội tụ với nhánh ban đầu. Bạn sẽ không thể dễ dàng đẩy và phân phối nhánh viết lại trên đầu nhánh gốc. Xin vui lòng không sử dụng lệnh này nếu bạn không biết đầy đủ ý nghĩa, và tránh sử dụng nó anyway, nếu một cam kết đơn giản sẽ đủ để sửa chữa vấn đề của bạn. (Xem phần "RECOVERING FROM UPSTREAM REBASE" trong git-rebase (1) để biết thêm thông tin về việc viết lại lịch sử đã xuất bản.)
Chúng tôi có một repo từ xa trên máy chủ của chúng tôi. Mỗi nhà phát triển đẩy và kéo từ nó. Dựa trên các cảnh báo trên (và sự hiểu biết của tôi về cách git-filter-branch
hoạt động), tôi không nghĩ rằng tôi sẽ có thể chạy git-filter-branch
trên bản sao cục bộ của tôi và sau đó đẩy các thay đổi.
Vì vậy, tôi đang dự kiến kế hoạch để đi qua các bước sau:
- thiệu với tất cả các nhà phát triển của tôi để cam kết, đẩy, và ngừng làm việc cho một chút.
- Đăng nhập vào máy chủ và chạy bộ lọc trên repo trung tâm.
- Yêu cầu mọi người xóa các bản sao cũ của họ và sao chép lại từ máy chủ.
Điều này có đúng không? Đây có phải là giải pháp tốt nhất không?
Nó xảy ra với tôi bây giờ mà các * đơn giản nhất * điều cần làm có thể là để có các nhà phát triển của bạn mỗi chạy lệnh 'git-filter-branch' giống hệt nhau. Họ nên kết thúc với lịch sử giống hệt với những gì bạn tạo ra mà không cần phải sao chép lại hoặc tự rebase. –
@BenJackson các tệp mã sẽ giống hệt nhau, nhưng các đối tượng cam kết sẽ có siêu dữ liệu dấu cộng khác nhau được thêm vào bởi quá trình rebase. – Douglas
@Douglas Tôi không nghĩ rằng 'git filter-branch' sẽ thay đổi dữ liệu của người gửi trừ khi bạn yêu cầu nó một cách rõ ràng. ('git commit --rebase' hiện, nhưng không phải là' git filter-branch', như tôi thấy.) – cdhowie