[英]How to remove multiple deleted files in Git repository
我刪除了一些文件和git狀態顯示如下。
我承諾並推動。
GitHub仍然在存儲庫中顯示已刪除的文件。 如何刪除GitHub存儲庫中的文件?
# 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: modules/welcome/language/english/kaimonokago_lang.php
# deleted: modules/welcome/language/french/kaimonokago_lang.php
# deleted: modules/welcome/language/german/kaimonokago_lang.php
# deleted: modules/welcome/language/norwegian/kaimonokago_lang.php
如果我使用git rm
,它會給出以下內容。
usage: git rm [options] [--] <file>...
-n, --dry-run dry run
-q, --quiet do not list removed files
--cached only remove from the index
-f, --force override the up-to-date check
-r allow recursive removal
--ignore-unmatch exit with a zero status even if nothing matched
git add -u
更新所有更改
對git rm .
非常謹慎git rm .
; 它可能刪除超過你想要的。 當然,你可以恢復,但不必這樣做更簡單。
最簡單的是:
git rm modules/welcome/language/english/kaimonokago_lang.php \
modules/welcome/language/french/kaimonokago_lang.php \
modules/welcome/language/german/kaimonokago_lang.php \
modules/welcome/language/norwegian/kaimonokago_lang.php
您不能使用shell通配符,因為文件不存在,但您可以使用(至少在Bash中):
git rm modules/welcome/language/{english,french,german,norwegian}/kaimonokago_lang.php
或者考慮:
git status | sed -n '/^# *deleted:/s///p' | xargs git rm
這取得了git status
的輸出,默認情況下不會打印任何內容( sed -n
),但是在啟動# deleted:
,它會deleted:
#
並deleted:
並打印剩下的內容; xargs
收集參數並將它們提供給git rm
命令。 無論名稱中的相似性(或不相似性)如何,這都適用於任意數量的文件。
ByScripts答案的另一個版本是
git rm $(git ls-files --deleted)
這只會從git中刪除已刪除的文件。
它也可以用於添加僅修改過的文件。
git add $(git ls-files --modified)
這些命令也適用於Windows的gitbash。
更新您所做的所有更改:
git add -u
刪除的文件應從未分階段(通常為紅色)更改為分階段(綠色)。 然后提交刪除已刪除的文件:
git commit -m "note"
如果你不關心升級文件的最佳解決方案是使用mshameers和/或pb2q所說的git add -u
。
如果你只想刪除已刪除的文件,但不要刪除任何已修改的文件,我認為你應該使用帶有--deleted
選項的ls-files
參數(不需要使用正則表達式或其他復雜的args /選項):
git ls-files --deleted | xargs git rm
是的, git rm <filename>
將git rm <filename>
的已刪除狀態,其中<filename>
可以是glob模式:
$ git rm modules/welcome/language/*/kaimonokago_lang.php
rm modules/welcome/language/english/kaimonokago_lang.php
rm modules/welcome/language/french/kaimonokago_lang.php
rm modules/welcome/language/german/kaimonokago_lang.php
rm modules/welcome/language/norwegian/kaimonokago_lang.php
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# deleted: modules/welcome/language/english/kaimonokago_lang.php
# ...
然后,你可以提交。
如果你願意, git commit -a
可以一次完成。
您還可以使用git add -u
來git add -u
所有更改,包括所有已刪除的文件,然后提交。
當我有很多文件,我已經刪除了這是不分階段的承諾,你可以git rm
他們都在一個放映:
for i in `git status | grep deleted | awk '{print $3}'`; do git rm $i; done
正如問題回答者提到的那樣,小心git rm
。
試試這個:
git rm `git ls-files -d`
您可以使用
git commit -m "remove files" -a
git push
手動刪除文件后。
您可以創建一個shell腳本,該腳本將在運行時刪除所有文件:
git status | grep deleted | awk '{print "git rm " $3;}' > ../remove.sh
創建的腳本是remove.sh
,它包含git rm
命令的完整列表。
git status | sed 's/^#\s*deleted:\s*//' | sed 's/^#.*//' | xargs git rm -rf
如果要使用“git rm”刪除所有這些內容。 這就是我做的:
git ls-files --deleted -z | xargs -0 git rm
此查詢列出了已刪除的所有文件,並從git存儲庫中刪除它們。 希望能幫助到你。
git add -u .
git add --update .
內置的清潔功能也很有用......
git clean -fd
在我刪除它們之后,我發現這個鬼文件出現在我的倉庫中並遇到了這個整潔的命令!
git add -A
它與git add -a
和git add -u
基本相同,但它區分大小寫。 我從這個很棒的鏈接獲得它(此鏈接指向archive.org上的版本,因為原始版本已轉換為垃圾郵件/網上誘騙頁面,截至2016年6月)
以下是如何檢測已刪除的文件並將其刪除作為下一次提交的一部分。 該主題上的所有解決方案都有不同的優點。 下面的解決方案專門處理文件名中帶有空格的問題。
git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm '{}'
確保在使用git的--dry-run選項測試之前使用以下命令運行它:
git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm --dry-run '{}'
說明:
git status --porcelain
這會打印出類似D“/文件夾/路徑到路徑的路徑”,只有在路徑名中有空格時才會發生
awk '/^.D .*$/ {print $0}'
僅匹配以“D”開頭的行
sed 's/ D \(.*\)/\1/'
從每個字符串的前面刪除“D”
tr -d '"'
刪除引號,如果有的話
xargs -I {} git rm '{}'
將文件名變量定義為{}在單引號括起的git rm下運行文件名,以確保它支持帶空格的文件名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.