从git永久删除一个目录

在我个人的git repo中,我有一个包含数千个不再需要的小图片的目录。 有没有办法从整个git历史中删除它们? 我努力了

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch imgs" HEAD 

 git filter-branch --tree-filter 'rm -fr imgs' HEAD 

但git回购的规模保持不变。 有任何想法吗?

谢谢

其实这些技术都没有为我工作。 我发现最可靠的是简单地把本地拉到另一个回购:

 git pull file://$(pwd)/myGitRepo 

它还可以节省您删除旧标签的麻烦。

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

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

它确实以此结束:

您的历史logging不再包含对该文件的引用。
然而,当您在.git/refs/original下执行filter-branch时,您的reflog和一组Git添加的.git/refs/original仍然存在,因此您必须将其删除,然后重新包装数据库。 在重新包装之前,您需要摆脱任何指向这些旧提交的指针:

 $ rm -Rf .git/refs/original $ rm -Rf .git/logs/ $ git gc $ git prune --expire 

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

git-filter-branch默认保存refs/original/*命名空间中的旧引用。

你需要删除它们, 然后git gc --prune=now

Brandon ThomsonRainer Blome的解决scheme中发表了一个评论,如果这只是修正了gitk的观点,或者裁判们将会真的走了。 检查这个的一个好方法是记住旧提交的sha1哈希值(或其唯一的前缀),然后尝试

 $ git ls-tree hash-value 

这应该显示repos主文件夹的内容,因为它在这个提交中。 后

 $ rm -Rf .git/refs/original $ rm -Rf .git/logs/ 

VonC所示,并从Rails Blome所示的.git/info/refs.git/packed-refs删除了refs/original/…行,最终

 $ git gc --prune=now 

不仅使参考文献,而且旧的对象(犯罪,树木和斑点)都消失了。 上面显示的git ls-tree hash-valuecertificate了这一点。 另一个很好的命令来检查这是git count-objects -v (在filter-brach之前和修剪之后运行它并比较大小)。

注意:由于我还不能评论其他的答案,我不得不写一个新的,但主要是结合了以前给出的答案。

如果你想去手动清理路线,还有一些文件,也可能包含一个引用到你的原始分支git-filter-branch之前的位置。 例如,我筛选了我的“家”分支:

git的/信息/裁判:

179ad3e725816234a7182476825862e28752746d refs / original / refs / heads / home

git的/填充裁判:

179ad3e725816234a7182476825862e28752746d refs / original / refs / heads / home

在我删除这些行后,gitk没有再显示旧的提交。

由于这是一个古老的问题,所以当时可能有些是不可能的。 这也假设你正在使用bash或cygwin。

警告:第二行和第三行将永久删除您的分支/标签无法访问的所有提交。

运行filter-branch ,执行

 for ref in $(git for-each-ref --format='%(refname)' refs/original); do git update-ref -d $ref; done git reflog expire --expire=now --all git gc --prune=now 

git for-each-ref --format='%(refname)'获取引用名称, git update-ref -d删除引用。 通常最好不要直接修改.git文件夹,特别是当refs处于packed-refs时候,这个命令会处理这个情况。

第二和第三行是直接从如何清理你的提交树中的未使用的侧枝? 。