从git永久删除目录

adk*_*adk 48 git

在我的个人git仓库中,我有一个包含数千个不再需要的小图像的目录.有没有办法从整个git历史中删除它们?我试过了

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch imgs" HEAD
Run Code Online (Sandbox Code Playgroud)

git filter-branch --tree-filter 'rm -fr imgs' HEAD
Run Code Online (Sandbox Code Playgroud)

但是git repo的大小保持不变.有任何想法吗?

谢谢

Von*_*onC 32

ProGit书中有一个关于删除对象的有趣部分.

它以此结束:

您的历史记录不再包含对该文件的引用.
但是,reflog当你执行filter-branchunder 时,你和Git添加的一组新引用.git/refs/original仍然存在,所以你必须删除它们然后重新打包数据库.在重新打包之前,您需要删除任何指向旧提交的指针:

$ rm -Rf .git/refs/original
$ rm -Rf .git/logs/
$ git gc
$ git prune --expire 
Run Code Online (Sandbox Code Playgroud)

(git prune --expire不是强制性的,但可以从松散的对象中删除目录内容)
在执行这些命令之前备份所有内容,以防万一;)

  • @rescdsk我已恢复链接. (3认同)

Ant*_*bbs 14

实际上这些技术都不适用于我.我发现最可靠的是简单地将本地拉入另一个回购:

git pull file://$(pwd)/myGitRepo
Run Code Online (Sandbox Code Playgroud)

它还为您省去了删除旧标签的麻烦.

在我的博客上看到这个故事:http: //stubbisms.wordpress.com/2009/07/10/git-script-to-show-largest-pack-objects-and-trim-your-waist-line/


Jak*_*ski 13

默认情况下,git-filter-branch在refs/original/*命名空间中保存旧的引用.

您需要删除它们,然后执行git gc --prune=now


Mic*_*ael 10

布兰登汤姆森在评论Rainer Blome的解决方案时,如果这只是修复了gitk视图,或者裁判将会真的消失.检查这个的一个好方法是记住旧提交的sha1哈希值(或其唯一前缀)之一并尝试

$ git ls-tree hash-value
Run Code Online (Sandbox Code Playgroud)

这应该显示repos主文件夹的内容,就像它在此提交中一样.后

$ rm -Rf .git/refs/original
$ rm -Rf .git/logs/
Run Code Online (Sandbox Code Playgroud)

如图VonC并除去refs/original/…从线.git/info/refs.git/packed-refs如由所示莱纳BLOME,最终

$ git gc --prune=now
Run Code Online (Sandbox Code Playgroud)

不仅制作了参考,而且旧的物体(提交,树木和斑点)也消失了.以上所示git ls-tree hash-value证明了这一点.检查这个的另一个很好的命令是git count-objects -v(在filter-brach之前和修剪之后运行它并比较大小).

注意:由于我不允许对其他答案发表评论,我不得不写一个新答案,尽管它主要结合以前给出的答案.