gpt4 book ai didi

git - 从 git 消息中完全删除敏感信息

转载 作者:太空狗 更新时间:2023-10-29 14:35:52 26 4
gpt4 key购买 nike

我不小心在 git 提交消息中包含了一些敏感信息。实际文件都很好——只是消息本身的内容需要回滚。

我怎样才能清除消息,使其不会出现在任何地方,包括 git reflog 历史记录?

最佳答案

长话短说

进行替换提交,然后手动删除或清除不需要的 reflog 条目(有两个)。然后你可以运行 git gc如果你喜欢,使用git show <em>hash-id</em>看看是否把它扔掉了。它可能不会——它可能仍然可以通过哈希 ID 访问最多 14 天。有关详细信息和其他选项,请参阅下文。

描述

您不能更改现有提交。

可以进行一个提交,就像现有提交一样,除了_____(填空)。

git commit 有一个方便的 Git 内置选项对 最近的 提交正是这样做的:

git commit --amend

默认情况下,这会获取索引中的任何内容——如果你刚刚做了一个你后悔的提交,它可能仍然匹配你刚刚所做的提交——并从中进行新的提交。但是,它不是使用当前 提交作为新提交的父级,而是使用当前提交的父级 作为新提交的父级。它还会在当前提交的消息上显示您的编辑器,让您重写消息。

结果是一个新的提交。一如既往,git commit命令使当前分支名称​​指向刚刚进行的新提交。但是新的提交指向的不是前一个提示,而是那个提示的父级。实际上,您之前所做的提交被“推到一边”:

...--o--o--X   <-- branch    # where X is the bad commit

变成:

          X   [abandoned]
/
...--o--o--N <-- branch

现在的问题是,尽管已被放弃,但旧提交仍会在您的存储库中保留一段时间。 任何可以找到它的名称,足以找到它。这包括引用日志条目可以到达提交的任何其他分支和标记名称。

由于您刚刚提交,可能没有这样的附加名称。这意味着只有 reflog 条目:一个用于 HEAD , 和一个名为 branch 的分支.

清除 reflog 条目的最简单方法也是最危险的(或者说,第二危险的):您可以运行 git reflog expire --expire-unreachable=now --all .这将丢弃所有从相关引用的尖端无法访问的引用日志条目,而不查看它们的年龄。

最好的 方法可能是删除这两个特定的 reflog 条目,它们是 HEAD@{1}<em>branch</em>@{1} , 其中 branch 是当前的分支。您可以运行 git reflog delete HEAD@{1}删除 HEAD插槽 1 的条目,对于当前分支的插槽 1 条目也类似。 (您可能需要在 {1} 周围使用引号或类似的引号来保护它不受您的 shell 的影响,具体取决于您的 shell。)

此时提交应该没有名称。它不会出现在 git log 中甚至不会出现在 git reflog 中.但是,可以运行 git fsck --unreachablegit fsck --lost-found查找无法访问的对象,或者如果您知道其原始哈希 ID,git show <em>hash-id</em>去看看。

Git 通常将无法访问的对象保留至少 14 天,以防它们只是在构造期间暂时无法访问。 14 天过去后,尚未完成运行的 Git 命令可能不再需要它们,因此它们会被 git gc 删除。 .如果您确定没有仍在运行的 Git 命令正在构建尚未完全完成并已展示的东西,您可以通过运行 git gc --prune=all 绕过此安全网。 .

如果对象已被打包到 protected ( .keep ) 包中,即使这样做也不够,但这不适用于您的情况。无论如何,一开始就付出这么多努力通常是毫无意义的——如果它没有出现在 git log 中。 , 大多数人再也不会看下去了。

关于git - 从 git 消息中完全删除敏感信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47666456/

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