2017 年编辑:如果您正在阅读本文,您可能应该查看 BFG Repo-Cleaner。
令人尴尬的是,我的本地存储库大小没有缩小的原因是因为我在 filter-branch 中使用了错误的文件路径。因此,虽然我感谢 J-16 SDiZ 和 CodeGnome 的回答,但我的问题出在椅子和键盘之间。
为了让这个问题不再是我愚蠢的纪念碑,并且对人们真正有用,我花时间写了一个在修剪回购后必须经历的步骤,以便重新获得回购在 Github 上。希望这可以帮助某人。
删除有问题的文件
要删除有问题的文件,请运行下面的 shell 脚本,基于 Github remove sensitive data howto
#!/usr/bin/env bash
git filter-branch --index-filter 'git rm -r -q --cached --ignore-unmatch '$1'' --prune-empty --tag-name-filter cat -- --all
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now
我遍历了本地存储库上的每个分支并执行了此操作,但老实说,我不确定是否需要这样做,(您不需要在每个分支上都执行此操作)但是您确实这样做了下一步需要每个本地分支,所以请记住这一点。完成后,您应该会看到本地存储库中的大小减小。您还应该能够在 CodeGnome 的答案中运行 blob 脚本并查看有问题的 blob 删除。如果不是,请仔细检查文件名和路径并确保它们正确。
git filter-branch 实际上在这里所做的是在 repo 中的每次提交上运行引号中列出的命令。
脚本的其余部分只是清理旧数据的所有缓存版本。
推送修剪后的 repo
现在本地 repo 处于您需要它的状态,诀窍是将其备份到 Github 上。不幸的是,据我所知,没有办法从 Github 存储库中完全删除二进制数据,这是来自 Github sensitive data howto
的引用
请注意,强制推送不会删除远程仓库上的提交,它只是引入新的提交并移动分支指针以指向它们。如果您担心用户直接通过 SHA1 访问错误提交,则必须删除 repo 并重新创建它。
您需要重新创建 Github 存储库,这很糟糕,但好消息是重新创建存储库实际上非常容易。痛苦的是您还必须重新创建问题和 wiki 中的数据,我将在下面介绍。
我建议在 github 中创建一个新的 repo,然后在你准备好后用旧的 repo 将其切换出来。这可以通过将旧的重命名为“repo name old”,然后将新创建的 repo 的名称更改为“repo name”来完成。确保在创建新存储库时取消选中使用 README 进行初始化,否则您将无法处理干净的状态。
如果您完成了最后一步,您应该清理您的存储库并准备就绪。现在需要更改遥控器以匹配新的 Github 存储库位置。我通过直接编辑 .git/config 文件来做到这一点,尽管我确信有人会告诉我这样做不是正确的方法。
在进行推送之前,请确保您在本地 repo 中拥有所有要推送的分支和标签。准备好后,使用以下命令推送所有分支
git push --all
git push --tags
现在你应该有一个远程仓库来匹配你修剪的本地仓库。仔细检查所有数据以防万一。
现在,如果您不必担心问题或 wiki,您就完成了。如果您继续阅读。
在 wiki 上移动
Github wiki 只是与您的主存储库相关联的另一个存储库。因此,要开始在某处克隆您的旧 wiki 存储库。然后下一部分有点棘手,据我所知,您需要单击新存储库的 wiki 选项卡才能创建 wiki,但它会使用初始文件为新创建的 wiki 播种。所以我所做的,我不确定是否有更好的方法,将遥控器更改为新创建的 wiki repo 并使用
推送到新位置
git push --all --force
这里需要强制,否则git会抱怨当前分支的尖端不匹配。我认为这可能会使初始页面在 git repo 中处于分离状态,但它对 repo 大小的影响应该可以忽略不计。
解决问题
this answer 对此提出了建议。但是看看答案中链接的the script,它看起来相当不完整,有一个 TODO 用于评论导入,我不知道它是否会带来问题的状态。
因此,鉴于我有一个相当小的未解决问题队列,而且我不介意丢失已解决的问题,我选择手动解决问题。请注意,在 cmets 上正确归因于其他人是不可能做到这一点的。因此,我认为对于一个更成熟的大型项目,您需要编写一个更强大的脚本来完成所有内容,但对于我的特定情况,这不是必需的。