git中的编辑

Ski*_*ick 15 git

我最近开始为FTP编写一个小的Python脚本.首先,我有一个在脚本中硬连线的FTP站点的服务器,登录名和密码详细信息,但这并不重要,因为我只在本地工作.

然后,我有了将项目放在github上的天才想法.我很快意识到自己的错误,并用一个涉及的解决方案取代了硬连线的细节.netrc.我现在已经从github中删除了该项目,因为任何人都可以查看历史记录,并以纯文本格式查看登录详细信息.

问题是,是否有任何方法可以通过git历史记录并删除整个用户名和密码,但是否则保留历史记录?或者我是否需要开始一个没有历史记录的新回购?

Bri*_*ell 23

首先,您应该更改FTP站点上的密码.密码已公开; 你不能保证没有人克隆了回购,或者它不是在某个地方的备份中的纯文本,或类似的东西.如果密码完全有价值,我认为它现在已经妥协了.

现在,关于如何编辑历史记录的问题.该git filter-branch命令旨在用于此目的; 它将遍历存储库历史记录中的每个提交,应用命令进行修改,然后创建新提交.

特别是,你想要的git filter-branch --tree-filter.这允许您编辑每个提交的树的内容(实际文件和目录).它将在包含整个树的目录中运行命令,您的命令可以编辑文件,添加新文件,删除文件,移动它们等等.然后,Git将创建一个新的提交对象,其中包含与前一个相同的所有元数据(提交消息,日期等),但是您的命令修改了树,将新文件视为添加,将文件丢失为删除,等(所以,你的命令不需要做,git add或者git rm只需要修改树).

出于您的目的,以下内容应该起作用,具有适当的正则表达式和文件名,具体取决于您的具体情况:

git filter-branch --tree-filter "sed -i -e 's/SekrtPassWrd/REDACTED/' myscript.py" -- --all
Run Code Online (Sandbox Code Playgroud)

请记住对存储库的副本执行此操作,因此如果出现问题,您仍然可以使用原始文件并重新开始.filter-branch也将保存对原始分支的引用original/refs/heads/master,等等,所以即使你忘了这样做,你也应该能够恢复; 在对我的源代码历史进行一些全局修改时,我想确保在出现问题时我有多个回退.

要更详细地解释这是如何工作的:

sed -i -e 's/SekrtPassWrd/REDACTED/' myscript.py
Run Code Online (Sandbox Code Playgroud)

这将替换SekrtPassWrd您的myscript.py文件REDACTED; 告诉它编辑文件的-i选项sed,没有备份文件(因为该备份将被Git选为新文件).

如果你需要做一些比单个替换更复杂的事情,你可以编写一个脚本,然后只为你的命令调用它; 只需确保使用绝对路径名调用它,就像git filter-branch在临时目录中调用命令一样.

git filter-branch --tree-filter <command> -- --all
Run Code Online (Sandbox Code Playgroud)

这告诉git如上所述,在存储库中的每个分支上运行树过滤器.该-- --all部分告诉Git将其应用于所有分支; 没有它,它只会编辑当前分支的历史记录,保持所有其他分支不变(这可能不是你想要的).

有关处理已推送到GitHub的信息副本的更多信息,请参阅GitHub上关于删除敏感数据的文档(最初由MBO指出).请注意,他们重申了我更改密码的建议,并提供了一些处理GitHub可能仍然拥有的缓存副本的提示.

  • 这非常有帮助,非常感谢.关于更改密码的说明 - 我需要启动密码,欢呼. (2认同)

Pad*_*ddy 5

也许更容易在FTP站点上更改密码?除非你对代码感到尴尬......