如何损坏 Git 存储库


有哪些

方法可以创建损坏的 git 存储库?有没有办法永久损坏 git 存储库?你能削弱一个 git 存储库,让它的行为有些正常但做奇怪的事情吗?

我的兴趣来自于当有人担心他们是否真的创造了一个不可恢复的状态时。它通常很容易修复或至少拼凑在一起。git 中有隐藏的(邪恶)宝石吗?

好吧,可能发生的最直接的损坏是.git/objects目录中的数据或数据完整性丢失。由于它被设计为一种不可变的只写存储机制,一旦你违反了这个假设,许多其他事情就会分崩离析。最常见的原因是,例如,在网络传输中损坏的包文件。但是,除非你非常(阅读:天文数字)不走运,否则 git 会理所当然地检测到这一点并大声抱怨。要以这种方式获得静默失败,您需要以保留其 SHA1 哈希的方式损坏 blob...在放气压缩下...具有准确的类型和大小标题。

因此,git 非常擅长验证自己的数据完整性。我们还能做什么?要真正使状态不可恢复,您需要:

  1. 与该状态关联的提交和其他对象未被引用(即,.git/refs下的任何命名 ref 或任何 reflog 都无法访问);然后
  2. 垃圾回收实际上永久删除状态,或者获取新的克隆并删除原始克隆。

否则,无论您做了什么其他工作,您始终可以运行git checkout <sha> && git branch recovered并恢复所有工作。在正常的 git 使用期间,当您变基、挑选或过滤分支时,提交会像这样孤立,所有这些都会基于旧提交对象创建新的提交对象,或者如果您git reset --hard分支。默认情况下,在它们被删除之前,您有大约两周的宽限期,尽管您始终可以截断您的 reflog 并手动修剪以尽早删除某些内容。

更常见的是,当用户从未将他们的数据添加到 git 时,我看到数据丢失。例如,新用户有时会犹豫是否要频繁提交,并尝试将命令与脏工作副本一起使用。如果你从来没有在 git 中记录过一个状态,git 就无法为你带回它!

如果你对可恢复难以注意到的诡计感到满意,你可以用 git 替换或移植点做一些邪恶的事情来欺骗 git 通过合并或过滤器分支操作对虚假历史记录进行操作。但是,替换的提交仍被视为可访问,因此不会造成永久性损坏。

最新更新