Git:从仓库中删除凭据

8
首先,这不是这个或者那个的重复问题。 当前状态: 我把一个内部数据库凭证文件提交到了Git仓库。当时只有我在使用,所以没有问题。然后我的团队开始克隆、推送和拉取这个项目。现在我们拥有了多个Git仓库(一个中央仓库以及一些开发者的仓库)。 问题: 我们现在想要公开源代码,并向外界提供Git仓库,或至少让Git管理其他人对代码的贡献。 问题: 选择以下哪种策略比较好:
a) 从中央或所有仓库删除凭证文件,或
b) 建立一个新的Git仓库作为“接口”向外界提供服务?
如果选择(b), 我们应该如何方便地将更改传回主要仓库?
由于已经广泛分布,我们真的不希望每个当前仓库都执行git rebasegit filter-branch
4个回答

10

如果您想从主存储库中删除凭据,很抱歉,但您只能使用 git filter-branch 命令。请参阅 GitHub 团队撰写的 Removing sensitive data

由于 git 的设计,没有办法强制已存在的克隆版本从它们各自的历史记录中删除文件。

您可以清理单个分支并将其作为未来开发的基础:

$ git checkout -b old-master master
$ git filter-branch ... master

现在你需要将经过清理的主分支推送到一个新的仓库,该仓库只包含干净的主分支:

$ git push new-central master

如果现有的代码库需要将旧分支中的更改添加到新的主干代码库中,可以添加新的远程代码库并使用git cherry-pick命令进行操作。

对于新的代码库,应该设置某种屏障以防止有人将敏感数据推送到其中,以避免再次出现同样的问题。这个屏障可以是一个人,该人控制新的中央代码库并审查所有补丁以决定是否接受。


9

只需更改内部数据库的密码以及任何使用相同密码的其他服务。(对于历史记录中存在的任何其他密码也是如此)。


好奇怪,我竟然忘了点赞这个答案。在我们的特殊情况下,这并不适用,但在一般情况下,这是一个广泛应用的仓库管理方式,我甚至曾经在发布我的宠物项目时这样做过。(看来将来我应该再次检查我提交的内容...) - Boldewyn

2
没有办法在不使用rebase或filter-branch的情况下完成a)。但我认为现在这样做可能比永远隐藏历史更好。我猜b)可以通过在删除凭据的提交之后拆分历史记录来完成。结果将几乎是两个历史记录,放置在两个不同的仓库中;一个是清理之前,另一个是“重新启动”之后。这两个仓库的历史记录可以通过graft-points连接到需要访问旧历史记录的人的仓库中。
无论哪种方式,你都需要处理一大堆麻烦事,我建议即使它很费力,也应选择a)和filter-branch。

很抱歉取消接受你的答案,但是gbacon回答中的GitHub链接非常有价值。 - Boldewyn

1

所以,我们终于完成了,我想分享一下我们最终是如何做到的。

我们很幸运,某个时刻没有人有自定义分支。因此,我们基本上所做的就是,所有人都将他们的东西最后一次推送到中央仓库。

然后,我们像GitHub团队描述的那样使用了filter-branch。然后我们就有了一个清晰的中央仓库。

最后(这只有因为没有人有本地分支才能起作用),我们删除了我们的本地仓库,并从现在干净的中央仓库克隆了新的仓库。

简而言之:这种方式是相当快速和无痛的过程。不太优雅,但它起作用了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接