gpt4 book ai didi

git - 在 git 中编辑

转载 作者:IT王子 更新时间:2023-10-29 00:34:54 27 4
gpt4 key购买 nike

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

然后我灵机一动,把这个项目放到了github上。很快我就意识到了我的错误,并用涉及 .netrc 的解决方案替换了硬连线细节。我现在已经从 github 中删除了该项目,因为任何人都可以查看历史记录,并以纯文本形式查看登录详细信息。

问题是,是否有任何方法可以遍历 git 历史记录并从头到尾删除用户名和密码,但不保留历史记录?还是我需要开始一个没有历史记录的新 repo ?

最佳答案

首先,您应该更改 FTP 站点上的密码。密码已经公开;您不能保证没有人克隆过该存储库,或者它不是某个地方的备份中的纯文本,或类似的东西。如果密码真的有值(value),我认为它现在已经泄露了。

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

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

为了您的目的,像下面这样的东西应该可以工作,根据您的具体情况使用适当的正则表达式和文件名:

git filter-branch --tree-filter "sed -i -e 's/SekrtPassWrd/REDACTED/' myscript.py" -- --all

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

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

sed -i -e 's/SekrtPassWrd/REDACTED/' myscript.py

这会将 myscript.py 文件中的 SekrtPassWrd 替换为 REDACTEDsed-i 选项告诉它就地编辑文件,没有备份文件(因为 Git 会将备份文件作为新文件)。

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

git filter-branch --tree-filter <command> -- --all

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

请参阅 GitHub 上的文档 Removing Sensitive Data (如 originally pointed out by MBO )有关处理已推送到 GitHub 的信息副本的更多信息。请注意,他们重申了我更改密码的建议,并提供了一些处理 GitHub 可能仍然拥有的缓存副本的技巧。

关于git - 在 git 中编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2110595/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com