How do I delete a file from a Git repository?

Viewed 3007332

How can I delete "file1.txt" from my repository?

26 Answers

Use git rm.

If you want to remove the file from the Git repository and the filesystem, use:

git rm file1.txt
git commit -m "remove file1.txt"

But if you want to remove the file only from the Git repository and not remove it from the filesystem, use:

git rm --cached file1.txt
git commit -m "remove file1.txt"

And to push changes to remote repo

git push origin branch_name

More generally, git help will help with at least simple questions like this:

zhasper@berens:/media/Kindle/documents$ git help
usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]

The most commonly used git commands are:
   add        Add file contents to the index
   :
   rm         Remove files from the working tree and from the index

Note: if you want to delete file only from git use below:

git rm --cached file1.txt

If you want to delete also from hard disk:

git rm file1.txt

If you want to remove a folder(the folder may contain few files) so, you should remove using recursive command, as below:

git rm -r foldername

If you want to remove a folder inside another folder

git rm -r parentFolder/childFolder

Then, you can commit and push as usual. However, if you want to recover deleted folder, you can follow this: recover deleted files from git is possible.

From doc:

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…​

OPTIONS

<file>…​

Files to remove. Fileglobs (e.g. *.c) can be given to remove all matching files. If you want Git to expand file glob characters, you

may need to shell-escape them. A leading directory name (e.g. dir to remove dir/file1 and dir/file2) can be given to remove all files in the directory, and recursively all sub-directories, but this requires the -r option to be explicitly given. -f --force

Override the up-to-date check.

-n --dry-run

Don’t actually remove any file(s). Instead, just show if they exist in the index and would otherwise be removed by the command.

-r

Allow recursive removal when a leading directory name is given.

--

This option can be used to separate command-line options from the list of files, (useful when filenames might be mistaken for

command-line options). --cached

Use this option to unstage and remove paths only from the index. Working tree files, whether modified or not, will be left alone.

--ignore-unmatch

Exit with a zero status even if no files matched.

-q --quiet

git rm normally outputs one line (in the form of an rm command) for each file removed. This option suppresses that output.

Read more on official doc.

The answer by Greg Hewgill, that was edited by Johannchopin helped me, as I did not care about removing the file from the history completely. In my case, it was a directory, so the only change I did was using:

git rm -r --cached myDirectoryName

instead of "git rm --cached file1.txt" ..followed by:

git commit -m "deleted myDirectoryName from git"
git push origin branch_name

Thanks Greg Hewgill and Johannchopin!

According to the documentation.

git rm --cached file1.txt

When it comes to sensitive data—better not say that you removed the file but rather just include it in the last known commit:

0. Amend last commit

git commit --amend -CHEAD

If you want to delete the file from all git history, according to the documentation you should do the following:

1. Remove it from your local history

git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \  --prune-empty --tag-name-filter cat -- --all
# Replace PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA with the path to the file you want to remove, not just its filename
  1. Don't forget to include this file in .gitignore (If it's a file you never want to share (such as passwords...):
echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"

3. If you need to remove from the remote

git push origin --force --all

4. If you also need to remove it from tag releases:

git push origin --force --tags
  1. First,Remove files from local repository.

    git rm -r File-Name

    or, remove files only from local repository but from filesystem

    git rm --cached File-Name

  2. Secondly, Commit changes into local repository.

    git commit -m "unwanted files or some inline comments"   
    
  3. Finally, update/push local changes into remote repository.

    git push 
    

go to your project dir and type:

git filter-branch --tree-filter 'rm -f <deleted-file>' HEAD

after that push --force for delete file from all commits.

git push origin --force --all

For the case where git rm doesn't suffice and the file needs to be removed from history: As the git filter-branch manual page now itself suggests using git-filter-repo, and I had to do this today, here's an example using that tool. It uses the example repo https://example/eguser/eg.git

  1. Clone the repository into a new directory git clone https://example/eguser/eg.git

  2. Keep everything except the unwanted file. git-filter-repo --path file1.txt --invert-paths

  3. Add the remote repository origin back : git remote add origin https://example/eguser/eg.git. The git-filter-repo tool removes remote remote info by design and suggests a new remote repo (see point 4). This makes sense for big shared repos but might be overkill for getting rid a single newly added file as in this example.

  4. When happy with the contents of local, replace remote with it.

    git push --force -u origin master. Forcing is required due to the changed history.

Also note the useful --dry-run option and a good discussion in the linked manual on team and project dynamics before charging in and changing repository history.

After you have removed the file from the repo with git rm you can use BFG Repo-Cleaner to completely and easily obliterate the file from the repo history.

Just by going on the file in your github repository you can see the delete icon beside Raw|Blame and don't forget to click on commit changes button. And you can see that your file has been deleted.

I have obj and bin files that accidentally made it into the repo that I don't want polluting my 'changed files' list

After I noticed they went to the remote, I ignored them by adding this to .gitignore

/*/obj
/*/bin

Problem is they are already in the remote, and when they get changed, they pop up as changed and pollute the changed file list.

To stop seeing them, you need to delete the whole folder from the remote repository.

In a command prompt:

  1. CD to the repo folder (i.e. C:\repos\MyRepo)
  2. I want to delete SSIS\obj. It seems you can only delete at the top level, so you now need to CD into SSIS: (i.e. C:\repos\MyRepo\SSIS)
  3. Now type the magic incantation git rm -r -f obj
    • rm=remove
    • -r = recursively remove
    • -f = means force, cause you really mean it
    • obj is the folder
  4. Now run git commit -m "remove obj folder"

I got an alarming message saying 13 files changed 315222 deletions

Then because I didn't want to have to look up the CMD line, I went into Visual Sstudio and did a Sync to apply it to the remote

if your file is sensitive (for example, settings or keys you accidently added and committed) then you can remove it from all versions.

To remove from all versions use the command below (warning: careful because you won't be able to restore the removed file in the repo if do not have a copy):

  1. Using Git
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch file.ext' HEAD
  1. Using git-filter-repo (get it here, new recommended way by Git)
git filter-repo --path file.ext

https://stackoverflow.com/a/2047477/14508423 https://stackoverflow.com/a/19666677/14508423 Quite similar, tried both. Nothing. Git keeps tracking the file. (I use vscode so the file got instantly marked as U(untracked) or A(added))

Doing this https://stackoverflow.com/a/53431148/14508423 to whole category solves the problem.

Do this to delete a file from git and make git forget about it:

**manually add the file name to .gitignore**

git rm --cached settings.py    
git commit -m "remove settings.py"
git push origin master
git rm -r --cached .
git add .
git commit -m "Untrack files in .gitignore"

ps: every time it failed I tried to delete file with sensitive info like tokens (.env and settings.py files). But it works fine with random files oO

If you need to remove files from a determined extension (for example, compiled files) you could do the following to remove them all at once:

git remove -f *.pyc
Related