简体   繁体   中英

Git: How to remove file from historical commit?

I have commit with id 56f06019 (for example). In that commit i have accidentally commited large file (50Mb). In another commit i add the same file but in the right size (small). Now my repo when i clone is too heavy :( How to remove that large file from repo history to reduce the size of my repo ?

Chapter 9 of the Pro Git book has a section on Removing Objects .

Let me outline the steps briefly here:

git filter-branch --index-filter \
    'git rm --cached --ignore-unmatch path/to/mylarge_50mb_file' \
    --tag-name-filter cat -- --all

Like the rebasing option described before, filter-branch is rewriting operation. If you have published history, you'll have to --force push the new refs.

The filter-branch approach is considerably more powerful than the rebase approach, since it

  • allows you to work on all branches/refs at once,
  • renames any tags on the fly
  • operates cleanly even if there have been several merge commits since the addition of the file
  • operates cleanly even if the file was (re)added/removed several times in the history of (a) branch(es)
  • doesn't create new, unrelated commits, but rather copies them while modifying the trees associated with them. This means that stuff like signed commits, commit notes etc. are preserved

filter-branch keeps backups too, so the size of the repo won't decrease immediately unless you expire the reflogs and garbage collect:

rm -Rf .git/refs/original       # careful
git gc --aggressive --prune=now # danger

You can use git-extras tool. The obliterate command completely remove a file from the repository, including past commits and tags.

https://github.com/tj/git-extras/blob/master/Commands.md

I tried using the following answer on windows https://stackoverflow.com/a/8741530/8461756

Single quote does not work on windows; you need double-quotes.

Following worked for me.

git filter-branch --force --index-filter "git rm --cached --ignore-unmatch PathRelativeRepositoryRoot/bigfile.csv" -- --all

After removing the big file, I was able to push my changes to GitHub master.

You can use a simple Command to deleted

 git rm -r -f app/unused.txt 
 git rm -r -f yourfilepath

You will need to git rebase in the interactive mode see an example here: How can I remove a commit on GitHub? and how to remove old commits .

If your commit is at HEAD minus 10 commits:

$ git rebase -i HEAD~10

After the edition of your history, you need to push the "new" history, you need to add the + to force (see the refspec in the push options ):

$ git push origin +master

If other people have already cloned your repository, you will to inform them, because you just changed the history.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM