事后从 git 存储库中删除二进制数据

问题描述 投票:0回答:2

我不小心将一些大型二进制数据提交到了一些提交中。从那时起,我更新了我的 .gitignore,并且这些文件不再被提交。但我想回到旧的提交并有选择地从存储库中删除这些数据,删除一些本应位于 .gitignore 中的目录。我不想删除提交本身。

我将如何实现这一目标?我的首选方法是将 .gitignore 规则追溯应用到旧提交的某种方法...使用此方法的答案对其他人来说也非常有用,因为我确信我的问题不是唯一的。它还可以快速应用于通用解决方案,而无需针对每个用户的独特目录结构进行大量自定义。

这可能吗,无论是我上面建议的简单方法,还是某种更复杂的方式?

git version-control binary-data
2个回答
12
投票

这个答案中的解决方案对我来说非常有效:

您还可以使用 bfg repo 等工具测试您的清理过程 更清洁,如这个答案

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

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


0
投票

发布了一个(相对)新工具,取代了曾经是此问题最佳答案的

git filter-branch
函数。 git filter-repo 是一个 Python 工具,几乎可以处理您需要在 git 中进行的任何历史修改。

对于此示例(从存储库中删除特定文件夹或文件),我可以运行如下命令:

git filter-repo --path bin --path-glob '*.tar.gz' --invert-paths

这将过滤掉给定文件夹中或与给定全局模式匹配的任何内容。就像任何修改 git 历史记录的工具一样,您应该在与其他人共享您的提交之前尝试并尽早捕获它,或者非常熟悉

git-rebase
并从困难的更改中恢复

一旦您确认本地更改符合您的要求,要推送回远程存储库,您将运行以下命令:

git remote add origin <origin-url> git push origin --all --force
这是因为filter-repo默认删除远程源,以防止对远程进行先发制人的意外更改。

© www.soinside.com 2019 - 2024. All rights reserved.