永久删除 git 提交历史记录

2024-05-27

我需要永久且完全删除 git 存储库的提交历史记录并继续使用文件的当前版本。旧版本/提交不得以任何方式访问。我尝试创建一个新的主分支,删除所有其他分支,但是当我在 git bash 中尝试“git show xxxx”时,旧的提交继续显示。

我尝试创建一个新的主分支,删除所有其他分支,并使用 git gc。


简短的答案 - 创建一个新的存储库

对于这样的彻底清理,您需要创建一个全新的存储库并删除旧的存储库。

我可以给你关于运行垃圾收集、清除引用日志以及找到 Git 暂时存储已删除提交的其他位置的答案,但对于你提出的问题,我强烈推荐一个新的存储库。

特别是,如果您使用 GitHub 或其他一些在线 Git 服务器,完全清理旧提交可能是一项无望的任务。

真正尝试一下 - 沙箱端

好吧,所以我的回答“放弃,做不到”不是很令人满意。以下是一些可能从沙箱中清除旧提交的命令:

第 1 步:清除引用日志

reflog 保留了指向 HEAD 一段时间之前所指向的位置的指针。git gc不会删除 reflog 仍指向的任何提交,因为如果它们仍由 reflog 指向,它们实际上并不是松散对象。

这对我有用:

git reflog expire --expire=all --all

验证:运行git reflog并确保它是空的。

步骤 2:删除或更新指向旧历史记录的任何标签或分支

任何仍指向旧历史记录的标签或分支将确保历史记录无法被删除。

git tag -d <tagname>
git branch -D <oldbranchname>

步骤 3:断开或清理所有远程引用

如果你还有origin/master指向提交,它不能被垃圾收集。因此,要么删除旧遥控器,要么删除旧遥控器上的所有标签和引用,并在沙箱中修剪它们的引用:

git fetch --prune

or even

git remote remove origin

验证:运行git log --all并确保旧的提交未列出。

第四步:垃圾收集

现在,您可以运行垃圾收集,并提供使其尽可能彻底的选项。

git gc --prune=now --aggressive

到了这个阶段,终于老了master提交不再显示为git show <old-sha1-of-master>在我的测试仓库中。

考虑尝试一下 - 服务器端

这就是事情变得更困难的地方,因为你必须知道你的服务器使用什么类型的类似引用日志的东西和备份。但...

  • 推送您想要的新历史。
  • 确保删除所有旧历史记录:删除或更新指向旧提交的任何标签或分支。
  • 拉取请求:据我所知,GitHub 会永久保存任何拉取请求的 HEAD,即使是在未合并的情况下关闭的拉取请求,即使分支已被删除。我不知道如何清除旧 PR 保留的提交。
  • 问题:我认为问题可以通过 sha1 引用提交,我敢打赌这些也会阻止垃圾收集。所以,彻底扫描你的旧问题,如果你发现有问题的问题,我不知道你应该做什么。
  • 备份:我不知道,但我确信有备份,而且它们不会成为您完成此任务的朋友。但也许它们的保留时间有限,一段时间后就会被冲掉?
  • reflog 和垃圾收集:我们回到步骤 1,因为我不知道如何强制 GitHub 触发 reflog 清理和垃圾收集。如果您有权访问自己的 GitLab 实例,您的 Git 系统管理员也许能够做到这一点。

检查完以上所有内容后,尝试新的git clone and git clone --mirror。另请尝试在浏览器中加载此内容:https://<server>/<user>/<repo>/commit/<sha1>。如果这些都没有显示您想要删除的提交,那么我想您已经完成了?

实际上,我不认为上述测试会告诉你已经完成了。 服务器端,如果你真的想删除旧历史记录及其可能包含的任何秘密,我会回到我不满意的最初答案:从 Git 服务器中完全删除存储库(接受所有“这是不可逆的”警告) - 毕竟,这就是您想要的!),并创建一个具有空历史记录、空 PR 列表、空备份的新存储库,然后仅推送您想要的历史记录。

Update:这个相关问题的答案,从 Git 历史记录中删除敏感文件及其提交 https://stackoverflow.com/a/32840254/3216427表示您可以联系 GitHub 客户支持来获取悬空提交,其中敏感信息实际上已从您的存储库中删除。

思考其他痕迹

一旦你的沙箱和服务器被修复,不要忘记:

  • 您的存储库的任何分支仍将引用旧的提交
  • 在其计算机上克隆存储库(或分支)的其他任何人仍将引用旧提交
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

永久删除 git 提交历史记录 的相关文章

  • 如何损坏 Git 存储库?

    创建损坏的 git 存储库有哪些方法 有没有有趣的方法可以永久损坏 git 存储库 你能否削弱一个 git 存储库 使其行为有些正常 但会做一些奇怪的事情 我的兴趣来自于当有人担心他们是否真的创建了不可恢复的状态时 它通常很容易修复或至少可
  • 在 git 提交消息中使用任何 utf-8 字符是否安全?

    我发现使用 UTF8 字符 例如 很有用 请参阅here http www utf8icons com subsets dingbats 在提交消息中 重构 NewService 添加了更好的服务 OldServiceA 据我所见 它see
  • 如何使用 libgit2 创建空提交?

    我一直在寻找libgit2 C API 参考 https libgit2 org libgit2 但我不知道如何模仿git commit allow empty libgit2 是否有内置方法来创建空提交 如果没有 git 如何在底层创建一
  • 将 svn 存储库添加到现有的 git 存储库中?

    我知道你可以使用 git svn init 来跟踪 svn 存储库 但这是为了你想创建一个全新的存储库 我的情况是 我目前已经有一个现有的 git 存储库 并且希望通过将 svn 存储库设为我当前 git 存储库中的远程分支来跟踪 svn
  • 如何让 git 和 copSSH 在正确的目录中查找密钥?

    我刚刚安装了 Windows 版 copSSH 当我启动它时 我得到一个目录C copSSH home Nick ssh其中有我的酒吧和私钥 当我通过 Cygwin bash 窗口访问此目录时 使用 ssh 用户 主机 我很高兴地登录了 但
  • 由于不存在大文件而导致 git Push 错误

    当尝试推送到 git 时 我不断得到相同的结果 Counting objects 78 done Delta compression using up to 4 threads Compressing objects 100 67 67 d
  • git for-each-ref - 按年龄过滤结果

    我正在使用以下命令here https stackoverflow com a 39251131 5812876 git for each ref format color cyan authordate format m d Y I M
  • 在 GitHub 上执行拉取请求时避免不需要的合并提交和其他提交

    我在 Github 上分叉了一个项目 令远程上游为upstream我的远程存储库是origin 我当地的master分支设置为跟踪远程master分支 然后我在本地添加了一些东西master 时不时与上游汇合 直到今天我想发出pull re
  • 如何查看 github 的 SSH 密钥?

    我最近收到一封来自 Github 的电子邮件 要求我检查我的 SSH 密钥 请检查您的钥匙并确保您 认出他们 如果您有任何疑问 请拒绝钥匙并 上传新密钥 如何在 ubuntu 11 10 上使用 git 检查我的密钥 您可以按照 GitHu
  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • git checkout 到分支需要很长时间

    我使用的是 Ubuntu 17 10 并且使用 git 版本 2 14 1 每当我从 master 创建一个分支并尝试签出它 或从它签出到 master 时 都会花费大量时间 大约几分钟 有时接近 10 分钟 确实 我有几 GB 的数据 但
  • 获取最新远程提交的 SHA1 [重复]

    这个问题在这里已经有答案了 可能的重复 git bash 如何检查是否有新的提交可用 https stackoverflow com questions 6006759 git bash how to check if theres a n
  • 如何升级 Windows 中 git svn 使用的 SVN 版本?

    我的公司正在将SVN升级到1 7 检查git svn version显示正在使用的SVN版本是1 4 6 我想获得 git svn 使用的 SVN 版本接近 1 7 但是 我没有看到有关更新 git svn 使用的 SVN 版本 在 Win
  • 是否可以在 git 存储库之外添加和提交文件?

    我们的文本文件分布在系统的各个角落 我们计划将这些文件中所做的所有修改添加到 git 存储库中 每次对这些文件进行修改都是由脚本进行的 因此 我们计划向该脚本添加新命令 以将文件添加到 git 存储库 但是 这些修改是同时进行的 我们可以为
  • 在 Web 应用程序中显示最新的提交值?

    我有一些 Rails 应用程序 我使用 Git 作为版本控制系统 我使用 GitHub 或 Beanstalk 作为存储库主机 从理论上讲 我想要做的事情非常简单 以某种方式在 Web 应用程序的页脚中显示最新的提交 ID 号 哈希值 这样
  • gitlab 请求将分支 A 合并到开发中(落后 3 次提交)我应该担心吗?

    在 gitlab 中创建合并请求时 我经常收到一条消息 请求将分支 A 合并到开发中 x 提交落后 gitlab想告诉我什么 我应该担心还是需要修复某些东西 什么 一段时间后合并请求在项目中打开时 由于其他人合并了自己的更改 您尝试合并到的
  • 如何解决 VS Code 中变基拉取的合并冲突?

    当我做一个git pull rebase 并且我的提交中存在合并冲突 我得到冲突差异视图 解决所有冲突并暂存文件 然后呢 我可以打开终端并运行git rebase continue但是 VS Code 中不应该有一个按钮来完成变基吗 只需使
  • 在centos上设置jenkins:ssh密钥和git的问题

    经历了很多问题 但似乎没有什么能解决我的问题 或者更准确地说 我不确定我是否正确地完成了整个事情 所以这里是 已安装centos 6 3操作系统 然后我按照以下指南安装詹金斯 https wiki jenkins ci org displa
  • 如何关闭分支而不将其从 git 的历史记录中删除?

    我想提交并关闭其分支 而不将其从历史中删除 有了水银我会commit close branch then update转到上一个 然后继续工作 有了 git 我很困惑 没有与 Git 中关闭分支完全相同的方法 因为 Git 分支比 Merc
  • SSL 适用于浏览器、wget 和curl,但不适用于 git

    我有一个网站 用于托管 redmine 和几个 git 存储库 这非常适合 http 但我无法使用 https 进行克隆 即 git clone http mysite com git test git 工作正常 但是 git clone

随机推荐