繁体   English   中英

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

[英]Completely remove sensitive information from a git message

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

如何清除消息,使它不会出现在任何地方 ,包括git reflog历史记录?

TL; DR

进行替换提交,然后手动删除或清除不需要的reflog条目(其中有两个)。 然后,您可以根据需要运行git gc ,并使用git show hash-id查看是否将其丢弃。 它可能无法使用-可能仍可以通过哈希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条目以及可以到达提交的任何其他分支和标记名称。

由于您刚刚进行提交,因此大概没有这样的附加名称。 这意味着只有reflog条目:一个用于HEAD ,一个用于名为branch

清除reflog条目的最简单方法也是最危险(或者, git reflog expire --expire-unreachable=now --all第二个):您可以运行git reflog expire --expire-unreachable=now --all 这会丢弃所有从相关参考文献的顶端无法访问的reflog条目,而无需查看它们的年龄。

最好的办法可能是删除这两个具体的引用日志条目,这是HEAD@{1}branch @{1}其中branch是哪个分支电流。 您可以运行git reflog delete HEAD@{1}来删除插槽1处的HEAD条目,对于当前分支的slot-1条目也是如此。 (根据外壳的不同,可能需要用引号或{1}类的引号引起来使其免受外壳的破坏。)

此时,应该没有用于提交的名称。 它不会显示在git log ,甚至不会显示在git reflog 但是,可以运行git fsck --unreachablegit fsck --lost-found查找无法访问的对象,或者,如果您知道其原始哈希ID,则可以使用git show hash-id来查看它。

Git通常会将无法到达的对象保留至少14天,以防它们仅在构建期间暂时无法到达。 经过14天后,尚未完成运行的Git命令可能仍不需要它们,因此它们被git gc删除。 如果您确定没有Git命令仍在运行,它们正在构建尚未完成并尚未显示的内容,则可以通过运行git gc --prune=all来绕过此安全网。

在某些情况下,如果将对象包装到受保护的( .keep )包中,即使这样做也不足够,但这不适用于您的情况。 在任何情况下,首先进行这样的工作通常都是没有意义的-如果它未在git log显示,则大多数人再也看不到了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM