2011-09-15 33 views
39

Tôi đang sử dụng các nguồn sau đây để xóa bỏ một số tập tin lớn và thư mục từ kho lưu trữ của tôi:git, filter-branch trên tất cả các chi nhánh

http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/

Why is my git repository so big?

git filter-branch dường như chỉ để làm việc trên nhánh hiện tại - có cách nào để áp dụng nó cho tất cả các chi nhánh cùng một lúc không?

Trả lời

59

Các giải pháp rất đơn giản:

git filter-branch [options] -- --all

Note bốn dấu gạch ngang (hai bộ dấu gạch ngang đôi với một không gian ở giữa) trong -- --all.

Nếu bạn nhìn vào các tài liệu cho git-filter-branch, nó nói này:

git filter-branch [--env-filter <command>] [--tree-filter <command>] 
    [--index-filter <command>] [--parent-filter <command>] 
    [--msg-filter <command>] [--commit-filter <command>] 
    [--tag-name-filter <command>] [--subdirectory-filter <directory>] 
    [--prune-empty] 
    [--original <namespace>] [-d <directory>] [-f | --force] 
    [--] [<rev-list options>…] 

Đọc trên, phần đầu của tài liệu nói: "Cho phép bạn viết lại lịch sử git sửa đổi bằng cách viết lại các ngành được đề cập trong < tùy chọn danh sách rev >, áp dụng các bộ lọc tùy chỉnh trên mỗi bản sửa đổi. "

Vì vậy, việc kiểm tra các tài liệu cho rev-list cho:

< rev-danh sách tùy chọn> ... Arguments cho git rev-list. Tất cả các tham chiếu tích cực được bao gồm bởi các tùy chọn này được viết lại. Bạn cũng có thể chỉ định các tùy chọn chẳng hạn như --all, nhưng bạn phải sử dụng - để tách chúng khỏi các tùy chọn git lọc-chi nhánh.

Và các tài liệu cho git-rev-list nói:

--all 
Pretend as if all the refs in refs/ are listed on the command line as <commit>. 
+10

chỉ để làm rõ, thông thường 'filter-branch' được liệt kê với' HEAD' ở cuối, '- --all' thay thế' HEAD' – EoghanM

+0

Làm cách nào để làm cho nó hoạt động trong PowerShell (Windows)? Nó giữ lỗi và hiển thị thông báo trợ giúp cho 'filter-branch'. Tôi đã cố gắng thay đổi để báo giá gấp đôi theo câu trả lời của Paul, nhưng tôi không thể thoát khỏi dấu nháy kép ở đó (xem nhận xét của tôi về câu trả lời). – ADTC

+2

Tôi đã giải quyết vấn đề trên bằng cách sử dụng các đường ống (trong chức năng PowerShell). Về cơ bản: 'git rev-list --all | git filter-branch [options] '(không có danh sách rev ở cuối) thay vì' git filter-branch [options] - --all'. – ADTC

6

Như câu trả lời @ ben-lee của giải thích, --all là cần thiết cho viết lại tất cả các chi nhánh. Nếu bạn có thẻ trong repo của mình, bạn sẽ muốn xóa tất cả những chi tiết, cũng như các chi nhánh đó, để có được lợi ích về việc giảm kích thước và yêu cầu bổ sung --tag-name-filter cat câu thần chú.

Mặc dù câu hỏi định sử dụng git filter-branch, người hỏi muốn 'xóa bỏ một số tập tin lớn và thư mục từ kho lưu trữ của tôi', vì vậy nó là đáng nói đến là tốt nhất công cụ để làm điều đó thực sự là The BFG Repo Cleaner, một đơn giản hơn , thay thế nhanh hơn để git filter-branch. Ví dụ:

$ bfg --strip-blobs-bigger-than 10M 

... loại bỏ tất cả các đốm màu lớn hơn 10MB (mà không phải là ở bạn mới nhất cam kết), và hoạt động trên tất cả các chi nhánh & thẻ trong repo của bạn.

Tiết lộ đầy đủ: Tôi là tác giả của BFG Repo-Cleaner.

+1

Không có vấn đề @EoghanM - bạn có thể thấy video giới thiệu này thú vị - đó là cuộc đua giữa git filter-branch và The BFG (chạy trên Raspberry Pi ...) http://www.youtube.com/watch?v=Ir4IHzPhJuI –

2

Tôi đã làm theo tất cả các hướng dẫn để thực hiện việc này trên hộp Windows của mình, nhưng tôi vẫn gặp lỗi, cho đến khi tôi ngừng sử dụng dấu nháy đơn và sử dụng dấu ngoặc kép thay thế.

Động cơ của tôi là tôi vô tình kiểm tra trong môi trường vagrant của mình. Đây là lệnh để loại bỏ các thư mục vagrant từ tất cả các chi nhánh:

git filter-branch --tree-filter "rm -rf vagrant" -f HEAD --all 

Chỉ cần thay thế vagrant với tên thư mục của bạn, và nó sẽ loại bỏ thư mục này từ tất cả các chi nhánh.

+0

Đã xảy ra sự cố này. Cảm ơn bạn! Ngoài ra, nếu lệnh của bạn có dấu ngoặc kép (như ''rm -rf" vagrant "''), hãy thoát chúng bằng cách sử dụng hai dấu ngoặc kép (như '" rm -rf "" vagrant "" "'). – ADTC

+0

Thực tế là không hoạt động. Chắc chắn, đó là công trình cho PowerShell nhưng 'git' chỉ đơn giản là lỗi. – ADTC

+0

Có một 'git bash' trên cửa sổ vì một lý do. Sử dụng nó, sớm hay muộn sử dụng git từ cmd sẽ đánh bạn. – GiM

Các vấn đề liên quan