当前状态:我将包含内部数据库凭据的文件提交到我的Git存储库。这很好,因为我一个人使用它。然后我的小组开始在这个项目中克隆,推送和拉动。我们现在有几个Git存储库(一个中心和一些开发人员)。
问题:我们现在想要公开访问源代码和Git存储库,或者至少让Git管理其他对代码有贡献的细节。
问题:什么是
的好策略a)使用来自中央或所有存储库的凭据删除文件,或
b)建立一个新的Git存储库作为外部世界的“接口”?
如果选择(b),我们如何轻松地将更改传回主存储库?
由于已经广泛分发,我们真的不希望在每个当前存储库上都执行git rebase
或git filter-branch
。
答案 0 :(得分:9)
很抱歉,如果您要从主存储库中删除凭据,则无法运行git filter-branch
。请参阅由GitHub上的人员撰写的Removing sensitive data。
由于git的设计,没有办法强制现有的克隆从各自的历史中删除文件。
您可以清理单个分支并使其成为未来发展的基础:
$ git checkout -b old-master master
$ git filter-branch ... master
现在你需要将已清理的主人推送到一个只包含干净主人的新仓库:
$ git push new-central master
现有的repos可以在必要时将旧的分支机构的新远程和git cherry-pick
更改添加到新的干净主机。
对于新的存储库,设置了某种屏障以防止有人将敏感数据推送到它,这样你就不会再遇到同样的问题了。这个障碍可能是一个人控制新的中央存储库并审查所有补丁来决定进入的内容。
答案 1 :(得分:7)
只需更改内部数据库的密码,以及具有相同密码的任何其他服务。 (对于历史中某处存在的任何其他密码也是如此)。
答案 2 :(得分:2)
没有使用rebase或filter-branch,你无法做到a)。但我要说现在这样做可能更好,而不是必须为永远隐藏历史而斗争。我猜b)可以通过在删除凭据的提交之后拆分历史记录来完成。结果几乎是两个历史,放在两个不同的回购;清理前的一个,以及之后“重新启动”的一个。这两个回购的历史可以通过graft-points连接到那些需要了解旧历史的人的回购中。
无论哪种方式,你将不得不处理一大堆sh * t,我建议你去做a)和filter-branch,即使这是很多工作。
答案 3 :(得分:1)
所以,我们通过,我想分享我们最终如何做到这一点。
我们处于幸运的位置,没有人在某个时刻有自定义分支。所以我们基本上做的是,所有人都把他们的东西推到了中央存储库。
然后我们使用GitHub工作人员描述的filter-branch
。我们有一个明确的中央存储库。
最后(这只是因为没有人提到过本地分支)我们删除了我们的本地存储库并从现在干净的中央存储库中克隆了新存储库。
简而言之:这种方式非常快速且无痛。不优雅,但它有效。