Xóa nhiều tệp khỏi repo Git đã bị xóa khỏi đĩa


1311

Tôi có một repo Git mà tôi đã xóa bốn tệp khỏi sử dụng rm( không git rm ) và trạng thái Git của tôi trông như thế này:

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

Làm cách nào để xóa các tệp này khỏi Git mà không cần phải tự đi qua và thêm từng tệp như thế này:

git rm file1 file2 file3 file4

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



10
@seth, không phải lúc nào cũng thuận tiện để sử dụng git rm, việc xóa có thể là từ một công cụ, IDE hoặc trình quản lý tệp riêng biệt. Visual Studio cho một người có thể là một nỗi đau khi loại bỏ / đổi tên tập tin.
Brett Ryan

67
Ugh, hỏi tại sao ai đó không sử dụng git rmcũng giống như hỏi tại sao họ không sử dụng git vimhoặc 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 tích hợp để xóa các tệp đã bị xóa khỏi dàn dựng và bạn không cần phải tìm nó trên SO hoặc đọc các trang hướng dẫn trong giờ nghỉ trưa.
WCWedin

7
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 đã đề xuất và đó cũng là câu trả lời cho câu hỏi này: stackoverflow.com/questions/1402776/ mẹo
Roland

Câu trả lời:


2300

Đối với Git 1.x

$ git add -u

Điều này nói với git để tự động giai đoạn 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 :/

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

$ git add -u .

133
Lưu ý rằng điều này sẽ thêm tất cả các tệp đã thay đổi, được theo dõi - đã xóa và cập nhật.
Ian Hunter

19
@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ó có được tất cả. ví dụ: git add -u [path]
Paul Prewett

27
cũng git add -u folder/để chạy thao tác này trong một thư mục
c ..

2
FYI: câu trả lời này được hợp nhất từ stackoverflow.com/questions/1402776/iêu
Shog9

1
Đó có thể là câu hỏi mà mọi người đã hỏi khi họ đến trang này và đó có thể là những gì OP thực sự muốn hỏi, nhưng nó không trả lời chính xác câu hỏi được hỏi.
Tương đương

1362
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 với tôi ..


5
đối với các cửa sổ, hãy thử thêm bí danh sau vào cấu hình của bạn mà không có dấu ngoặc kép như đã nêu ở trên bởi Evan Moran 'remove =! git ls-files --delatted -z | xargs -0 git rm '
CLS

21
cảnh giác với các tập tin có dấu cách trong tên của chúng
maazza

44
@DaveEverittgit ls-files --deleted -z | xargs -0 git rm
Max Nanasy

15
git add -u như Cody đề xuất là cách đơn giản và an toàn hơn nhiều, không có nguy cơ vô tình xóa các tệp.
Roland

4
Đánh giá thấp điều này vì đây là câu trả lời sai ngay cả khi nó có thể hoạt động đối với một số tệp. sử dụng "git add -u" bên dưới. Đó là những gì nó làm.
n13

733

Bạn có thể dùng

git add -u

Để thêm các tệp đã xóa vào khu vực tổ chức, sau đó cam kết chúng

git commit -m "Deleted files manually"

101
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 tổ chức.
erenon

4
Chỉ chạy lệnh này nếu bạn vừa xóa các tệp và muốn xử lý chúng ngay lập tức.
Aryo

1
tôi không thể xóa tệp khỏi bitbucket repo]
srinivas gowda

356

Nếu bạn chỉ đơn giản là 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 sự 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

1
Phải, git commit -asẽ 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 mà tôi không muốn cam kết, vì vậy tôi muốn chuẩn bị cam kết theo cách thủ công.
Igor Zevaka

2
cam kết -a về cơ bản thực hiện "thêm -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ể 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 Ngồi

2
Bộ lệnh bên dưới "Cập nhật: .." hoạt động như một lá bùa. Cảm ơn!
Jay Taylor

10
Cảm ơn bạn rất nhiều vì 'git ls-files - đã xóa | xargs git rm '!
mit

18
"git ls-files --delatted | xargs git rm" là câu trả lời đúng! Cảm ơn!
reto

166

Có lẽ 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. Điều này gần tương đương với addremovelệnh của hg (mặc dù phát hiện di chuyển là tự động).


8
Trên một ghi chú nhanh, sử dụng -u giới hạn thêm vào các tệp được theo dõi và -a cũng sẽ bao gồm các tệp không bị theo dõi. Chỉ cần 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 -a.
Zac Grierson

94

Để giai đoạn chỉ các tập tin bị xóa :

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ể đặt bí danh cho bộ lệnh ưa thích của mình để sử dụng sau.


2
@Saeb Hiểu về hàng đợi, nhưng xargskhoảng 15 phút để thành thạo .
Eric Wilson

11
git status | awk '/deleted/ {print $3}' | xargs git rmsẽ là một cách ngắn hơn để làm điều đó. grep | awk... Chỉ cần nói số
Mark Reed

58
git rm $(git ls-files --deleted)không phải điều này thuận tiện hơn (sao chép từ này ).
Hotschke

1
xargs hoặc thay thế $ () ở trên nếu bạn biết danh sách không lớn. Nếu danh sách rất lớn: git ls-files --deleted | while read f; do git rm $f; done
Andrew

2
@Andrew xargscó lẽ hiệu quả hơn một vòng lặp while cho một danh sách lớn, vì nó truyền nhiều hơn một đối số mỗi lần nó thực thi git rm. Để giới hạn số lượng đối số được truyền cho git rmmỗi lần nó được thực thi, hãy sử dụng -ntùy chọn:git ls-files --deleted | xargs -n 15 git rm
Ajedi32

61
git rm test.txt

Trước hoặc sau khi bạn xóa các tập tin thực tế.


7
Trong khi nó sẽ hoạt động, tôi thường thấy mình xóa hàng tấn tệp chỉ rmvà hối hận về sau.
carl

4
Tại sao điều này tồi tệ hơn 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

2
thực ra đây phải 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

2
@Ramsharan không, bởi vì nó không làm điều đó cả. Điều này xóa một tập tin duy nhất; OP ĐẶC BIỆT yêu cầu "tất cả" các tệp đã bị xóa.
Adam

1
@Ramsharan không, đó là điểm chính - trong hầu hết các trường hợp bạn KHÔNG THỂ sử dụng ký tự đại diện (không có ký tự đại diện nào phù hợp). Đây là lý do tại sao có câu trả lời chính phức tạp hơn nhiều.
Adam

49

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 bạn muốn. Các tập tin mới và / hoặc sửa đổi cũng sẽ được thêm vào chỉ mục. Tôi có một 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 khi bị xóa.


39

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 làm việc đã bị xóa, nhưng nó cũng sẽ giai đoạn sửa đổi nội dung mớ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, cái sau trong quan điểm của tôi là lựa chọn tốt hơn.


29

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

git commit -a

để cam kết tất cả các thay đổi. Điều đó sẽ bao gồm các tập tin bị xóa.


3
Không chắc chắn tại sao tôi đã bỏ phiếu; git thực hiện tốt 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ỏ phiếu - vì "-a" không phải là một công tắc chấp nhận được, đó là "-A". Chỉnh sửa câu trả lời của bạn.
Sheharyar

10
Không, "-a" một công tắc có thể chấp nhận được, bởi vì lệnh là cam kết . "-A" là một công tắc để thêm nhưng không cam kết . Tôi thấy chỉnh sửa đề xuất của bạn đã bị từ chối.
SpoonMeiser

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 công tắc - không trống
billrichards

err, thực sự - không có gì là trống rỗng chỉ cần thiết nếu bạn đã git rm
--cached

20
git ls-files --deleted | xargs git rm 

là tùy chọn tốt nhất để chỉ thêm các tập tin bị xóa.

Đây là một số tùy chọn khác.

git add .  => Add all (tracked and modified)/new files in the working tree.

git add -u => Add all modified/removed files which are tracked.

git add -A => Add all (tracked and modified)/(tracked and removed)/new files in the working tree.

git commit -a -m "commit message" - Add and commit modified/removed files which are tracked.

16

git thêm -u

-u --update Chỉ khớp với các tệp đã được theo dõi trong chỉ mục chứ không phải là cây làm việc. Điều đó có nghĩa là nó sẽ không bao giờ tạo các tệp mới, nhưng nó sẽ sửa đổi nội dung mới của các tệp được theo dõi và nó sẽ xóa các tệp khỏi chỉ mục nếu các tệp tương ứng trong cây làm việc đã bị xóa.

Nếu không được đưa ra, mặc định là "."; nói cách khác, cập nhật tất cả các tệp được theo dõi trong thư mục hiện tại và các thư mục con của nó.


Câu trả lời được bình chọn hàng đầu đã nói để sử dụng git add -u. Trường hợp tất cả những thứ khác trong câu trả lời của bạn đến từ đâu, tài liệu? Bạn nên liên kết đến tài liệu và chặn nó nếu có.
TheWar WarriorNamedFoo

14

Giải pháp đơn giản đó hoạt động tốt với tôi:

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

Tôi nghĩ bạn nên luôn luôn sử dụng git shell trong thư mục làm việc hiện tại của mình
Houssem Badri

2
Điều này tốt và đơn giản nhưng không hoạt động với các thư mục đệ quy.
DrB

@BehnazChangizi Tôi nghĩ là có, stackoverflow.com/questions/1054044/NH
Houssem Badri

@PvdL không được chấp nhận khoảng trắng trong đường dẫn là vấn đề os-specefic
Houssem Badri

11

Nếu bạn muốn thêm nó vào, hãy .gitconfiglàm điều này:

[alias]
  rma = !git ls-files --deleted -z | xargs -0 git rm

Sau đó, tất cả những gì bạn phải làm là chạy:

git rma

1
và từ dòng cmdgit config --global alias.rmd '!git ls-files --deleted -z | xargs -0 git rm'
Casey

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

Thao tác này sẽ xóa tất cả các tệp đã bị xóa trước đó bởi git, cũng như xử lý trường hợp tên tệp của bạn có khoảng trắng trong đó.

Tùy thuộc vào biến thể POSIX của bạn, bạn có thể cần phải sử dụng xargs -0 -r: điều này sẽ khiến xargsthoát ra một cách duyên dáng khi nội dung null.

EDIT: --cached--deletedcờ được sử dụng song song để bảo vệ chống lại việc vô tình xóa các tệp chưa bị xóa.


7

Nói lệnh để tự động giai đoạn các tệp đã được sửa đổi và xóa, nhưng các tệp mới mà bạn chưa nói với Git không bị ảnh hưởng:

-a
--all

git add . && git commit -m -a "Your commit"

hoặc là

git add --all && git commit -m "Your commit"

1
git add --all && git commit -m "Your commit" Điều này hiệu quả với tôi trong windows-7, sử dụng lệnh shell Git bash.
kmar.us

1
Lệnh sau hoạt động với tôi trong windows-7, sử dụng lệnh shell Git bash: $ git add --all && git commit -m "xóa tệp thuộc tính" [master 58c41ac] xóa tệp thuộc tính 1 tệp đã thay đổi, 9 lần xóa (-). .. Sau đó, để đẩy những thay đổi đã cam kết vào kho lưu trữ từ xa đã chạy: $ git push origin .. Đếm các đối tượng: 10, đã xong.
kmar.us

6

Những điều sau đây sẽ hoạt động, ngay cả khi bạn có nhiều tệp để xử lý:

git ls-files --deleted | xargs git rm

Có lẽ bạn cũng muốn cam kết với một bình luận.

Để biết chi tiết, xem: Tập lệnh Git hữu ích


6

Vui lòng sử dụng -tđể xem lệnh nào đang thực sự được chạy

Tôi chỉ điều chỉnh câu trả lời của Virender để làm tương tự:

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

5

Không có cờ nào để git-add sẽ chỉ xóa các tập tin; nếu tất cả những gì bạn đã sửa đổi là các tệp đã bị xóa, thì bạn vẫn ổn, nhưng nếu không, bạn cần chạy trạng thái git và phân tích đầu ra.

Từ bỏ câu trả lời của Jeremy, đây là những gì tôi nhận được:

git status |  sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
  1. Nhận trạng thái của tập tin.
  2. Đối với các tệp đã bị xóa, cô lập tên của tệp.
  3. Xóa tất cả các dòng bắt đầu bằng #s, cũng như một dòng trạng thái có từ "đã xóa" trong đó; Tôi không nhớ chính xác nó là gì và nó không còn ở đó nữa, vì vậy bạn có thể phải sửa đổi điều này cho các tình huống khác nhau. Tôi nghĩ rằng việc nhóm các biểu thức có thể là một tính năng dành riêng cho GNU, vì vậy nếu bạn không sử dụng gnutils, bạn có thể phải thêm nhiều grep -vdòng.
  4. Truyền các tập tin cho git rm.

Dán cái này trong một bí danh vỏ bây giờ ...


5

Như đã đề cập

git add -u

giai đoạn các tập tin bị xóa để xóa, NHƯNG các tập tin đã sửa đổi để cập nhật.

Để hủy bỏ các tập tin sửa đổi, bạn có thể làm

git reset HEAD <path>

nếu bạn muốn giữ cho các cam kết của bạn được tổ chức và sạch sẽ.
LƯU Ý: Điều này cũng có thể làm sáng tỏ các tệp đã bị xóa, vì vậy hãy cẩn thận với các ký tự đại diện đó.


4
git commit -m 'commit msg' $(git ls-files --deleted)

Điều này làm việc cho tôi sau khi tôi đã xóa các tập tin.


3

Tôi cần nút "thay đổi giai đoạn" tương tự và sử dụng git gui. nó cũng thêm tất cả

Và sau khi "giai đoạn thay đổi", tôi đã thực hiện "cam kết" ...

Vì vậy, thư mục làm việc của tôi là sạch sẽ một lần nữa.


Vâng, sử dụng một gui là CHEATING, lol! Nhưng nhanh hơn trong trường hợp người thiết kế GUI đáp ứng nhu cầu của bạn. Thật tốt khi biết làm thế nào để sửa lại 'cái gì ở dưới mui xe'.
Dennis

1
FYI: câu trả lời này được hợp nhất từ stackoverflow.com/questions/1402776/iêu
Shog9

3
git rm $(git ls-files -d)

Xóa tất cả các tệp được liệt kê bởi git ls-fileslệnh (-d chỉ hiển thị các tệp đã bị xóa). Không hoạt động đối với các tệp có khoảng trắng trong tên tệp hoặc đường dẫn, nhưng đơn giản để nhớ


2

Bạn chỉ có thể sử dụng git add -u <filenames>để giai đoạn các tập tin bị xóa.

Ví dụ, nếu bạn xóa các tệp templates/*.tpl, sau đó sử dụng git add -u templates/*.tpl.

Điều -unày là bắt buộc để tham chiếu đến các tệp tồn tại trong kho lưu trữ nhưng không còn tồn tại trong thư mục làm việc. Mặt khác, mặc định git addlà tìm các tệp trong thư mục làm việc và nếu bạn chỉ định các tệp bạn đã xóa ở đó, nó sẽ không tìm thấy chúng.


2

Thêm bí danh hệ thống để sắp xếp các tệp đã xóa dưới dạng lệnh rm-all

UNIX alias rm-all='git rm $(git ls-files --deleted)'

CÁC CỬA SỔ doskey rm-all=bash -c "git rm $(git ls-files --deleted)"

Ghi chú

Windows cần phải bashđược cài đặt.


2

(Một biến thể khác)

Tôi muốn xóa tất cả các tệp đã bị xóa khỏi các tệp đĩa nhưng từ một thư mục cụ thể, để các thư mục khác không bị ảnh hưởng. Sau đây làm việc cho tôi:

git ls-files --deleted  | grep <folder-name> | xargs git rm

1

cái gì đó như

git status | sed -s "s/^.*deleted: //" | xargs git rm 

có thể làm điều đó


Phiên bản git 2019 2.13.3:git diff --diff-filter=D --name-only | xargs git rm
user151841

1

Đối với dự án phòng thu trực quan

'git ls-files --deleted | sed 's/(.*)/"\1"/'| xargs git rm' 

hữu ích khi đường dẫn tập tin bị xóa có không gian


-1

Giải pháp linh hoạt nhất mà tôi tìm thấy cho đến nay là

git cola

Và chọn tất cả các tập tin đã xóa tôi muốn giai đoạn.

(Lưu ý tôi thường làm mọi thứ dòng lệnh trong git, nhưng git xử lý các tệp bị loại bỏ một chút khó xử).


Ký tự đại diện không hoạt động với tôi git add -u path/to/my/deleted-files-pattern-*.ymlvì vậy đây là câu trả lời tốt nhất cho tôi (không muốn xử lý tất cả các tệp đã bị xóa, nhưng 50 trong số vài trăm).
mlncn
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.