2011-08-25 23 views
29

Khi tôi bắt đầu git repo của tôi, tôi cam kết một vài tập tin như cam kết ban đầu với nó. Bây giờ, nhiều cam kết sau này, tôi nhận thấy rằng tôi đã bao gồm trong các tệp đó một dòng thông tin mà tôi không muốn xuất bản (không giống như phần còn lại của mã). Vì vậy, tôi muốn xóa/thay đổi dòng nàygiữ phần còn lại của mã.git: thay đổi một dòng trong tập tin cho toàn bộ lịch sử

Tìm kiếm xung quanh Tôi tìm thấy giải pháp này: Chèn cam kết trống như cam kết ban đầu (được mô tả ở đây: Insert a commit before the root commit in Git?), thực hiện rebase trên đó rồi chỉnh sửa cam kết cũ thông qua sửa đổi. Thật không may, nhiều cuộc xung đột hợp nhất tàn nhẫn phát sinh trong quá trình rebase (như được mô tả ở đây: git: solving conflicts caused by rebase).

Có cách nào khác để giải quyết vấn đề của tôi hay không phải rebase và chỉnh sửa tất cả các xung đột bằng tay?

Cảm ơn trước :)

Tibo

+0

Nếu bạn chỉ thay đổi một dòng, các xung đột nhập nên được khá nhỏ. – Clueless

+0

bản sao có thể có của [Làm cách nào để xóa các tệp nhạy cảm khỏi lịch sử của git] (http://stackoverflow.com/questions/872565/how-do-i-remove-sensitive-files-from-gits-history) –

+0

@Clueless: các xung đột phát sinh khi rebasing, đây là những xung đột mà tôi đã giải quyết trong quá khứ – tbolender

Trả lời

38

Dưới đây là một lệnh đó sẽ loại bỏ một dòng vi phạm từ lịch sử của một tệp trong tất cả các chi nhánh của bạn:

git filter-branch --tree-filter 'sed -i "/sensitive information/ d" filename' -- --all 

Điều này sẽ kiểm tra mọi sửa đổi, chạy lệnh sed trên đó, sau đó cam kết sửa đổi lại.

Lệnh sed trong trường hợp này khớp với bất kỳ dòng nào chứa mẫu sensitive information trong tệp có tên filename và xóa các dòng đó.

Lưu ý: nếu bạn có bản sao lưu, hãy thử tập lệnh sed trước để đảm bảo nó hoạt động theo ý muốn của bạn, vì có thể mất nhiều thời gian để chạy trong một lịch sử lâu dài.

+0

Có khả năng bỏ qua lỗi sed (ví dụ: khi tệp không tồn tại trong một bản sửa đổi) không? – tbolender

+3

Tôi không biết liệu tùy chọn '-q' có thực hiện điều đó hay không. Bạn có thể phải bọc nó trong một vỏ nếu sau đó, như 'if [-e file]; sau đó sed ...; fi' –

+0

Sử dụng vỏ nếu làm việc cho tôi :) – tbolender

1

Bạn có thể có một cái nhìn tại git filter-branch

Các ví dụ trong liên kết sẽ giúp bạn đi: http://git-scm.com/docs/git-filter-branch

+1

Tôi đã tìm thấy một giải pháp để loại bỏ một tập tin hoàn chỉnh, nhưng không phải để thay đổi một dòng trong đó. Có thể đưa ra một ví dụ? – tbolender

4

tôi đã thực hiện lệnh này mà không lôi ra khi một tập tin không tồn tại:

filename=./path/to/your/filename 
filter=your_regex_here 

git filter-branch --tree-filter 'test -f $filename && sed -i.bak "/$filter/d" $filename || echo “skipping file“' -- --all 
Các vấn đề liên quan