14

我犯了一个错误,git 存储库中项目的一个文件包含密码。这不是问题,因为不是公共回购,但我想摆脱回购中的密码。

存储库历史非常简单,因为我是唯一的开发人员,所以它只有 12 个提交,其中一个提交被标记。

这种情况下的更改不会影响历史记录中的任何内容(差异将保持不变),因为我要删除的密码仅在第一次提交时就存在。我想删除那个字符串,就好像它从来没有出现过一样。

是否有某种命令可以执行此操作,或者我必须从头开始重新生成历史记录,并在没有密码的情况下使用新起点并在此基础上应用差异?

4

3 回答 3

8

请参阅https://help.github.com/articles/remove-sensitive-data。该文件将出现在所有提交中,如果您没有删除它,因为所有提交都包含整个 repo 的状态。

基本上,您需要做的是在所有提交中运行一个过滤器分支,然后强制将其推送到 repo 中。该命令具有破坏性,并将更改该文件已存在于存储库中的所有提交,因此请小心。

于 2012-12-23T16:20:44.387 回答
4

谢谢,这正是我正在寻找并阅读该文章和过滤器分支文档的命令,我得到了我想要使用 sed 从文件中删除字符串的确切语法。

git filter-branch --tree-filter "sed -i 's/\<password\>//g' ./path_to_file/filename" --prune-empty --tag-name-filter cat -- --all

在哪里:

"password" -> 是需要去掉的字符串

"./path_to_file/filename" -> 是repo里面需要修改的文件的路径

在回购根目录中运行就像一个魅力一样。

更改完成后,必须将其推送到远程服务器。这需要强制,以便服务器接受全新的重写 refs 和标签。

因此,将 repo 强制推送到远程服务器(大多数情况下为源)

git push origin --all --force

并将标签强制推送到远程服务器

git push origin --tags --force
于 2012-12-24T11:36:10.740 回答
2

我会做以下事情:

git rebase --interactive

pick将第一次提交(带有密码的提交)前面的命令更改为edit并保持所有其他行不变。保存文件并退出。

然后从文件中删除密码(并进行任何其他所需的更改),然后:

git add name-of-file-with-password
git commit --amend
git rebase --continue
于 2012-12-24T19:50:38.873 回答