2012-12-23 31 views
11

Tôi đã mắc lỗi và một tệp trên một dự án trong kho git chứa mật khẩu. Nó không phải là một vấn đề bởi vì không phải là repo công cộng nhưng tôi muốn loại bỏ mật khẩu đó trong repo.chỉnh sửa tệp trong tất cả các cam kết trong git

Lịch sử lưu trữ rất đơn giản vì tôi là nhà phát triển duy nhất nên nó chỉ có 12 cam kết và một trong các cam kết được gắn thẻ.

Sự thay đổi trong trường hợp này sẽ không ảnh hưởng đến bất cứ điều gì trong lịch sử (khác biệt sẽ vẫn giữ nguyên) vì mật khẩu tôi muốn xóa hiện diện ngay từ lần commit đầu tiên. Tôi muốn loại bỏ chuỗi đó như thể nó không có ở đó bất cứ lúc nào.

Có một số loại lệnh để thực hiện việc này hay tôi phải tạo lại lịch sử ngay từ đầu với điểm bắt đầu mới mà không có mật khẩu và áp dụng các điểm khác trên đó?

+1

tôi gắn cờ này như bản sao của http://stackoverflow.com/questions/1186535/how-to- sửa đổi một quy định-cam kết, nơi bạn có câu trả lời của bạn. – zmo

+0

@zmo: liên kết mà bạn đưa ra không liên quan gì đến câu hỏi này.nó rất có thể là một bản sao của một cái gì đó, nhưng không phải của một cái này – mvp

Trả lời

6

Xem https://help.github.com/articles/remove-sensitive-data. tệp sẽ có mặt trong tất cả các cam kết, nếu bạn chưa xóa nó, vì tất cả các commit đều chứa trạng thái của toàn bộ repo.

Về cơ bản, những gì bạn cần làm là chạy một nhánh lọc trên tất cả các cam kết của bạn và sau đó đẩy đẩy vào repo. Lệnh này là phá hoại và sẽ thay đổi tất cả các cam kết trong đó tệp đã có mặt tại repo, vì vậy hãy cẩn thận.

+1

Để mở rộng trên đó: bạn đang tìm kiếm 'git filter-branch --tree-filter'. Vượt qua một kịch bản để thực hiện thay đổi mà bạn muốn, và git sẽ kiểm tra mọi cam kết, chạy kịch bản của bạn và tạo lại cam kết với các thay đổi của bạn. – Chronial

2

Cảm ơn đó chính là lệnh tôi đang tìm kiếm và đọc bài viết đó và tài liệu về bộ lọc-chi nhánh tôi có cú pháp chính xác mà tôi muốn sử dụng sed để xóa chuỗi khỏi tệp.

git filter-branch --tree-filter "sed -i 's/\<password\>//g' ./path_to_file/filename" --prune-empty --tag-name-filter cat -- --all 

nơi:

"password" -> Là chuỗi mà cần phải được loại bỏ

"./path_to_file/filename" -> là đường dẫn đến tập tin bên trong repo mà cần được sửa đổi

được chạy trong thư mục gốc đã thực hiện thủ thuật như một sự quyến rũ.

Sau khi thay đổi đã được thực hiện, nó phải được đẩy đến máy chủ từ xa. Điều này cần phải được buộc để máy chủ chấp nhận các thẻ và thẻ ref được viết lại hoàn toàn mới.

Vì vậy, một push buộc của repo đến máy chủ từ xa (nguồn gốc trong hầu hết các trường hợp)

git push origin --all --force 

Và một push buộc của thẻ vào máy chủ từ xa

git push origin --tags --force 
+1

lưu ý rằng bạn cũng phải a) đẩy lực đẩy vào repo và b) làm sạch mọi bản sao cục bộ của repo sau đó. đây là lý do tại sao tôi liên kết với một bài viết dài hơn và không cố gắng bao gồm tất cả ở đây. – eis

+0

có, sau khi lệnh tôi đã đẩy một lực đẩy của cả hai refs và thẻ. Tôi sẽ chỉnh sửa câu trả lời này cho đầy đủ. Cảm ơn. –

0

tôi sẽ làm như sau :

git rebase --interactive 

Thay đổi lệnh pick trước cam kết đầu tiên (cam kết với mật khẩu) để edit và giữ tất cả các dòng khác. Lưu file và thoát.

Sau đó, loại bỏ mật khẩu từ các tập tin (và làm bất kỳ thay đổi cần thiết khác), sau đó:

git add name-of-file-with-password 
git commit --amend 
git rebase --continue 
Các vấn đề liên quan