Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从git repo和提交历史中递归删除所有二进制文件_Git_Git Rewrite History - Fatal编程技术网

从git repo和提交历史中递归删除所有二进制文件

从git repo和提交历史中递归删除所有二进制文件,git,git-rewrite-history,Git,Git Rewrite History,我读过一篇关于从git提交历史中删除大型二进制文件的文章,但我的问题只是有点不同。因此,我的问题是理解并确认这些步骤-- 我的git回购是~/foo。我想从repo中的一个目录中删除所有*.jpg、*.png、*.mp4、*.ogv(等等),特别是从~/foo/public/data中删除 第一步。删除这些文件 第二步。将二进制文件扩展名添加到.gitignore和commit.gitignore 第三步。推动一切 我在上面的轨道上对吗?可以这么说,我想在切割一次之前测量两次 更新:好吧,上面给

我读过一篇关于从git提交历史中删除大型二进制文件的文章,但我的问题只是有点不同。因此,我的问题是理解并确认这些步骤--

我的git回购是
~/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