我不小心提交了一个不需要的文件(文件名。Orig而解决合并)到我的仓库几个提交前,没有我注意到它直到现在。我想从存储库历史记录中完全删除该文件。
是否有可能重写更改历史这样的文件名。奥里格从一开始就没有被添加到存储库中?
我不小心提交了一个不需要的文件(文件名。Orig而解决合并)到我的仓库几个提交前,没有我注意到它直到现在。我想从存储库历史记录中完全删除该文件。
是否有可能重写更改历史这样的文件名。奥里格从一开始就没有被添加到存储库中?
当前回答
如果这是你想要清理的最新提交,我尝试使用git版本2.14.3 (Apple git -98):
touch empty
git init
git add empty
git commit -m init
# 92K .git
du -hs .git
dd if=/dev/random of=./random bs=1m count=5
git add random
git commit -m mistake
# 5.1M .git
du -hs .git
git reset --hard HEAD^
git reflog expire --expire=now --all
git gc --prune=now
# 92K .git
du -hs .git
其他回答
这是最好的方法: http://github.com/guides/completely-remove-a-file-from-all-revisions
一定要先备份文件副本。
EDIT
Neon的编辑在审查过程中不幸被拒绝了。 请看下面的霓虹灯帖子,它可能包含有用的信息!
例如,删除所有不小心提交到git仓库的*.gz文件:
$ du -sh .git ==> e.g. 100M
$ git filter-branch --index-filter 'git rm --cached --ignore-unmatch *.gz' HEAD
$ git push origin master --force
$ rm -rf .git/refs/original/
$ git reflog expire --expire=now --all
$ git gc --prune=now
$ git gc --aggressive --prune=now
还是不管用吗?(我现在的git版本是1.7.6.1)
$ du -sh .git ==> e.g. 100M
不知道为什么,因为我只有一个主分支。无论如何,我终于得到了我的git回购真正清理了推到一个新的空的和裸露的git仓库,例如。
$ git init --bare /path/to/newcleanrepo.git
$ git push /path/to/newcleanrepo.git master
$ du -sh /path/to/newcleanrepo.git ==> e.g. 5M
(是的!)
然后我把它克隆到一个新目录,并把它的。git文件夹移动到这个目录。如。
$ mv .git ../large_dot_git
$ git clone /path/to/newcleanrepo.git ../tmpdir
$ mv ../tmpdir/.git .
$ du -sh .git ==> e.g. 5M
(是的!)终于清理干净了!)
在确认一切正常后,您可以删除../large_dot_git和../tmpdir目录(可能在几周或几个月后,以防万一……)
你还可以使用:
git重置HEAD文件/路径
You should probably clone your repository first.
Remove your file from all branches history:
git filter-branch --tree-filter 'rm -f filename.orig' -- --all
Remove your file just from the current branch:
git filter-branch --tree-filter 'rm -f filename.orig' -- --HEAD
Lastly you should run to remove empty commits:
git filter-branch -f --prune-empty -- --all
当然,git filter-branch是正确的选择。
遗憾的是,这将不足以完全删除filename。来源于你的repo,因为它仍然可以被标签、reflog条目、遥控器等引用。
我建议删除所有这些引用,然后调用垃圾回收器。您可以使用本网站的git forget-blob脚本一步完成所有这些。
Git忘记blob filename.orig
如果你还没有提交任何东西,只需git rm文件和git commit——modify。
如果你有
git filter-branch \
--index-filter 'git rm --cached --ignore-unmatch path/to/file/filename.orig' merge-point..HEAD
将从合并点到HEAD,删除文件名的每个更改。创建并重写更改。使用——ignore-unmatch意味着如果由于某种原因filename. conf命令不会失败。奥里格在变化中消失了。这是git-filter-branch手册页中的示例部分推荐的方法。
Windows用户注意:文件路径必须使用正斜杠