11

我已经阅读了一些关于从 git 提交历史中删除大型二进制文件的 不同 线程,但我的问题只是有点不同。因此,我在这里的问题是理解和确认这些步骤 -

我的 git 仓库是~/foo. 我想从 repo 内的一个目录中删除所有 *.jpg、*.png、*.mp4、*.ogv (等等),特别是从~/foo/public/data.

步骤 1. 删除文件

~/foo/data > find -E . -regex ".*\.(jpg|png|mp4|m4v|ogv|webm)" \
    -exec git filter-branch --force --index-filter \
    'git rm --cached --ignore-unmatch {}' \
    --prune-empty --tag-name-filter cat -- --all \;

步骤 2. 将二进制文件扩展名添加到 .gitignore 并提交 .gitignore

~/foo/data > cd ..
~/foo > git add .gitignore
~/foo > git commit -m "added binary files to .gitignore"

步骤 3. 推动一切

~/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.
..

所以我上树到顶层并重新运行命令,这一切都奏效了。

4

1 回答 1

9

这个过程似乎是对的。

您还可以使用bfg repo clean 之类的工具测试您的清洁过程,如以下答案所示

java -jar bfg.jar --delete-files *.{jpg,png,mp4,m4v,ogv,webm} ${bare-repo-dir};

(除了 BFG 确保它不会删除您最新提交中的任何内容,因此您需要删除当前索引中的这些文件并进行“干净”提交。所有其他先前的提交将由 BFG 清理)

2020 年更新:对于删除文件,您现在可以使用git filter-repo(Git 2.22+, Q4 2019),因为git filter-branchBFG现在,7 年后,已经过时了

git filter-repo --path fileToRemove --invert-paths
于 2013-07-02T06:46:00.347 回答