# git-rm
> 原文: [https://git-scm.com/docs/git-rm](https://git-scm.com/docs/git-rm)
## 名稱
git-rm - 從工作樹和索引中刪除文件
## 概要
```
git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…?
```
## 描述
從索引中刪除文件,或從工作樹和索引中刪除文件。 `git rm`不會僅從您的工作目錄中刪除文件。 (沒有選項能只將文件從工作樹中刪除而還在索引中保留;如果非要這樣做,請使用`/bin/rm`。)要刪除的文件必須與分支的尖端相同,并且雖然可以使用`-f`選項覆蓋默認行為,但不能在索引中暫存對其內容的更新。當給出`--cached`時,分階段內容必須匹配分支的尖端或磁盤上的文件,從而允許僅從索引中刪除文件。
## 選項
```
<file>…?
```
要刪除的文件。可以給出Fileglobs(例如`*.c`)以刪除所有匹配的文件。如果你想讓Git擴展文件glob字符,你可能需要shell轉義它們。可以給出一個前置目錄名稱(例如,刪除`dir/file1`和`dir/file2`的`dir`)以刪除目錄中的所有文件,并遞歸地刪除所有子目錄,但這需要明確給出`-r`選項。
```
-f
```
```
--force
```
覆蓋最新的檢查。
```
-n
```
```
--dry-run
```
實際上不要刪除任何文件。相反,只顯示它們是否存在于索引中,否則將被命令刪除。
```
-r
```
在給出前導目錄名時允許遞歸刪除。
```
--
```
此選項可用于將命令行選項與文件列表分開(當文件名可能被誤認為是命令行選項時很有用)。
```
--cached
```
使用此選項僅從索引中取消暫存和刪除路徑。無論是否修改了工作樹文件,都將保持不變。
```
--ignore-unmatch
```
即使沒有匹配的文件,也以零狀態退出。
```
-q
```
```
--quiet
```
`git rm`通常為每個刪除的文件輸出一行(以`rm`命令的形式)。此選項會禁止輸出。
## 討論
<file>給予命令的列表可以是精確的路徑名,文件glob模式或前置目錄名。該命令僅刪除Git已知的路徑。已知文件路徑,但沒有告訴Git的文件不會被刪除。
文件通配符跨目錄邊界匹配。因此,給定兩個目錄`d`和`d2`,使用`git rm 'd*'`和`git rm 'd/*'`之間存在差異,因為前者也將刪除所有目錄`d2`。
## 刪除已從文件系統中消失的文件
`git rm`沒有選項只從索引中刪除從文件系統中消失的路徑。但是,根據用例,有幾種方法可以完成。
### 使用“git commit -a”
如果您打算下一次提交應記錄工作樹中跟蹤文件的所有修改,并記錄已使用`rm`(而不是`git rm`)從工作樹中刪除的文件的所有刪除,請使用`git commit -a`,因為它會自動注意并記錄所有刪除。通過使用`git add -u`,您也可以在不提交的情況下獲得類似的效果。
### 使用“git add -A”
當接受供應商分支的新代碼丟棄時,您可能希望記錄路徑的刪除和新路徑的添加以及現有路徑的修改。
通常,您將首先使用以下命令從工作樹中刪除所有跟蹤的文件:
```
git ls-files -z | xargs -0 rm -f
```
然后解壓縮工作樹中的新代碼。或者你可以 _rsync_ 對工作樹進行更改。
之后,記錄工作樹中所有刪除,添加和修改的最簡單方法是:
```
git add -A
```
見 [git-add [1]](https://git-scm.com/docs/git-add) 。
### 其他方法
如果您真正想要做的就是從索引中刪除工作樹中不再存在的文件(可能是因為您的工作樹是臟的,因此您無法使用`git commit -a`),請使用以下命令:
```
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
```
## 子模塊
只有使用gitfile的子模塊(這意味著它們用Git 1.7.8或更新版本克隆)將從工作樹中刪除,因為它們的存儲庫位于超級項目的.git目錄中。如果子模塊(或其中嵌套的子模塊之一)仍然使用.git目錄,`git rm`會將子模塊git目錄移動到superprojects git目錄中以保護子模塊的歷史記錄。如果在[gitmodules [5]](https://git-scm.com/docs/gitmodules)中存在submodule.<name>部分,那么文件將被刪除,并被暫存(除非使用了--cached或-n)。
當HEAD與索引中記錄的相同時,子模塊被認為是最新的,未修改跟蹤文件,并且子模塊工作樹中不存在未被忽略的未跟蹤文件。忽略的文件被認為是可消耗的,并且不會阻止子模塊的工作樹被刪除。
如果您只想從工作樹中刪除子模塊的本地簽出而不提交刪除,請改用 [git-submodule [1]](https://git-scm.com/docs/git-submodule) `deinit`。有關子模塊移除的詳細信息,請參見 [gitsubmodules [7]](https://git-scm.com/docs/gitsubmodules) 。
## 例子
```
git rm Documentation/\*.txt
```
從索引中的`Documentation`目錄及其任何子目錄中刪除所有`*.txt`文件。
請注意,在此示例中,引用了星號`*`;這讓Git而不是shell擴展了`Documentation/`目錄下的文件和子目錄的路徑名。
```
git rm -f git-*.sh
```
因為此示例允許shell展開星號(即您明確列出文件),所以它不會刪除`subdir/git-foo.sh`。
## BUGS
每次超級項目更新刪除填充的子模塊時(例如,在刪除之前和之后切換提交時),舊的子模塊檢出將保留在舊位置。刪除舊目錄只有在使用gitfile時才是安全的,否則子模塊的歷史記錄也將被刪除。當實現遞歸子模塊更新時,此步驟將過時。
## 也可以看看
[git-add [1]](https://git-scm.com/docs/git-add)
## GIT
部分 [git [1]](https://git-scm.com/docs/git) 套件
- git
- git-config
- git-help
- git-init
- git-clone
- git-add
- git-status
- git-diff
- git-commit
- git-reset
- git-rm
- git-mv
- git-branch
- git-checkout
- git-merge
- git-mergetool
- git-log
- git-stash
- git-tag
- git-worktree
- git-fetch
- git-pull
- git-push
- git-remote
- git-submodule
- git-show
- git-log
- git-shortlog
- git-describe
- git-apply
- git-cherry-pick
- git-rebase
- git-revert
- git-bisect
- git-blame
- git-grep
- gitattributes
- giteveryday
- gitglossary
- githooks
- gitignore
- gitmodules
- gitrevisions
- gittutorial
- gitworkflows
- git-am
- git-format-patch
- git-send-email
- git-request-pull
- git-svn
- git-fast-import
- git-clean
- git-gc
- git-fsck
- git-reflog
- git-filter-branch
- git-instaweb
- git-archive
- git-bundle
- git-daemon
- git-update-server-info
- git-cat-file
- git-check-ignore
- git-checkout-index
- git-commit-tree
- git-count-objects
- git-diff-index
- git-for-each-ref
- git-hash-object
- git-ls-files
- git-merge-base
- git-read-tree
- git-rev-list
- git-rev-parse
- git-show-ref
- git-symbolic-ref
- git-update-index
- git-update-ref
- git-verify-pack
- git-write-tree