我犯了一个错误,git 存储库中项目的一个文件包含密码。这不是问题,因为不是公共回购,但我想摆脱回购中的密码。
存储库历史非常简单,因为我是唯一的开发人员,所以它只有 12 个提交,其中一个提交被标记。
这种情况下的更改不会影响历史记录中的任何内容(差异将保持不变),因为我要删除的密码仅在第一次提交时就存在。我想删除那个字符串,就好像它从来没有出现过一样。
是否有某种命令可以执行此操作,或者我必须从头开始重新生成历史记录,并在没有密码的情况下使用新起点并在此基础上应用差异?
我犯了一个错误,git 存储库中项目的一个文件包含密码。这不是问题,因为不是公共回购,但我想摆脱回购中的密码。
存储库历史非常简单,因为我是唯一的开发人员,所以它只有 12 个提交,其中一个提交被标记。
这种情况下的更改不会影响历史记录中的任何内容(差异将保持不变),因为我要删除的密码仅在第一次提交时就存在。我想删除那个字符串,就好像它从来没有出现过一样。
是否有某种命令可以执行此操作,或者我必须从头开始重新生成历史记录,并在没有密码的情况下使用新起点并在此基础上应用差异?
请参阅https://help.github.com/articles/remove-sensitive-data。该文件将出现在所有提交中,如果您没有删除它,因为所有提交都包含整个 repo 的状态。
基本上,您需要做的是在所有提交中运行一个过滤器分支,然后强制将其推送到 repo 中。该命令具有破坏性,并将更改该文件已存在于存储库中的所有提交,因此请小心。
谢谢,这正是我正在寻找并阅读该文章和过滤器分支文档的命令,我得到了我想要使用 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
我会做以下事情:
git rebase --interactive
pick
将第一次提交(带有密码的提交)前面的命令更改为edit
并保持所有其他行不变。保存文件并退出。
然后从文件中删除密码(并进行任何其他所需的更改),然后:
git add name-of-file-with-password
git commit --amend
git rebase --continue