256

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 
2

16 Answers 16

688
git add -u 

updates all your changes

Sign up to request clarification or add additional context in comments.

4 Comments

Works a charm. When you see something like "git status | sed -n '/^# *deleted:/s///p' | xargs git rm" as a proposed solution for such a simple yet frequent requirement then you know a better solution is, or soon will be, around the corner.
simple is better, this is really handy then the "bash" way
Author asks how to remove files, why adding files is the correct answer?
@kelin: from git docs (git-scm.com/docs/git-add): "-u --update Update the index just where it already has an entry matching <pathspec>. This removes as well as modifies index entries to match the working tree, but adds no new files. If no <pathspec> is given when -u option is used, all tracked files in the entire working tree are updated (old versions of Git used to limit the update to the current directory and its subdirectories)."
92

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.

6 Comments

You can use wildcards (though you may need to escape them), and git will match the paths in the index, not just those in the working tree, so it doesn't matter that they don't exist on the filesystem.
git diff --diff-filter=D --name-only -z | xargs -0 git rm is a more reliable approach than trying to parse git status which is user oriented and not guaranteed to be stable over future versions.
@Charles: that is certainly better, but it requires quite a lot of knowledge about what options are available with git diff (which I didn't have, not having had the need before). Thanks!
Note that there is also "git ls-files --deleted"
so, git ls-files --deleted | xargs git rm did the trick for me.
|
55

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.

3 Comments

Priceless, the git ls-files with status deleted or modified is so helpful.
The behavior of 'git add --update (or -u)' with no path argument from a subdirectory of the tree will change in Git 2.0 and should not be used anymore. To add content for the whole tree, run: git add --update :/ (or git add -u :/) To restrict the command to the current directory, run: git add --update . (or git add -u .) With the current Git version, the command is restricted to the current directory
Any idea how to handle paths with spaces in them ? Example: src/my spaced directory/myfile. This can be handled individually but how can it be handled using the commands in this answer ?
43

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" 

4 Comments

Deserves the populist badge.
This is by far the best solution. No scripting hacks, no lengthy process, just a flag to tell git to update its index thoroughly.
Brilliant! Saved me from having to type 20+ file paths. Thanks!
Not so great! If you want to delete the red deleted file statuses, while still having some not-ready file to commit, his command will commit everything. I faced this situation.
13

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 

1 Comment

git add -A solves this issue... just in case any one wants to know in future.check the below answer
8

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.

4 Comments

so rm . (full stop) delete them at once?
so just git rm will remove all at once?
You can use a glob-style pattern to remove multiple files; I updated my answer to show an example.
It seems git add -u is exactly what we're looking for - if you make many deletions, then want to commit all the deletions, that appears to be the easiest and most 'standard' way (meaning, without case-specific globs or complex shell parsing into xargs). Is there a reason we wouldn't want to use this, other than the fact that it adds all changes at once?
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.

Comments

5

Try this:

 git rm `git ls-files -d` 

1 Comment

This solved my problem of staging only deleted scripts (using bash)
3

You can use

git commit -m "remove files" -a git push 

After you had delete files manually.

1 Comment

Or identically but more succinctly: git commit -am"remove files"
3

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.

Comments

3

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)

Comments

3

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.

Comments

2
git status | sed 's/^#\s*deleted:\s*//' | sed 's/^#.*//' | xargs git rm -rf 

Comments

2

The built in clean function can also be helpful...

git clean -fd 

1 Comment

This only applies to untracked files.
2
git add -u . git add --update . 

Comments

0

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.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.