如何在Git仓库中删除多个已删除的文件
我已经删除了一些文件和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通配符,因为这些文件不存在,但你可以使用(至less在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
命令。 这适用于任何数量的文件,而不pipe名称中的相似性(或不相似性)。
ByScripts答案的另一个版本是
git rm $(git ls-files --deleted)
这将只会从git中删除已删除的文件。
它也可以用于只添加修改过的文件。
git add $(git ls-files --modified)
这些命令也适用于windows的gitbash。
更新您所做的所有更改:
git add -u
被删除的文件应该从非挂起(通常是红色)变为挂起(绿色)。 然后提交删除已删除的文件:
git commit -m "note"
如果你不关心分段修改的文件,最好的解决方法是使用git add -u
如mshameers和/或pb2q所说 。
如果你只是想删除已删除的文件,但没有阶段任何修改的,我认为你应该使用ls-files
参数与--deleted
选项(不需要使用正则expression式或其他复杂的参数/选项):
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 commit -a
做到这一点,如果你想。
您还可以使用git add -u
来git add -u
所有更改,包括所有已删除的文件,然后提交。
当我有很多文件,我已经删除了未提交的提交,你可以在一个表演中,他们都与:
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
在手动删除文件之后。
您可以创build一个shell脚本,在运行时删除所有的文件:
git status | grep deleted | awk '{print "git rm " $3;}' > ../remove.sh
创build的脚本是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 .
内置的清洁function也可以帮助…
git clean -fd
下面是如何检测删除的文件,并将其删除作为下一个提交的一部分。 这个线程上的所有解决scheme都有不同的优点。 以下解决scheme专门处理文件名中带有空格的问题。
git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm '{}'
确保你用git的–dry-run选项testing了这个选项,然后用下面的代码运行它:
git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm --dry-run '{}'
说明:
git status --porcelain
这会打印出类似于D“/文件夹/path的path”,这只有在path名称中有空格时才会发生
awk '/^.D .*$/ {print $0}'
仅匹配以“D”开头的行
sed 's/ D \(.*\)/\1/'
删除每个string前面的“D”
tr -d '"'
删除引号,如果有的话
xargs -I {} git rm '{}'
将文件名variables定义为{}在git rm下运行文件名,并用单引号括起来,以确保它支持带空格的文件名。
我删除了这个问题后,在我的回购库中出现了这个鬼文件,碰到了这个整洁的命令!
git add -A
它基本上与git add -a
和git add -u
,但区分大小写。 我从这个真棒链接中得到了这个链接 (这个链接现在指向了archive.org上的版本,因为原来已经转换到2016年6月的垃圾邮件/钓鱼页面)