Removing multiple files from a Git repo that have already been deleted from disk
GitGit CommitGit AddGit RmGit Problem Overview
I have a Git repo that I have deleted four files from using rm
(not git rm
), and my Git status looks like this:
# deleted: file1.txt
# deleted: file2.txt
# deleted: file3.txt
# deleted: file4.txt
How do I remove these files from Git without having to manually go through and add each file like this:
git rm file1 file2 file3 file4
Ideally, I'm looking for something that works in the same way that git add .
does, if that's possible.
Git Solutions
Solution 1 - Git
For Git 1.x
$ git add -u
This tells git to automatically stage tracked files -- including deleting the previously tracked files.
For Git 2.0
To stage your whole working tree:
$ git add -u :/
To stage just the current path:
$ git add -u .
Solution 2 - Git
git ls-files --deleted -z | xargs -0 git rm
might be what you are looking for.. it works for me..
Solution 3 - Git
You can use
git add -u
To add the deleted files to the staging area, then commit them
git commit -m "Deleted files manually"
Solution 4 - Git
If you simply run:
git add -u
git will update its index to know that the files that you've deleted should actually be part of the next commit. Then you can run "git commit" to check in that change.
Or, if you run:
git commit -a
It will automatically take these changes (and any others) and commit them.
Update: If you only want to add deleted files, try:
git ls-files --deleted -z | xargs -0 git rm
git commit
Solution 5 - Git
You're probably looking for -A:
git add -A
this is similar to git add -u, but also adds new files. This is roughly the equivalent of hg's addremove
command (although the move detection is automatic).
Solution 6 - Git
To stage only the deleted files:
for x in $(git status | grep deleted | awk '{print $2}'); do git rm $x; done
Or (the xargs way):
git status | awk '/deleted/ {print $2}' | xargs git rm
You can alias your preferred command set for convenient later use.
Solution 7 - Git
git rm test.txt
Before or after you deleted the actual file.
Solution 8 - Git
By using git-add with '--all' or '--update' options you may get more than you wanted. New and/or modified files will also be added to the index. I have a bash alias setup for when I want to remove deleted files from git without touching other files:
alias grma='git ls-files --deleted -z | xargs -0 git rm'
All files that have been removed from the file system are added to the index as deleted.
Solution 9 - Git
Not that it really matters, but I disagree with the chose answer:
git add -u
... will remove files from the index if the corresponding files in the working tree have been removed, but it will also stage the modified new contents of tracked files.
git rm $(git ls-files --deleted)
... on the other hand will only rm the deleted files that were tracked.
So the latter in my view is the better option.
Solution 10 - Git
If those are the only changes, you can simply do
git commit -a
to commit all changes. That will include deleted files.
Solution 11 - Git
git ls-files --deleted | xargs git rm
is the best option to add only deleted files.
Here is some other options.
git add . => Add all (tracked and modified)/new files in the working tree.
git add -u => Add all modified/removed files which are tracked.
git add -A => Add all (tracked and modified)/(tracked and removed)/new files in the working tree.
git commit -a -m "commit message" - Add and commit modified/removed files which are tracked.
Solution 12 - Git
git add -u
-u
--update
Only match
If no
Solution 13 - Git
That simple solution works fine for me:
git rm $(git ls-files --deleted)
Solution 14 - Git
If you want to add it to your .gitconfig
do this:
[alias]
rma = !git ls-files --deleted -z | xargs -0 git rm
Then all you have to do is run:
git rma
Solution 15 - Git
git ls-files --deleted -z | xargs -0 git rm --cached
This will remove all deleted files that were previous tracked by git, as well as handle the case where your filenames have spaces in them.
Depending on your POSIX variant, you may need to use xargs -0 -r
: this will cause xargs
to gracefully exit when piped null content.
EDIT: --cached
and --deleted
flags are used in tandem to safeguard against accidentally deleting files that have not already been deleted.
Solution 16 - Git
git rm $(git ls-files -d)
Removes all files listed by the git ls-files
command (-d show only deleted files). Doesn't work for files with spaces in the filename or path, but easy to remember
Solution 17 - Git
Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected:
>-a
>--all
git add . && git commit -m -a "Your commit"
or
git add --all && git commit -m "Your commit"
Solution 18 - Git
As mentioned
git add -u
stages the removed files for deletion, BUT ALSO modified files for update.
To unstage the modified files you can do
git reset HEAD <path>
if you like to keep your commits organized and clean.
NOTE: This could also unstage the deleted files, so careful with those wildcards.
Solution 19 - Git
The following will work, even if you have a lot of files to process:
git ls-files --deleted | xargs git rm
You'll probably also want to commit with a comment.
For details, see: Useful Git Scripts
Solution 20 - Git
Please use -t
to see which command is actually being ran
I just tweaked Virender answer to do same:
git ls-files --deleted -z | xargs -t -0 git rm
Solution 21 - Git
None of the flags to git-add will only stage removed files; if all you have modified are deleted files, then you're fine, but otherwise, you need to run git-status and parse the output.
Working off of Jeremy's answer, this is what I got:
git status | sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
- Get status of files.
- For deleted files, isolate the name of the file.
- Remove all the lines that start with #s, as well as a status line that had the word "deleted" in it; I don't remember what it was, exactly, and it's not there any longer, so you may have to modify this for different situations. I think grouping of expressions might be a GNU-specific feature, so if you're not using gnutils, you may have to add multiple
grep -v
lines. - Pass the files to
git rm
.
Sticking this in a shell alias now...
Solution 22 - Git
git commit -m 'commit msg' $(git ls-files --deleted)
This worked for me after I had already deleted the files.
Solution 23 - Git
I needed the same and used git gui "stage changed" button. it also adds all.
And after "stage changed" I made "commit" ...
so my working directory is clean again.
Solution 24 - Git
You can use git add -u <filenames>
to stage the deleted files only.
For example, if you deleted the files templates/*.tpl
, then use git add -u templates/*.tpl
.
The -u
is required in order to refer to files that exist in the repository but no longer exist in the working directory. Otherwise, the default of git add
is to look for the files in the working directory, and if you specify files you've deleted there, it won't find them.
Solution 25 - Git
Adding system alias for staging deleted files as command rm-all
UNIX
alias rm-all='git rm $(git ls-files --deleted)'
WINDOWS
doskey rm-all=bash -c "git rm $(git ls-files --deleted)"
Note
Windows needs to have bash
installed.
Solution 26 - Git
(Yet another variation)
I wanted to delete all the already deleted from the disk files but from one specific folder, leaving the other folders untouched. The following worked for me:
git ls-files --deleted | grep <folder-name> | xargs git rm
Solution 27 - Git
something like
git status | sed -s "s/^.*deleted: //" | xargs git rm
may do it.
Solution 28 - Git
For visual studio project
'git ls-files --deleted | sed 's/(.*)/"\1"/'| xargs git rm'
which is useful when the deleted file path has space
Solution 29 - Git
Just simply
git add . && git commit -m "the message for commit" && git push
Solution 30 - Git
Deleting all files ending with .log from Repo but not local storage
git rm --cached $(git ls-files | grep "\.log$")
Solution 31 - Git
The most flexible solution I have found to date is to
git cola
And select all deleted files I want to stage.
(Note I usually do everything commandline in git, but git handles removed files a bit awkward).