Làm cách nào để xóa các tệp được liệt kê trong .gitignore nhưng vẫn còn trên kho lưu trữ?


327

Tôi có một số tệp trong kho lưu trữ của tôi nên được bỏ qua, tôi đã thêm chúng vào .gitignore nhưng, tất nhiên, chúng không bị xóa khỏi kho lưu trữ của tôi.

Vì vậy, câu hỏi của tôi là, có một lệnh ma thuật hoặc tập lệnh sử dụng nhánh bộ lọc có thể viết lại lịch sử của tôi và xóa tất cả các tệp này một cách dễ dàng không? Hoặc chỉ đơn giản là một lệnh sẽ tạo ra một cam kết sẽ loại bỏ chúng?





CẢNH BÁO: Mặc dù điều này sẽ không xóa tệp vật lý khỏi cục bộ của bạn, nhưng nó sẽ xóa các tệp khỏi các máy phát triển khác trong lần kéo git tiếp theo. Làm cách nào để Gitv quên quên về một tệp đã được theo dõi nhưng hiện đang ở .gitignore?
Kris Roofe

@Stevoisiak đây không phải là một bản sao của câu hỏi đó bởi vì câu hỏi này hỏi về TẤT CẢ các tệp bị bỏ qua và nó cũng có câu trả lời tốt hơn bất kỳ câu hỏi tương tự nào.
Omn

Câu trả lời:


436

Bạn có thể xóa chúng khỏi kho lưu trữ theo cách thủ công:

git rm --cached file1 file2 dir/file3

Hoặc, nếu bạn có nhiều tệp:

git rm --cached `git ls-files -i --exclude-from=.gitignore`

Nhưng điều này dường như không hoạt động trong Git Bash trên Windows. Nó tạo ra một thông báo lỗi. Sau đây hoạt động tốt hơn:

git ls-files -i --exclude-from=.gitignore | xargs git rm --cached  

Về việc viết lại toàn bộ lịch sử mà không có các tập tin này, tôi rất nghi ngờ có một cách tự động để làm điều đó.
Và tất cả chúng ta đều biết rằng viết lại lịch sử là xấu, phải không? :)


2
Thật không may, lệnh Git Bash trên Windows không hoạt động với các đường dẫn chứa khoảng trắng
Nate Bundy

19
@Cupdding cảm ơn. git ls-files -i -z --exclude-from=.gitignore | xargs -0 git rm --cacheddường như thực hiện mánh khóe
Nate Bundy

3
Tôi đã bị mắc kẹt với cùng một vấn đề trên windows. Tôi đang sử dụng powershell, và trong trường hợp của tôi, tôi đã nhận được lệnh thứ ba do @ samy-dindane đưa ra và thay đổi nó thành một foreach. Nó đã trở thành thế nàygit ls-files -i --exclude-from=.gitignore | %{git rm --cached $_}
digaomatias

1
"git ls-files -i --exclude-from = .gitignore" rất hữu ích, nó cho tôi biết những tập tin nào bị loại trừ bởi .ignore.
Owen Cao

1
Tôi rất vui khi tìm thấy các lệnh này, NHƯNG nó không thực sự loại bỏ các tệp khỏi kho lưu trữ. Khi tôi loại bỏ 2300 kB hình ảnh, kích thước kho lưu trữ chỉ giảm 10 kB. Vì vậy, nó không thể được sử dụng, ví dụ, để làm cho kho lưu trữ nhỏ hơn và nhanh hơn để chuyển.
Jan Potužník

342

Một cách dễ dàng hơn để làm việc trên bất kỳ HĐH nào là làm

git rm -r --cached .
git add .
git commit -m "Removing all files in .gitignore"

Về cơ bản, bạn sắp xếp lại tất cả các tệp, ngoại trừ các tệp trong .gitignore


1
Làm thế nào điều này ảnh hưởng đến người dùng khác trên repo thực hiện kéo - khi tôi đọc nó thư mục chúng tôi không muốn theo dõi nữa bị xóa ??? Làm thế nào chúng ta có thể ngăn chặn điều này - chúng ta chỉ muốn mở khóa
snh_nl

Điều này sẽ đánh dấu tất cả các tệp là thay đổi với một thông điệp cam kết giả mạo!
Haidar Zeineddine

3
bạn có ý nghĩa gì bởi tin nhắn cam kết giả? Đó là một thông điệp cam kết thực sự: P Tất nhiên bạn có thể thay đổi tin nhắn, tùy thuộc vào nhu cầu của bạn ...
gtatr

1
Để hoàn thành vì bạn cần lệnh git đẩy ở cuối.
Mariusz Bialobrzeski

1
Đừng làm điều này, nó sẽ xóa lịch sử trên tất cả các tệp
agrath

144

Vì các tệp trong .gitignore không được theo dõi, bạn có thể sử dụng lệnh git clean để xóa đệ quy các tệp không thuộc kiểm soát phiên bản.

Sử dụng git clean -xdnđể thực hiện chạy khô và xem những gì sẽ được gỡ bỏ.
Sau đó sử dụng git clean -xdfđể thực hiện nó.

Về cơ bản, git clean -hhoặcman git-clean (trong unix) sẽ cung cấp cho bạn sự giúp đỡ.

Xin lưu ý rằng lệnh này cũng sẽ xóa các tệp mới không nằm trong khu vực tổ chức.

Hy vọng nó giúp.


6
Đây phải là câu trả lời được chấp nhận. Nó thực sự hoạt động (câu trả lời được chấp nhận không hoạt động với tôi, trên macOS), và nó sạch hơn.
Roger Oba

25
Câu trả lời này không áp dụng - OP cho biết các tệp .gitignore đang được theo dõi.
Ken Williams

20
HÃY THỬ! Điều này sẽ xóa vĩnh viễn tất cả các tệp không bị theo dõi, thay vì chỉ xóa khỏi chi nhánh
Emmanuel

1
đó git clean -xdnlà một hoạt động khô mà sẽ không xóa. người tiếp theo sẽ.
JohnZaj

17
-1: Đây là một câu trả lời sai lệch cao - người đăng ban đầu muốn xóa khỏi kho lưu trữ, không xóa hoàn toàn các tệp. Tôi đã gần như xóa một tải các tệp động do IDE của tôi yêu cầu nhưng không bắt buộc phải ở trong repo.
Auspice

4

Tôi đã thực hiện một giải pháp rất đơn giản bằng cách thao tác đầu ra của câu lệnh .gitignore với sed:

cat .gitignore | sed '/^#.*/ d' | sed '/^\s*$/ d' | sed 's/^/git rm -r /' | bash

Giải trình:

  1. in tệp .gitignore
  2. xóa tất cả các ý kiến ​​từ bản in
  3. xóa tất cả các dòng trống
  4. thêm 'git rm -r' vào đầu dòng
  5. thực hiện mọi dòng.

10
sedlà đơn giản?
IgorGanapolsky

0

Trong linux bạn có thể sử dụng lệnh này:

ví dụ tôi muốn xóa "* .py ~" vì vậy lệnh của tôi phải là ==>

find . -name "*.py~" -exec rm -f {} \;


-3

Git sẽ bỏ qua các tệp khớp với mẫu .gitignore sau khi bạn thêm nó vào .gitignore.

Nhưng các tập tin đã tồn tại trong kho sẽ vẫn còn.

sử dụng git rm files_ignored; git commit -m 'rm no use files'để xóa các tập tin bị bỏ qua.


4
Có rất nhiều trong số họ, có cách nào để xóa chúng mà không phải chỉ định tên của họ?
Intrepidd
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.