要從 Git 中移除某個文件,就必須要從已跟蹤文件清單中移除(確切地說,是從暫存區域移除),然后提交。可以用 git rm
命令完成此項工作,並連帶從工作目錄中刪除指定的文件,這樣以后就不會出現在未跟蹤文件清單中了。
如果只是簡單地從工作目錄中手工刪除文件,運行 git status
時就會在 “Changes not staged for commit” 部分(也就是未暫存清單)看到:
-
$ rm grit.gemspec
-
$ git status
-
On branch master
-
Changes not staged for commit:
-
( use "git add/rm <file>..." to update what will be committed)
-
( use "git checkout -- <file>..." to discard changes in working directory)
-
-
deleted: grit.gemspec
-
-
no changes added to commit (use "git add" and/or "git commit -a")
然后再運行 git rm
記錄此次移除文件的操作:
-
$ git rm grit.gemspec
-
rm 'grit.gemspec'
-
$ git status
-
On branch master
-
Changes to be committed:
-
(use "git reset HEAD <file>..." to unstage)
-
-
deleted: grit.gemspec
最后提交的時候,該文件就不再納入版本管理了。如果刪除之前修改過並且已經放到暫存區域的話,則必須要用強制刪除選項 -f
(譯注:即 force 的首字母),以防誤刪除文件后丟失修改的內容。
另外一種情況是,我們想把文件從 Git 倉庫中刪除(亦即從暫存區域移除),但仍然希望保留在當前工作目錄中。換句話說,僅是從跟蹤清單中刪除。比如一些大型日志文件或者一堆 .a
編譯文件,不小心納入倉庫后,要移除跟蹤但不刪除文件,以便稍后在 .gitignore
文件中補上,用 --cached
選項即可:
$ git rm --cached readme.txt
后面可以列出文件或者目錄的名字,也可以使用 glob 模式。比方說:
$ git rm log/\*.log
注意到星號 *
之前的反斜杠 \
,因為 Git 有它自己的文件模式擴展匹配方式,所以我們不用 shell 來幫忙展開(譯注:實際上不加反斜杠也可以運行,只不過按照 shell 擴展的話,僅僅刪除指定目錄下的文件而不會遞歸匹配。上面的例子本來就指定了目錄,所以效果等同,但下面的例子就會用遞歸方式匹配,所以必須加反斜杠。)。此命令刪除所有 log/
目錄下擴展名為 .log
的文件。類似的比如:
$ git rm \*~
會遞歸刪除當前目錄及其子目錄中所有 ~
結尾的文件。
取消對文件的跟蹤還有一個命令:git update-index --assume-unchanged <取消跟蹤的文件>
注:該命令只能取消提交到暫存區之前的文件,可以先用git reset <文件名>將暫存區的文件回退到暫存區之前,然后再取消跟蹤。
--------------------- 本文來自 leedaning 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/leedaning/article/details/44976319?utm_source=copy