有哪些方法可以创建一个损坏的git仓库?有没有一些有趣的方法可以永久性地破坏git仓库?你能够使git仓库处于一种“正常但奇怪”的状态吗?
我的兴趣来自于当某人担心他们是否真正创建了一个无法恢复的状态时。通常情况下,这很容易修复或者至少拼凑起来。在git中有隐藏的(邪恶)功能吗?
我的兴趣来自于当某人担心他们是否真正创建了一个无法恢复的状态时。通常情况下,这很容易修复或者至少拼凑起来。在git中有隐藏的(邪恶)功能吗?
好的,最直接的腐败可能发生在.git/objects
目录内部的数据或数据完整性丢失。由于它被设计为不可变的、只写的存储机制,一旦你违反了这个假设,很多其他的东西就会崩溃。最常见的情况是网络传输中损坏的packfiles。除非你非常(读作:天文数字级别)倒霉,否则Git会自动检测到并大声抱怨。要以这种方式获得静默失败,你需要以这样一种方式破坏blob,即使在deflate压缩下也能保留其SHA1哈希值...具有准确的类型和大小头。
因此,git在验证自己的数据完整性方面表现得非常出色。我们还能做什么呢?要使状态真正无法恢复,你需要:
.git/refs
或任何reflog下没有任何命名引用),然后git checkout <sha> && git branch recovered
并获得所有工作的备份,无论您做了什么。在正常的git使用中,当您进行rebase、cherry-pick或filter-branch操作时,提交会变成孤儿,所有这些操作都是基于旧提交对象创建新提交对象的,或者如果您在分支周围执行git reset --hard
。默认情况下,您有大约两周的宽限期,然后它们将被删除,尽管您始终可以截断您的reflog并手动清理以提前销毁某些内容。
.git
目录下每个文件的每个字节进行异或运算。然后忘记选定的随机数字。 - ta.speot.is.git
中加密所有内容听起来很有趣,但实际上却缺乏吸引力。我刚刚这样做了,所有的git status
都报告了fatal: Not a git repository (or any of the parent directories): .git
,这与在任何其他目录中运行status
是相同的。 - Kyle Kelley