2012-09-11 37 views
338

假設我在我的git倉庫中有一個名爲foo的文件。暫存已刪除的文件

假設它已被刪除rm(而不是git rm)。然後git狀態將顯示:

Changes not staged for commit: 

    deleted: foo 

如何處理此單個文件刪除?

如果我嘗試:

git add foo 

它說:

'foo' did not match any files. 
+1

這是舊的Git版本的問題嗎?現在它似乎不是一個,它的作用類似於修改後的文件。 – cst1992

回答

375

使用git rm foo上演刪除該文件。 (這也會從文件系統中刪除文件,如果它以前沒有被刪除過,當然可以從git恢復,因爲它先前已經簽入。)

要將文件分級以刪除沒有將其從文件系統中刪除,請使用git rm --cached foo

+8

此外,您可以添加'--cache'標誌以僅從存儲庫中刪除文件,並在文件系統中保留解除狀態。 – Hauleth

+0

什麼是撤消這個操作的過程,也就是取消刪除文件的階段?那可能嗎? – longda

+0

剛剛回答了我自己的問題... git reset HEAD 後面跟着一個git結帳似乎是在做詭計! – longda

307

你可以做git add -u

如果您想要刪除多個文件,而不是爲每個文件執行git rm,這將有所幫助。

+35

是'git add -A .'會添加所有更改,我特別想要放置一個已刪除的文件。 –

+8

這將添加所有修改的文件;不只是刪除的文件。 – Foreever

+3

這是正確的。更具體地說,它將對已經被跟蹤的文件進行所有更改,無論是刪除還是隻是修改。這有助於刪除多個文件並且不想單獨分階段處理它們。 – Sailesh

6

您可以使用

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

上演了一出刪除的目錄。

21

添加的所有準備刪除的文件

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

感謝檢查,以確保

git status 

你要善於去

+2

確認這是有效的。我認爲這裏的教訓是不做'rm ',而是'git rm ' – DanGordon

+0

這很好用。謝啦 :)。 –

+0

僅供參考:如果任何路徑中有空格,則會導致問題 – davis

90

臺數,你可以使用所有手動刪除的文件:

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

要添加別名這個命令git rm-deleted,運行:

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

$()表示法aparently不存在於Windows bash控制檯中,導致'未知選項\'刪除)' –

+1

如果您的路徑中有空格,我認爲這不起作用。至少,它不在我的系統上(使用zsh)。 –

+2

爲我完美工作!我確實需要什麼。巨大的欣賞在這裏! – RedSands

1

由於Git的2.0.0,git add還將上演文件刪除。

Git 2.0.0 Docs - git-add

< pathspec> ...

文件從添加內容。可以給Fileglobs(例如* .c)添加所有>匹配的文件。還可以給出一個主要的目錄名(例如添加dir/file1和dir/file2的目錄)來更新索引以匹配整個目錄的當前狀態(例如,指定目錄不僅會記錄文件dir/file1修改在工作樹中,將一個文件dir/file2添加到工作樹中,而且還將一個文件dir/file3從工作樹中刪除。請注意,舊版本的Git用於忽略已刪除的文件;如果您想添加修改或新文件,但忽略刪除的文件,請使用--no-all選項。