How to remove multiple deleted files in Git reposi

2019-01-29 14:40发布

I have deleted some files and git status shows as below.

I have committed and pushed.

GitHub still shows the deleted files in the repository. How can I delete files in the GitHub repository?

# 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

If I use git rm, it gives the following.

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 git-rm
16条回答
男人必须洒脱
2楼-- · 2019-01-29 15:09

Update all changes you made:

git add -u

The deleted files should change from unstaged (usually red color) to staged (green). Then commit to remove the deleted files:

git commit -m "note"
查看更多
趁早两清
3楼-- · 2019-01-29 15:11

Here is how to detect deleted files and stage their deletion as part of the next commit. All the solutions on this thread have different merits. This solution bellow specifically deals with the problem of file names with spaces in them.

git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm '{}'

make sure you test this with git's --dry-run option before running it with the following:

git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm --dry-run '{}'

explanation:

git status --porcelain

This prints out something like D "/path to a folder/path to a file" which happens only when there are spaces in the path names

awk '/^.D .*$/ {print $0}'

match only lines that start with " D "

sed 's/ D \(.*\)/\1/'

remove " D " from the front of each string

tr -d '"'

remove quotes, if any

xargs -I {} git rm '{}'

define file name variables as {} run file name under git rm enclosed in single quotes in order to make sure that it supports file names with spaces.

查看更多
孤傲高冷的网名
4楼-- · 2019-01-29 15:13

You can create a shell script which will remove all your files when run:

git status | grep deleted | awk '{print "git rm " $3;}' > ../remove.sh

The script that is created is remove.sh and it contains the full list of git rm commands.

查看更多
劫难
5楼-- · 2019-01-29 15:15
git add -u .

git add --update .
查看更多
放我归山
6楼-- · 2019-01-29 15:16

Be very cautious about git rm .; it might remove more than you want. Of course, you can recover, but it is simpler not to have to do so.

Simplest would be:

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

You can't use shell wildcards because the files don't exist, but you could use (in Bash at least):

git rm modules/welcome/language/{english,french,german,norwegian}/kaimonokago_lang.php

Or consider:

git status | sed -n '/^# *deleted:/s///p' | xargs git rm

This takes the output of git status, doesn't print anything by default (sed -n), but on lines that start # deleted:, it gets rid of the # and the deleted: and prints what is left; xargs gathers up the arguments and provides them to a git rm command. This works for any number of files regardless of similarity (or dissimilarity) in the names.

查看更多
Fickle 薄情
7楼-- · 2019-01-29 15:17
git status | sed 's/^#\s*deleted:\s*//' | sed 's/^#.*//' | xargs git rm -rf
查看更多
登录 后发表回答