.gitignore sau khi cam kết


210

Tôi có một kho git được lưu trữ trên Github. Sau khi thực hiện nhiều tác phẩm, tôi nhận ra rằng tôi cần phải tạo ra .gitignorevà loại trừ .exe, .objtập tin.

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


6
Những người làm việc trong tương lai có thể thấy điều này cực kỳ hữu ích. Cô đọng và chính xác
Austin Dean

Câu trả lời:


331

Không, bạn không thể buộc một tệp đã được cam kết trong repo bị xóa chỉ vì nó được thêm vào .gitignore

Bạn phải git rm --cachedxóa các tệp mà bạn không muốn trong repo. (- đã được chỉnh sửa vì bạn có thể muốn giữ bản sao cục bộ nhưng xóa khỏi repo.) Vì vậy, nếu bạn muốn xóa tất cả exe khỏi repo của bạn, hãy làm

git rm --cached /\*.exe

(Lưu ý rằng dấu hoa thị * được trích dẫn từ 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 tệp và thư mục con)


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

4
/ \ 'S dùng để làm gì?
Costa

5
@Costa họ ở đó để thoát khỏi dấu hoa thị, để ngăn cái vỏ diễn giải nó, như dự định của nó git.
Lambart

2
Cảnh báo: Các tệp được giữ ở chế độ cục bộ, đó là sự thật ... Nhưng những người dùng khác đang chạy git pullsẽ thấy các tệp của họ bị xóa.
ByScripts

42

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

Không. Ngay cả với một .gitignoretệp hiện có, bạn có thể tạo các tệp "bị bỏ qua" bằng -fcờ (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

Điều đó có nghĩa là tôi đã xóa từng phần mềm .exe
Madhur Ahuja

Bạn có thể có thể xử lý lô này, nhưng tôi không biết cách thức hoạt động của nó dưới cửa sổ
KingCrunch

30

Nếu bạn chưa thúc đẩy các thay đổi:

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

15

Tôi đã phải xóa .idea và các thư mục đích và sau khi đọc tất cả các bình luận, điều 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ên để làm chủ


.idealà vấn đề của tôi, tôi đoán nó cũng là của bạn:)
Olivier Pons

5

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

Không.

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

Trang man cho git-filter-nhánh chứa các ví dụ toàn diện.

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

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


Tôi đã chạy lệnh này, nó hiển thị Rewrite 57c1f1f04a3ed01f50c3260714cfc82c973ac816 (3/3) CẢNH BÁO: Ref 'refs / Heads / master' không thay đổi và không có gì xảy ra
Madhur Ahuja

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

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 xem xét sử dụng BFG Repo-Cleaner . Nó là một thay thế cho git-filter-nhánh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.