2012-05-20 40 views
22

Tôi đang cố gắng tách một dự án con khỏi kho lưu trữ git của mình. Tuy nhiên không giống như trong Detach (move) subdirectory into separate Git repository Tôi không có nó trong thư mục con riêng của nó (và di chuyển nó vào và làm ở trên chỉ mang lại lịch sử sau khi di chuyển).Xóa các tệp đã xóa khỏi lịch sử git

Tôi đã sao chép nhánh mà từ đó tôi muốn tách tiểu dự án thành kho lưu trữ của chính nó và xóa mọi thứ không được tiểu dự án sử dụng, vì vậy về cơ bản tôi có thể sử dụng nó làm kho lưu trữ của tiểu dự án của tôi.

Bây giờ tôi muốn loại bỏ lịch sử của tất cả các tệp không còn trong kho lưu trữ này để chỉ giữ lại lịch sử tệp cho các tệp đã tạo thành tệp con.

Tôi nghĩ rằng nó phải được thể với git-filter-branch nhưng tôi không thể tìm ra cách

Nhiều cảm ơn trước

+0

Xem thêm [Bản ghi nhớ mới có lịch sử được sao chép của các tệp được theo dõi hiện tại] (http://stackoverflow.com/questions/17901588/new-repo-with-copied-history-of-only-currently-tracked-files) . –

Trả lời

5

Here are some instructions to do what you want.

này sẽ loại bỏ file_to_remove:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_to_remove' --prune-empty -- --all 
+19

Vấn đề là tôi muốn giữ các tập tin và lịch sử của chúng nằm trong thư mục làm việc và có git quên tất cả những thứ khác. Nó sẽ là khá cồng kềnh để đầu tiên tìm thấy tất cả các tập tin đã xóa và loại bỏ chúng với lệnh trên, đó là lý do tại sao mặc dù tôi tìm thấy nó không phải là quá nhiều sử dụng –

1

Ok bây giờ tôi đang thử với các kỹ thuật sau đây, sẽ báo cáo lại nếu nó làm việc, bởi vì nó có vẻ là khá dài chạy: Trên một zsh hoặc bash ON Một nhân bản Repository

git log --diff-filter=D --summary <start_commit>..HEAD | egrep -o '*[[:alnum:]]*(/[[:alnum:].]*)+$' > deleted.txt 

để có được tất cả các file bị xóa

for del in `cat deleted.txt` 
do 
    git filter-branch --index-filter "git rm --cached --ignore-unmatch $del" --prune-empty -- --all 
    # The following seems to be necessary every time 
    # because otherwise git won't overwrite refs/original 
    git reset --hard 
    git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 
    git reflog expire --expire=now --all 
    git gc --aggressive --prune=now 
done; 

Điều này có thể cực kỳ dangeours cho dữ liệu của bạn vì vậy chỉ thử trên bắt chước.

+0

Bạn đã kết thúc tìm kiếm? –

+1

Lý do nó xuất hiện để chạy quá chậm cho bạn là vì bạn đang chạy lệnh 'git filter-branch' *** một lần cho mỗi tệp ***, cùng với một loạt các lệnh khác (' git gc' không phải là một lệnh rẻ và không nhanh để chạy) thay vì chạy nó *** một lần cho tất cả các tệp ***, vì vậy nó có thể cực kỳ kém hiệu quả. Xem nhận xét tại [Bản ghi nhớ mới có lịch sử được sao chép của các tệp được theo dõi hiện tại] (http://stackoverflow.com/questions/17901588/new-repo-with-copied-history-of-only-currently-tracked-files). –

+0

Sẽ đẩy github hoặc gitlab dọn sạch kho lưu trữ từ xa? –

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