问题
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
回答1:
git add -u
updates all your changes
回答2:
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.
回答3:
Another version to ByScripts answer is
git rm $(git ls-files --deleted)
This will ONLY remove the deleted files from the git.
It could be also be used for adding ONLY modified files also.
git add $(git ls-files --modified)
These commands also works on gitbash for windows.
回答4:
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"
回答5:
The best solution if you don't care about staging modified files is to use git add -u
as said by mshameers and/or pb2q.
If you just want to remove deleted files, but not stage any modified ones, I think you should use the ls-files
argument with the --deleted
option (no need to use regex or other complex args/options) :
git ls-files --deleted | xargs git rm
回答6:
Yes, git rm <filename>
will stage the deleted state of a file, where <filename>
could be a glob pattern:
$ 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
# ...
Then, you can commit.
git commit -a
will do this in one go, if you want.
You can also use git add -u
to stage all the changes, including all the deleted files, then commit.
回答7:
When I have a lot of files I've deleted that are unstaged for commit, you can git rm
them all in one show with:
for i in `git status | grep deleted | awk '{print $3}'`; do git rm $i; done
As question answerer mentioned, be careful with git rm
.
回答8:
Try this:
git rm `git ls-files -d`
回答9:
You can use
git commit -m "remove files" -a
git push
After you had delete files manually.
回答10:
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.
回答11:
git status | sed 's/^#\s*deleted:\s*//' | sed 's/^#.*//' | xargs git rm -rf
回答12:
git add -u .
git add --update .
回答13:
If you want to delete all of them by using "git rm". This is what I do:
git ls-files --deleted -z | xargs -0 git rm
This query lists of all the files that have been removed and deletes them from your git repository. Hope it helps.
回答14:
The built in clean function can also be helpful...
git clean -fd
回答15:
I had this issue of ghost files appearing in my repo after I deleted them and came across this neat command!
git add -A
It's essentially the same as git add -a
and git add -u
combined, but it's case sensitive. I got it from this awesome link (this link points to the version on archive.org now, because the original has converted to a spam/phishing page as of June 2016)
回答16:
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.
来源:https://stackoverflow.com/questions/6004453/how-to-remove-multiple-deleted-files-in-git-repository