从旧的Git提交中删除私人信息

15

我有一个使用Git版本控制的项目,想要开源,但其中包含了一些与原始环境相关的私人信息。我打算将这些信息更改为从未纳入代码库的配置文件中读取。我意识到最好在一开始就这样做,但既然私人信息仍存在于之前的提交中,我该如何从历史记录中删除它呢?我是要基于最新提交开始一个新的代码库并失去所有历史记录,还是有办法挽救当前的代码库并删除任何与私人信息有关的记录呢?

补充说明:我不想完全删除包含这些私人信息的文件,因为它们仍在使用。相反,我想删除/清空/更改其中某些字符串的出现。


这个回答解决了你的问题吗?如何在Git历史记录中替换文件中的文本? - Ciro Santilli OurBigBook.com
2个回答

6
我建议使用BFG Repo-Cleaner,这是一个更简单、更快速的替代方案,专门用于从Git存储库中删除私有数据,而不是使用git-filter-branch使用说明提供了更详细的步骤,但核心部分只需下载BFG的jar(需要Java 8或更高版本)并运行此命令即可:
$ java -jar bfg.jar  --replace-text replacements.txt  my-repo.git

replacements.txt 文件应包含您想要执行的所有替换,格式如下(每行一个条目 - 注意评论不应包括在内):

PASSWORD1 # Replace literal string 'PASSWORD1' with '***REMOVED***' (default)
PASSWORD2==>examplePass         # replace with 'examplePass' instead
PASSWORD3==>                    # replace with the empty string
regex:password=\w+==>password=  # Replace, using a regex

将扫描您的整个存储库历史记录,并对所有非二进制文件(大小不超过1MB)执行替换操作:任何匹配的字符串(不在您的最新提交中)都将被替换。

完全披露:我是BFG Repo-Cleaner的作者。


2
我之前写过一个脚本,与此相关,你可以在这里找到它:https://gist.github.com/dound/76ea685c05c4a7895247457eb676fe69 (原始说明在archive.org上可查看:https://web.archive.org/web/20160208235904/http://dound.com:80/2009/04/git-forever-remove-files-or-folders-from-history/
该脚本建立在git自带的git-filter-branch工具之上。如果您感兴趣,您可以在这里阅读有关从git repo中删除文件的更多信息,但使用上面链接中的脚本应该很容易,并且你唯一需要做的就是删除私人信息。

这看起来是一个很棒的工具,但我不确定它在我的情况下是否适用。我应该在我的问题中更清楚一些,但我想要删除的是某些字符串的出现-我不想完全删除整个文件,因为这些文件仍在使用。 - Jimmy
哦,我明白了。这有点棘手。如果您在提交中输入了这些私有字符串,而这些提交中没有其他您想要保留的内容,那么您可以使用git-filter-branch仅删除这些提交(而不是删除文件)。我的脚本无法为您完成此操作,但如果您查看git-filter-branch的man页面,我认为您会知道如何使用它来删除单个提交。 - David Underhill
此外,您应该能够使用git-filter-history在文件上应用自定义过滤器(脚本)。这听起来可能比仅删除文件或提交要困难一些,但它应该能够实现您想要的功能(并且在向公众发布时不会像重新启动存储库并丢失所有历史记录那样糟糕)。 - David Underhill
如果要替换的文本包含不寻常的字符(例如 $、\ 等,例如更强的密码),则在使用 git-filter-branch 时可能需要费点功夫来正确转义这些字符。http://stackoverflow.com/questions/18647400/git-filter-branch-to-remove-strings-but-where-strings-contain-and-other-c 是一个针对该特定问题的问题。 - Roberto Tyley
@DavidUnderhill 上面的链接已经失效了 - 可以考虑将其放在 gist 中。 - Matt Vukomanovic
@MattVukomanovic 感谢您的提醒。已更新答案以反映此事。 - David Underhill

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