Câu hỏi Loại bỏ nhiều tập tin từ một repo Git đã bị xóa khỏi đĩa


Tôi có một repo Git mà tôi đã xóa bốn tập tin từ việc sử dụng rm (không phải  git rm) và trạng thái Git của tôi trông như sau:

#    deleted:    file1.txt
#    deleted:    file2.txt
#    deleted:    file3.txt
#    deleted:    file4.txt

Làm thế nào để loại bỏ các tập tin này từ Git mà không cần phải tự đi qua và thêm mỗi tập tin như thế này:

git rm file1 file2 file3 file4

Lý tưởng nhất, tôi đang tìm một cái gì đó hoạt động theo cùng một cách git add . nếu có thể.


1229
2018-01-29 17:18


gốc


có liên quan: stackoverflow.com/questions/1856654/… - kch
@seth, không phải lúc nào cũng thuận tiện để sử dụng git rm, việc loại bỏ có thể là từ một công cụ riêng biệt, IDE hoặc trình quản lý tệp. Visual Studio cho một có thể là một nỗi đau khi loại bỏ / đổi tên tập tin. - Brett Ryan
Ugh, hỏi tại sao ai đó không sử dụng git rm hơi giống như hỏi tại sao họ không sử dụng git vim hoặc là git cd. Đó là một điều ngu ngốc phải làm, và git nên có một lệnh hoặc bí danh được cài đặt sẵn để xóa các tệp đã xóa khỏi dàn dựng và bạn không cần phải tìm kiếm trên SO hoặc đọc trang người đàn ông vào giờ nghỉ trưa của bạn. - WCWedin
Câu trả lời của Varinder không phải là một cách hay. Hãy xem xét git add -u như Cody đã gợi ý và đó cũng là câu trả lời cho câu hỏi này: stackoverflow.com/questions/1402776/… - Roland
Có thể trùng lặp Làm thế nào để thêm và cam kết xóa bỏ được thực hiện với "rm" thay vì "git rm"?


Các câu trả lời:


Dành cho Git 1.x

$ git add -u

Điều này cho phép git tự động hiển thị các tệp được theo dõi - bao gồm xóa các tệp được theo dõi trước đó.

Dành cho Git 2.0

Để giai đoạn toàn bộ cây làm việc của bạn:

$ git add -u :/

Để chỉ giai đoạn đường dẫn hiện tại:

$ git add -u .

2206
2017-09-10 00:13



Lưu ý rằng điều này sẽ thêm tất cả các thay đổi, theo dõi các tập tin - xóa và cập nhật. - Ian Hunter
@beanland, bạn chỉ cần cung cấp đường dẫn đến tệp cụ thể mà bạn muốn sửa đổi nếu bạn không muốn nó nhận được tất cả. ví dụ. git add -u [đường dẫn] - Paul Prewett
cũng thế git add -u folder/ để chạy thao tác này trong một thư mục - c..
FYI: câu trả lời này được hợp nhất từ stackoverflow.com/questions/1402776/… - Shog9♦
đây phải là câu trả lời được chấp nhận - arainone


git ls-files --deleted -z | xargs -0 git rm 

có thể là những gì bạn đang tìm kiếm .. nó hoạt động cho tôi ..


1336
2018-02-28 20:21



Lưu ý rằng câu trả lời này sẽ không hoạt động trên Windows: / - Phrogz
cảnh giác với các tệp có dấu cách trong tên của chúng - maazza
Đã thử trên cửa sổ gitbash .. hoạt động rất tốt. +1. - Vijay C
@DaveEveritt git ls-files --deleted -z | xargs -0 git rm - Max Nanasy
git add -u như Cody gợi ý là một cách đơn giản hơn và an toàn hơn, không có nguy cơ vô tình xóa các tập tin. - Roland


Bạn có thể dùng

git add -u

Để thêm các tệp đã xóa vào khu vực dàn dựng, hãy cam kết chúng

git commit -m "Deleted files manually"

725
2018-01-29 17:25



Xin lưu ý người dùng Google: Nó cũng thêm các tệp được theo dõi đã sửa đổi vào khu vực dàn dựng. - erenon
Chỉ chạy lệnh này nếu bạn vừa xóa các tệp và muốn hiển thị chúng ngay lập tức. - Aryo
tôi không thể xóa tệp khỏi repo bitbucket] - srinivas gowda


Nếu bạn chỉ cần chạy:

git add -u

git sẽ cập nhật chỉ mục của nó để biết rằng các tệp mà bạn đã xóa thực sự là một phần của cam kết tiếp theo. Sau đó, bạn có thể chạy "git commit" để kiểm tra thay đổi đó.

Hoặc, nếu bạn chạy:

git commit -a

Nó sẽ tự động thực hiện những thay đổi này (và bất kỳ thay đổi nào khác) và cam kết chúng.

Cập nhật: Nếu bạn chỉ muốn thêm các tệp đã xóa, hãy thử:

git ls-files --deleted -z | xargs -0 git rm
git commit

354
2017-09-10 00:15



Đúng, git commit -a sẽ làm những gì tôi muốn, ngoại trừ trong một số trường hợp tôi có các tập tin mà tôi không muốn cam kết, vì vậy tôi muốn chuẩn bị các cam kết bằng tay. - Igor Zevaka
commit -a thực chất là một "add -u" trước; nó sẽ cập nhật chỉ mục với bất kỳ thay đổi nào đối với các tệp đã biết (có thể chúng bị xóa hoặc thay đổi đơn giản). Tất nhiên bạn có thể cụ thể hơn và chỉ thêm / rm các tệp bạn muốn. git.or.cz/gitwiki/… có thể hữu ích. - Emil Sit
Lệnh bên dưới "Update: .." hoạt động như một sự quyến rũ. Cảm ơn! - Jay Taylor
Cảm ơn bạn rất nhiều vì 'git ls-files --deleted | xargs git rm '! - mit
"git ls-files --deleted | xargs git rm" là câu trả lời đúng! Cảm ơn! - reto


Có thể bạn đang tìm kiếm -A:

git add -A

điều này tương tự như git add -u, nhưng cũng thêm các tệp mới. Đây là khoảng tương đương với của hg addremove lệnh (mặc dù phát hiện di chuyển là tự động).


163
2018-01-29 18:10



Trên một lưu ý nhanh, sử dụng -u giới hạn việc thêm vào các tệp được theo dõi và -a sẽ bao gồm các tệp không được theo dõi. Chỉ nghĩ rằng tôi sẽ chỉ ra sự khác biệt. - spaaarky21
Ở giai đoạn này, bạn cũng có thể thêm tất cả thông qua cờ cam kết. - Zac Grierson


Đến sân khấu chỉ xóa các tập tin:

for x in $(git status | grep deleted | awk '{print $2}'); do git rm $x; done

Hoặc (cách xargs):

git status | awk '/deleted/ {print $2}' | xargs git rm

Bạn có thể bí danh lệnh ưa thích của bạn được đặt để sử dụng sau này thuận tiện.


92
2017-11-26 10:34



@Saeb Hiểu về hàng đợi, nhưng xargs khoảng 15 phút để làm chủ. - Eric Wilson
git status | awk '/deleted/ {print $3}' | xargs git rm sẽ là một cách ngắn hơn để làm điều đó. grep | awk... Chỉ cần nói không. - Mark Reed
git rm $(git ls-files --deleted) không phải là điều này thuận tiện hơn (sao chép từ điều này). - Hotschke
xargs hoặc sự thay thế $ () ở trên nếu bạn biết danh sách không lớn. Nếu danh sách Là khổng lồ: git ls-files --deleted | while read f; do git rm $f; done - Andrew
thanh lịch hơn một chút:git status | awk '/deleted/{print "git rm " $3}' | sh - Jakub M.


git rm test.txt

Trước hoặc sau khi bạn xóa tệp thực.


59
2017-09-10 00:13



Trong khi nó sẽ hoạt động, tôi thường thấy mình xóa một tấn tập tin thông qua chỉ rm và hối hận sau. - carl
Tại sao điều này tệ hơn là làm git add -u? Có vẻ như sẽ an toàn hơn khi thêm các tệp cụ thể đã bị xóa vào cam kết, thay vì thêm TẤT CẢ CÁC thay đổi. - Ian Dunn
thực sự đây sẽ là câu trả lời tốt nhất theo dòng cuối cùng của câu hỏi "Tôi chỉ muốn một lệnh xóa tất cả các tệp khỏi git cũng bị xóa khỏi đĩa". - Ramsharan
@Ramsharan không, bởi vì nó không làm điều đó cả. Thao tác này sẽ xóa một tệp duy nhất; OP SPECIFICALLY đã yêu cầu "tất cả" các tệp đã xóa. - Adam
@Ramsharan không, đó là điểm - trong hầu hết các trường hợp, bạn KHÔNG THỂ chỉ cần sử dụng một ký tự đại diện (không có ký tự đại diện nào khớp với nhau). Đây là lý do tại sao có câu trả lời chính phức tạp hơn nhiều. - Adam


Bằng cách sử dụng git-add với các tùy chọn '--all' hoặc '--update', bạn có thể nhận được nhiều hơn mức bạn muốn. Các tệp mới và / hoặc sửa đổi cũng sẽ được thêm vào chỉ mục. Tôi có thiết lập bí danh bash khi tôi muốn xóa các tệp đã xóa khỏi git mà không cần chạm vào các tệp khác:

alias grma='git ls-files --deleted -z | xargs -0 git rm'

Tất cả các tệp đã bị xóa khỏi hệ thống tệp được thêm vào chỉ mục là đã xóa.


47
2018-01-31 04:50





Không phải là nó thực sự quan trọng, nhưng tôi không đồng ý với câu trả lời đã chọn:

git add -u 

... sẽ xóa các tệp khỏi chỉ mục nếu các tệp tương ứng trong cây đang hoạt động đã bị xóa, nhưng nó cũng sẽ điều chỉnh nội dung mới được sửa đổi của các tệp được theo dõi.

git rm $(git ls-files --deleted)

... mặt khác sẽ chỉ rm các tập tin bị xóa đã được theo dõi.

Vì vậy, thứ hai trong quan điểm của tôi là lựa chọn tốt hơn.


38
2018-04-09 11:24





Nếu đó là những thay đổi duy nhất, bạn chỉ cần làm

git commit -a

để thực hiện tất cả thay đổi. Điều đó sẽ bao gồm các tệp đã xóa.


28
2018-01-29 17:29



Không chắc tại sao tôi bị bỏ phiếu; git thực hiện tốt công việc xác định các tệp đã bị xóa, ngay cả khi bạn không nói rõ ràng bằng cách sử dụng git rm. - SpoonMeiser
Bạn đã bị bỏ phiếu vì "-a" không phải là một chuyển đổi chấp nhận được, đó là "-A". Chỉnh sửa câu trả lời của bạn. - Sheharyar
Không, "-a" Là một chuyển đổi chấp nhận được, bởi vì lệnh cam kết. "-A" là công tắc để thêm vào nhưng không cam kết. Tôi thấy chỉnh sửa được đề xuất của bạn đã bị từ chối. - SpoonMeiser
điều duy nhất làm việc cho tôi - Jim Chertkov
Trong trường hợp điều duy nhất bạn cam kết là tệp đã bị xóa, hãy thêm nút chuyển - cho phép trống - billrichards