我犯了一个错误,git存储库中项目的一个文件包含一个密码。这不是问题,因为它不是公共回购,但我想在回购中删除该密码。
存储库历史非常简单,因为我是唯一的开发人员,所以它只有12个提交,其中一个提交被标记。
这种情况下的更改不会影响历史记录中的任何内容(差异将保持不变),因为我想要删除的密码仅在第一次提交时出现。我想删除那个字符串,好像它曾经没有在那里一样。
是否有某种命令可以执行此操作,或者我必须在没有密码的情况下从新的起点开始重新生成历史记录并在其上应用差异?
答案 0 :(得分:6)
见https://help.github.com/articles/remove-sensitive-data。如果你没有删除它,那么该文件将出现在所有提交中,因为所有提交都包含整个仓库的状态。
基本上,您需要做的是在所有提交中运行filter-branch,然后强制将其推送到repo中。该命令具有破坏性,将更改文件存在于repo中的所有提交,因此请小心。
答案 1 :(得分:2)
谢谢,这正是我正在寻找的命令,并阅读该文章和过滤器分支文档,我得到了我想要使用sed从文件中删除字符串的确切语法。
git filter-branch --tree-filter "sed -i 's/\<password\>//g' ./path_to_file/filename" --prune-empty --tag-name-filter cat -- --all
其中:
“密码” - &gt;是需要删除的字符串
“./ path_to_file / filename” - &gt;是repo中需要修改的文件的路径
在repo root中运行就像魅力一样。更改完成后,必须将其推送到远程服务器。这需要强制,以便服务器接受全新重写的引用和标记。
所以强制将repo推送到远程服务器(大多数情况下来源)
git push origin --all --force
强行将标签推送到远程服务器
git push origin --tags --force
答案 2 :(得分:1)
我会做以下事情:
git rebase --interactive
将第一次提交(使用密码提交)前面的命令pick
更改为edit
,并将所有其他行保持原样。保存文件并退出。
然后从文件中删除密码(并进行任何其他必要的更改),然后:
git add name-of-file-with-password
git commit --amend
git rebase --continue