2009-03-09 29 views
24

Trước đây, sau đây là .gitignore tập tin của tôi:Làm cách nào để bỏ qua một tệp đã được cam kết?

... 
config/database.yml 
.DS_Store 

Sau đó tôi tạo ra một tập tin app_config.yml trong thư mục config và cam kết nó.

Bây giờ, tôi nhận ra rằng tôi không cần tệp app_config.yml trong kho git. Và tôi sửa đổi .gitignore tập tin của tôi:

... 
config/app_config.yml 
config/database.yml 
.DS_Store 

Bây giờ, khi tôi cam kết, rằng app_config.yml tập tin vẫn còn trong repo của tôi. Tôi muốn xóa tệp đó khỏi repo của mình. Tôi làm nó như thế nào?

Trả lời

43

Như mentionned trong "ignoring doesn't remove a file"
(đoạn trích sau bài viết tuyệt vời từ Nick Quaranto,
trong blog của mình git ready "học git một cam kết tại một thời điểm"):

Khi bạn bảo Git bỏ qua các tập tin, nó sẽ chỉ dừng xem các thay đổi cho tập tin đó, và không có gì khác.
Điều này có nghĩa là lịch sử sẽ vẫn ghi nhớ tệp và có tệp là
.

Nếu bạn muốn xóa một tập tin từ kho lưu trữ, nhưng giữ nó trong thư mục làm việc của bạn, chỉ cần sử dụng:

git rm --cached <file> 

Tuy nhiên, đây vẫn sẽ giữ các tập tin trong lịch sử.

Nếu bạn thực sự muốn loại bỏ nó từ lịch sử, bạn thực sự có hai lựa chọn:

  • viết lại cam kết của kho lưu trữ của bạn, hoặc
  • bắt đầu lại.

Cả hai tùy chọn đều thực sự hút và đó là lý do chính đáng: Git cố gắng không làm mất dữ liệu của bạn.
Cũng giống như với việc rebasing, Git buộc bạn phải suy nghĩ về các loại tùy chọn này vì chúng là các hoạt động phá hoại.

Nếu bạn thực sự muốn xóa tệp khỏi lịch sử, git filter-branch là công cụ tìm kiếm bạn đang tìm kiếm.
Chắc chắn đọc lên trên manpage của mình trước khi sử dụng vì nó sẽ ghi lại nghĩa đen cam kết của dự án của bạn. Đây thực sự là một công cụ tuyệt vời cho một số hành động và có thể thực hiện tất cả các loại công cụ như xóa hoàn toàn cam kết của một tác giả để di chuyển thư mục gốc của dự án.Lệnh để loại bỏ một tập tin từ tất cả các phiên bản là:

git filter-branch --index-filter 'git rm --cached <file>' HEAD 

Hành động này chắc chắn có thể hữu ích khi bạn cần phải thổi ra thông tin nhạy cảm hoặc bí mật có thể đã được đặt trong kho lưu trữ của bạn

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