我怎样才能破坏Git存储库?

时间:2013-11-03 23:53:24

标签: git corruption corrupt

创建损坏的git存储库有哪些方法?有没有办法有趣地永久损坏git存储库?你可以削弱一个git存储库,使它在某种程度上正常运行,但做些奇怪的事情吗?

我的兴趣来自于有人担心他们是否真的创造了一个不可恢复的状态。它通常被证明是易于修复或至少拼凑在一起的东西。是否在git中隐藏了( evil )宝石?

1 个答案:

答案 0 :(得分:7)

嗯,可能发生的最直接的损坏是.git/objects目录中的数据丢失或数据完整性。因为它被设计成一个不可变的只写存储机制,一旦你违反了这个假设,许多其他的东西就会崩溃。最常见的是,这可能是由网络传输中损坏的打包文件造成的。但是,除非你非常(阅读:天文学上)不幸,否则git会将此视为理所当然并且大声抱怨。要以这种方式获得静默失败,您需要以这样一种方式来破坏blob,使其保留其SHA1哈希...在deflate压缩下......使用准确的类型和大小的头。

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

  1. 与该状态相关联的提交和其他对象未被引用(即.git/refs或任何reflog下的任何命名引用都无法访问);然后
  2. 垃圾收集实际上永远删除状态,或者采取新的克隆并删除原始文件。
  3. 否则,无论你做了什么,你都可以运行git checkout <sha> && git branch recovered并完成所有工作。在你正常的git使用期间,当你使用rebase,cherry-pick或filter-branch,所有这些都会根据旧的提交对象创建新的提交对象,或者git reset --hard是一个分支时,提交会像这样孤立。默认情况下,在删除之前你有一个about two weeks的宽限期,然后,尽管你总是可以截断你的reflog并手动修剪以便早点核对。

    更常见的是,当用户从未将数据添加到git时,我看到数据丢失。例如,新用户有时会经常犹豫不决,并尝试使用带有脏工作副本的命令。如果你从未在git中记录状态,git就无法为你带回来!

    如果您对可恢复难以注意的诡计感到满意,您可以通过git replacegraft points做一些恶意通过合并或过滤分支操作来欺骗git进行假历史操作。但是,替换的提交仍然可以达到,因此不会造成永久性损坏。