从git repo和提交历史中递归删除所有二进制文件
我读过一篇关于从git提交历史中删除大型二进制文件的文章,但我的问题只是有点不同。因此,我的问题是理解并确认这些步骤-- 我的git回购是从git repo和提交历史中递归删除所有二进制文件,git,git-rewrite-history,Git,Git Rewrite History,我读过一篇关于从git提交历史中删除大型二进制文件的文章,但我的问题只是有点不同。因此,我的问题是理解并确认这些步骤-- 我的git回购是~/foo。我想从repo中的一个目录中删除所有*.jpg、*.png、*.mp4、*.ogv(等等),特别是从~/foo/public/data中删除 第一步。删除这些文件 第二步。将二进制文件扩展名添加到.gitignore和commit.gitignore 第三步。推动一切 我在上面的轨道上对吗?可以这么说,我想在切割一次之前测量两次 更新:好吧,上面给
~/foo
。我想从repo中的一个目录中删除所有*.jpg、*.png、*.mp4、*.ogv(等等),特别是从~/foo/public/data
中删除
第一步。删除这些文件
第二步。将二进制文件扩展名添加到.gitignore和commit.gitignore
第三步。推动一切
我在上面的轨道上对吗?可以这么说,我想在切割一次之前测量两次
更新:好吧,上面给出了错误
You need to run this command from the toplevel of the working tree.
You need to run this command from the toplevel of the working tree.
..
因此,我上了树的顶层,重新运行了命令,一切都正常了。这个过程似乎是正确的 您还可以使用测试工具测试清洁流程,如中所示: (除了BFG确保它不会删除您最近提交中的任何内容,因此您需要删除当前索引中的那些文件并进行“清理”提交。BFG将清理所有以前的提交) 更新2020:要删除文件,您现在可以使用(Git 2.22+,2019年第4季度),因为
BFG很可能是一个很好的工具(免责声明:我是BFG的创建者)-我只想澄清一下,它与git filter branch的工作类似,因此它可能会在步骤1中替换脚本(而不是“测试”它)。然而,BFG在整个repo中起作用,目前不能限制为单个文件夹路径,如
~/foo/public/data
。如果具有这些扩展名的文件在repo中的其他地方不存在,那么这不是问题。或者,如果它们确实存在,但处于受保护的提交中(例如您的头提交),则它们也不会被删除。@RobertoTyley感谢您的评论,并感谢BFG:)这是一个很棒的工具。不客气,很高兴听到有人使用BFG!是不是应该是git filter repo--path fileToRemove--invert path
?@MichelJung谢谢。那是个打字错误。我已经对答案进行了相应的编辑。我本来打算将此方法用于find
,但它会在每个提交和每个文件的分支上重新运行过滤器分支。就我而言,那已经超过16000次了!对我有效的是git rm-r
,只需指定包含违规文件的目录的名称<代码>git筛选器分支--强制--删减空--索引筛选器'git rm-r--缓存--忽略不匹配路径/to/image/files'-d/cygdrive/r/git-rewrite_u`date+%Y%m%d_u%H%m%S%z'`--标记名筛选器猫--
谢谢,这对我来说很有吸引力。我用2020工具更新了2013年的答案。
~/foo/data > cd ..
~/foo > git add .gitignore
~/foo > git commit -m "added binary files to .gitignore"
~/foo > git push origin master --force
You need to run this command from the toplevel of the working tree.
You need to run this command from the toplevel of the working tree.
..
java -jar bfg.jar --delete-files *.{jpg,png,mp4,m4v,ogv,webm} ${bare-repo-dir};
git filter-repo --path fileToRemove --invert-paths