从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 Thomson在Rainer 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-value
certificate了这一点。 另一个很好的命令来检查这是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
时候,这个命令会处理这个情况。
第二和第三行是直接从如何清理你的提交树中的未使用的侧枝? 。