2011-06-30 10 views
141

Tôi có kho lưu trữ git được lưu trữ trên Github. Sau khi cam kết nhiều tệp, tôi nhận ra rằng tôi cần tạo .gitignore và loại trừ .exe, .obj tệp.gitignore sau khi cam kết

Tuy nhiên, nó sẽ tự động xóa các tệp đã cam kết này khỏi kho lưu trữ? Có cách nào để ép buộc điều đó không?

+0

nhân viên của Google trong tương lai có thể tìm thấy điều này cực kỳ hữu ích. Tính gọn gàng và cho điểm: https://www.git-tower.com/learn/git/faq/ignore-tracked-files-in-git –

Trả lời

235

Không bạn không thể ép buộc một tập tin đó đã được cam kết trong hợp repo phải được loại bỏ chỉ vì nó được thêm vào .gitignore

Bạn phải git rm --cached để loại bỏ các tập tin mà bạn không muốn trong repo. (--cached kể từ khi bạn có thể muốn giữ lại bản sao cục bộ nhưng loại bỏ từ repo.) Vì vậy, nếu bạn muốn loại bỏ tất cả của exe từ repo của bạn làm

git rm --cached /\*.exe 

(Lưu ý rằng các dấu * là trích dẫn từ các shell - điều này cho phép git chứ không phải shell, mở rộng tên đường dẫn của các tệp và thư mục con)

+0

Điều đó có nghĩa là tôi đã loại bỏ từng .exe –

+5

@Madhur Ahuja Trên thực tế nếu bạn làm 'git rm/\ *. exe' nó sẽ xóa tất cả các exe trong repo của bạn – manojlds

+3

Các/\ 's cho là gì? – Costa

23

Tuy nhiên, nó sẽ tự động xóa các tệp đã cam kết này khỏi kho lưu trữ?

No. Ngay cả với .gitignore hiện tại, bạn có thể đặt các tệp "bỏ qua" có cờ -f (lực). Nếu các tệp đó đã được cam kết, chúng sẽ không bị xóa tự động.

git rm --cached path/to/ignored.exe 
+0

Điều đó có nghĩa là tôi đã loại bỏ từng phần riêng lẻ .exe –

+0

Bạn có thể lô này, nhưng tôi không biết làm thế nào điều này hoạt động dưới cửa sổ – KingCrunch

5

Tuy nhiên, nó sẽ tự động xóa các tệp đã cam kết này khỏi kho lưu trữ?

số

Các 'tốt nhất' công thức để làm điều này là sử dụng git filter-branch như viết về ở đây:

Các trang người đàn ông cho git-filter-branch chứa các ví dụ toàn diện.

Lưu ý Bạn sẽ được ghi lại lịch sử. Nếu bạn đã xuất bản bất kỳ bản sửa đổi nào chứa các tệp được thêm vào vô tình, điều này có thể gây rắc rối cho người dùng của các nhánh công cộng đó. Thông báo cho họ, hoặc có lẽ suy nghĩ về cách bạn cần phải loại bỏ các tập tin.

Lưu ý Khi có thẻ, luôn sử dụng tùy chọn --tag-name-filter cat để git filter-branch. Nó không bao giờ đau và sẽ giúp bạn tiết kiệm đau đầu khi bạn nhận ra sau đó bạn cần nó

+0

Tôi chạy lệnh này nó cho thấy Rewrite 57c1f1f04a3ed01f50c3260714cfc82c973ac816 (3/3) CẢNH BÁO: Ref 'refs/heads/master' không thay đổi và không có gì xảy ra –

+0

Đó là cảnh báo, và rất có thể có nghĩa là nhánh chính chưa chứa bất kỳ sửa đổi nào với các tệp cần xóa. Bạn có thể dễ dàng kiểm tra điều đó. Nếu có sự cố, vui lòng cập nhật câu hỏi. ** PS: ** use - '--all' để viết lại tất cả các nhánh (cục bộ) cùng một lúc – sehe

+0

Liên kết dường như không hoạt động nữa ... – Noctis

1

Ngay cả sau khi bạn xóa (các) tệp và sau đó cam kết, bạn vẫn sẽ có các tệp đó trong lịch sử. Để xóa chúng, hãy cân nhắc sử dụng BFG Repo-Cleaner. Nó là một thay thế cho git-filter-branch.

5

Tôi phải xóa.ý tưởng và mục tiêu thư mục và sau khi đọc tất cả các ý kiến ​​này đã làm việc cho tôi:

git rm -r .idea 
git rm -r target 
git commit -m 'removed .idea folder' 

và sau đó đẩy để làm chủ

1

Nếu bạn chưa đẩy những thay đổi đã:

git rm -r --cached . 
git add . 
git commit -m 'clear git cache' 
git push