Các tập tin đã xóa


499

Nói rằng tôi có một tập tin trong kho git của tôi được gọi foo.

Giả sử nó đã bị xóa với rm(không git rm). Sau đó, trạng thái git sẽ hiển thị:

Changes not staged for commit:

    deleted: foo

Làm thế nào để tôi giai đoạn xóa tập tin cá nhân này?

Nếu tôi cố gắng:

git add foo

Nó nói rằng:

'foo' did not match any files.

2
Đây có phải là một vấn đề trong các phiên bản Git cũ? Ngày nay, nó dường như không phải là một, nó hoạt động tương tự như các tệp đã sửa đổi.
cst1992

Câu trả lời:


22

Kể từ Git 2.0.0, git addcũng sẽ xóa giai đoạn xóa tệp.

Tài liệu Git 2.0.0 - git-add

<pathspec> chụp

Tập tin để thêm nội dung từ. Fileglobs (ví dụ * .c) có thể được cung cấp để thêm tất cả các tệp phù hợp. Ngoài ra, một tên thư mục hàng đầu (ví dụ: dir để thêm dir / file1 và dir / file2) có thể được cung cấp để cập nhật chỉ mục để phù hợp với trạng thái hiện tại của toàn bộ thư mục (ví dụ: chỉ định dir sẽ ghi lại không chỉ một tệp dir / file1 được sửa đổi trong cây làm việc, một tệp dir / file2 được thêm vào cây làm việc, nhưng cũng xóa một tệp dir / file3 khỏi cây làm việc. Lưu ý rằng các phiên bản Git cũ hơn được sử dụng để bỏ qua các tệp đã bị xóa, sử dụng tùy chọn --no-all nếu bạn muốn thêm các tập tin sửa đổi hoặc mới nhưng bỏ qua những tập tin bị loại bỏ.


Câu trả lời được chấp nhận không giải quyết được vấn đề - và câu trả lời khác thì cồng kềnh hơn kể từ Git 2.0.0 - đây là cách tốt nhất! Bạn có upvote của tôi
João Antunes

519

Sử dụng git rm foođể giai đoạn các tập tin để xóa. (Điều này cũng sẽ xóa tệp khỏi hệ thống tệp, nếu nó chưa bị xóa trước đó. Tất nhiên, nó có thể được khôi phục từ git, vì nó đã được kiểm tra trước đó.)

Để giai đoạn xóa tệp mà không xóa tệp khỏi hệ thống tệp, sử dụng git rm --cached foo


8
Ngoài ra, bạn có thể thêm --cachecờ để chỉ xóa tệp khỏi kho lưu trữ và không chạm vào hệ thống tệp.
Hauleth

Điều gì sẽ là quá trình hoàn tác thao tác này, nghĩa là, bỏ giai đoạn để xóa tệp? Điều đó có thể không?
longda

82
Trên thực tế OP đã hỏi làm thế nào để giai đoạn tập tin đã được xóa và điều này có thể được thực hiện bằng cách git status | grep 'deleted:' | cut -d':' -f2 | xargs -t -I {} git add -u "{}". Các câu trả lời khác dường như đang chỉ ra cách loại bỏ tập tin giai đoạn một cách chính xác (nhưng không phải cách thực hiện giai đoạn đã xóa tập tin). ps. các xargslệnh dựa làm việc cho tôi trên Ubuntu 12.04, tuy nhiên khi tôi tự làm git add -u deleted_file.txtnó doens't làm việc. Git của tôi là 1.7.9.5
Dimitry K

8
@DimitryK: git rmsẽ vui vẻ tạo một tệp để xóa ngay cả khi nó đã bị xóa khỏi hệ thống tệp. Và như nhận xét của OP về một câu trả lời khác chỉ ra, họ muốn tạo một tập tin cụ thể đã bị xóa.
Wooble

3
git rmkhông giai đoạn đã loại bỏ các tập tin. Nó ném lỗi này : fatal: pathspec '~.SLDASM' did not match any files. Dưới đây là các màn hình có bằng chứng: i.imgur.com/cKNKGGe.png i.imgur.com/1p9JdWF.png . Ảnh chụp màn hình đầu tiên cho thấy rõ ràng 2 tệp bị xóa và không được dàn dựng, ảnh chụp màn hình thứ hai cho thấy rằng khi tôi gõ git rm "~$Box.SLDASM", nó sẽ ném lỗi này.
KulaGGin

413

Mặc dù đó là chính xác để sử dụng git rm [FILE], thay vào đó, bạn có thể làm git add -u.

Theo git-addtài liệu:

-u - cập nhật

Cập nhật chỉ mục ở nơi nó đã có mục khớp với [FILE]. Điều này loại bỏ cũng như sửa đổi các mục chỉ mục để phù hợp với cây làm việc, nhưng không thêm tệp mới.

Nếu không có [FILE] khi tùy chọn -u được sử dụng, tất cả các tệp được theo dõi trong toàn bộ cây làm việc sẽ được cập nhật (các phiên bản cũ của Git được sử dụng để giới hạn cập nhật vào thư mục hiện tại và các thư mục con của nó).

Sau đó, chỉ mục sẽ được làm mới và các tập tin sẽ được tổ chức chính xác.


56
git add -A .sẽ thêm tất cả các thay đổi, tôi đặc biệt muốn giai đoạn một tập tin bị xóa.
Andrew Tomazos

25
Điều này sẽ thêm tất cả các tập tin sửa đổi; Không chỉ xóa các tập tin.
Trước

3
Đúng rồi. Cụ thể hơn, nó sẽ xử lý tất cả các thay đổi trong các tệp đã được theo dõi, cho dù đã bị xóa hoặc chỉ được sửa đổi. Điều này giúp khi bạn xóa nhiều tệp và không muốn tạo từng tệp riêng lẻ.
sailesh

9
Có cách nào để chỉ xóa các tập tin bị xóa và không được sửa đổi? Chỉ tò mò thôi.
Tháng Tám

11
Tôi đã làm git add -u FolderWithDeletedFiles/và nó đã làm những gì tôi muốn, cảm ơn
quốc hội

158

Để giai đoạn tất cả các tệp bị xóa thủ công, bạn có thể sử dụng:

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

Để thêm bí danh cho lệnh này git rm-deleted, hãy chạy:

git config --global alias.rm-deleted '!git rm $(git ls-files --deleted)'

2
ký hiệu $ () không tồn tại trong bảng điều khiển windows bash, dẫn đếnunknown option `deleted)
Félix Gagnon-Grenier

2
Tôi cũng không nghĩ rằng nó hoạt động nếu bạn có khoảng trống trên đường. Ít nhất, nó không có trên hệ thống của tôi (với zsh).
Wil Shipley

3
Làm việc hoàn hảo cho tôi! Đã làm chính xác những gì tôi cần. Đánh giá cao ở đây!
RedSands

Trong cửa sổ làmfor /F %I in ('git ls-files --deleted') do git add -u %I
eis

3
điều này không hoạt động đối với tên tệp có dấu cách, 'git add -u' sẽ làm nếu cần.
J-Dizzle

33

để Thêm tất cả các tệp đã xóa sẵn sàng

git status -s | grep -E '^ D' | cut -d ' ' -f3 | xargs git add --all

cảm ơn kiểm tra để đảm bảo

git status

Bạn sẽ được tốt để đi


5
Xác nhận rằng điều này hoạt động. Tôi nghĩ rằng bài học ở đây là không nên làm rm <file>, mà làgit rm <file>
DanGordon

1
FYI: cắt giảm không gian gây ra vấn đề nếu bất kỳ đường dẫn nào có khoảng trống trong đó
davis

1
điều này không hoạt động đối với tên tệp có dấu cách, 'git add -u' sẽ làm nếu cần.
J-Dizzle

Hoạt động hoàn hảo cho tôi trên git version 2.15.2 (Apple Git-101.1).
Kalob Taulien 27/07/18

hoạt động hoàn hảo trên bảng điều khiển linux!
Ahmed AMMOURI

8

Bạn có thể dùng

git rm -r --cached -- "path/to/directory"

để giai đoạn một thư mục bị xóa.



0

đối với những người sử dụng git 2.x + trong powershell:

foreach ($filePath in (git ls-files --deleted)) { git add "$filePath" }
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.