Áp dụng .gitignore cho các tệp đã cam kết


436

Tôi đã cam kết tải các tập tin mà bây giờ tôi muốn bỏ qua. Làm thế nào tôi có thể nói với git bây giờ bỏ qua các tệp này từ các cam kết trong tương lai?

EDIT: Tôi cũng muốn xóa chúng khỏi kho lưu trữ. Chúng là các tệp được tạo sau khi xây dựng hoặc để hỗ trợ công cụ dành riêng cho người dùng.



8
@Wooble Câu trả lời có thể giống nhau, nhưng câu hỏi này mô tả chính xác vấn đề tôi gặp phải và cần giải quyết.
rjmunro

1
Đây là câu trả lời trực tiếp giải quyết câu hỏi tiêu đề với những thay đổi tối thiểu đối với repo git của bạn: stackoverflow.com/a/26245961/3543437
kayleeFrye_onDeck

Câu trả lời:


471

12
Có rất nhiều tập tin mặc dù. Tôi không muốn làm điều này cho mọi người
user880954

1
Là các tập tin trong bất kỳ thư mục phổ biến? Nếu không, vấn đề giảm xuống một câu hỏi sử dụng shell, không phải là một git.
Matt Ball

12
Không cần phải có 'Tôi quên thêm .gitignore cho đến sau chế độ cam kết ban đầu'.
Luke Puplett

9
Câu trả lời là dưới đây.
Bỏ qua

3
Nó yêu cầu tôi thêm cờ -r để có thể làm như vậy.
Vishal Gulati

599

Sau khi chỉnh sửa .gitignoređể khớp với các tệp bị bỏ qua, bạn có thể làm git ls-files -ci --exclude-standardđể xem các tệp được bao gồm trong danh sách loại trừ; sau đó bạn có thể làm

//On Linux:
git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached
//On Windows:
for /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
//On mac
alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached"

để xóa chúng khỏi kho lưu trữ (mà không xóa chúng khỏi đĩa).

Chỉnh sửa : Bạn cũng có thể thêm phần này dưới dạng bí danh trong tệp .gitconfig để bạn có thể chạy bất cứ lúc nào bạn muốn. Chỉ cần thêm dòng sau trong phần [bí danh] (sửa đổi khi cần cho Windows hoặc Mac):

apply-gitignore = !git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached

( -rCờ xargsngăn không cho git rmchạy trên một kết quả trống và in ra thông báo sử dụng của nó, nhưng chỉ có thể được hỗ trợ bởi công cụ tìm kiếm GNU. Các phiên bản khác xargscó thể có hoặc không có tùy chọn tương tự.)

Bây giờ bạn có thể chỉ cần gõ git apply-gitignorevào repo của bạn và nó sẽ làm việc cho bạn!


10
Tôi nghĩ rằng xargs cho mac không có -r ... hoặc của tôi là lỗi / cũ, tôi không biết ... và tại sao !trước git? tốt ... tôi đã làm việc như alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached". tks!
Felipe Sabino

18
Trên Windowsfor /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
Luke Puplett

Điều này chỉ xóa các tệp .gitignore của tôi, không phải các tệp tôi muốn bỏ qua được liệt kê trong các tệp .gitignore - đó có phải là điểm không?
Hippyjim

@Hippyjim nếu các tập tin đã được cam kết (mặc dù họ đã được liệt kê trong .gitignore), và .gitignore được không chưa cam kết, thì đó sẽ là kết quả mong đợi, nếu không, tôi không chắc chắn những gì đang xảy ra trong trường hợp của bạn.
Jonathan Callen

1
Đối với người dùng mac, -rmặc định và không được các phiên bản BSD chấp nhận. Vì vậy, loại bỏ -r.
Weishi Zeng

136

để lại tệp trong repo nhưng bỏ qua những thay đổi trong tương lai:

git update-index --assume-unchanged <file>

và hoàn tác điều này:

git update-index --no-assume-unchanged <file>

để tìm ra tập tin nào đã được đặt theo cách này:

git ls-files -v|grep '^h'

tín dụng cho câu trả lời ban đầu cho http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/


1
Chronial có một câu trả lời tuyệt vời cho việc thực hiện đệ quy này cho một thư mục: stackoverflow.com/a/16346756/1101076
jordan314

Tôi muốn cam kết một cấu hình IDE nhưng không theo dõi các thay đổi không cần thiết đối với nó. Điều này hoạt động, mặc dù tôi không chắc nó sẽ hoạt động cho những người khác kiểm tra kho lưu trữ. Nó có thể được kết hợp với git ls-files -ci --exclude-standard -z | xargs -0 git update-index --assume-unchangednếu điều đó giúp.
dlamblin

7
Đây là câu trả lời duy nhất thực hiện chính xác những gì câu hỏi tiêu đề yêu cầu. HOÀN HẢO! Hầu hết các câu trả lời khác là không cần thiết với các tập tin.
kayleeFrye_onDeck

1
Đây là câu trả lời chính xác cho câu hỏi. Sử dụng các lệnh như git rm --cachedsẽ loại bỏ tệp trong kho lưu trữ, không đáp ứng nhu cầu của quizzer. Cảm ơn bạn. Tôi rất trân trọng điều này. Câu trả lời của bạn giúp tôi rất nhiều.
ramwin

88

Hãy chắc chắn rằng repo thực tế của bạn là phiên bản mới nhất

  1. Chỉnh sửa .gitignoretheo ý muốn
  2. git rm -r --cached .
  3. git add .

sau đó cam kết như bình thường


14
Đây phải là câu trả lời được chấp nhận vì câu hỏi nói cụ thể có rất nhiều tệp cần xóa.
nbeuchat

3
Lưu ý rằng bước 2 này có thể mất một lúc nếu bạn có một kho lưu trữ lớn.
túi não

Điều này chỉ dẫn đến việc loại bỏ tất cả các tập tin khỏi chỉ mục! Điều này đã cứu tôi: git reset HEAD(Hãy nhớ để tránh bất kỳ thay đổi nào)
aksh1618

2
Bước 2 loại bỏ tất cả mọi thứ, vâng, nhưng bước 3 nên tập hợp lại tất cả, ngoại trừ những thứ không thành công do .gitignore.
ojchase

11

Câu hỏi cũ, nhưng một số người trong chúng ta đang ở git-posh(powershell). Đây là giải pháp cho điều đó:

git ls-files -ci --exclude-standard | foreach { git rm --cached $_ }

0

Thực hiện theo các bước sau:

  1. Thêm đường dẫn đến gitignoretập tin

  2. Chạy lệnh này

    git rm -r --cached foldername
    
  3. cam kết thay đổi như thường lệ.

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.