切换分支时机器崩溃

时间:2018-12-01 04:49:01

标签: git

我的机器崩溃时我正在切换分支。本质上是Android Studio(大概Gradle做了一些同步的事情),当Windows决定对它进行病毒扫描时,Itunes和Chrome争夺了尽可能多的RAM(我看到了通知,看着机器死机并上床睡觉)。现在,重新启动后,我碰巧执行的所有git操作都会返回以下消息

fatal: Not a git repository (or any of the parent directories): .git

由于我使用存储库在本地跟踪更改,因此没有将其推送到服务器,因此无法执行通常的“删除和克隆技巧”。我只有.git的这一来源,是否有某种方法可以恢复存储库?我怀疑.git中有某种文件使它无效,或者可能有一个日志文件详细说明了交换机在机器崩溃之前走了多远,但是我不确定如何继续。

以下详细说明了我的存储库文件夹的内容。似乎所有对象/引用都存在(我已经编辑了这些对象,因为我怀疑哈希键列表是否相关)。

.git
| |-hooks
| | |-applypatch-msg.sample
| | |-commit-msg.sample
| | |-fsmonitor-watchman.sample
| | |-post-checkout
| | |-post-commit
| | |-post-merge
| | |-post-update.sample
| | |-pre-applypatch.sample
| | |-pre-commit.sample
| | |-pre-push
| | |-pre-push.sample
| | |-pre-rebase.sample
| | |-pre-receive.sample
| | |-prepare-commit-msg.sample
| | \-update.sample
| |-info
| | |-exclude
| | \-refs
| |-lfs
| | |-objects
| | | |-0e
| | | | |-8e
| | | | \-0e8e3708b2f1e19c47aba47ea403e9ca79d137327c91d17259b0d237eefe26f1
| | | | ...
| | | |-logs
| | | \-20181114T090724.0218977.log
| | | \-20181114T090724.1247973.log
| | | \-20181114T090724.2626623.log
| | | \-20181114T090724.3925379.log
| | | \-20181114T090724.5124194.log
| | | \-20181114T090724.6482897.log
| | | \-20181114T090724.8071324.log
| | | \-20181114T090724.9429992.log
| | | \-20181114T090725.1018458.log
| | | \-20181114T090725.2317178.log
| | |-tmp
| | | |-objects
| |-logs
| \-HEAD
| | |-refs
| | | |-heads
| | | \-checkout
| | | \-development
| | | \-filter_by_fragment
| | | \-filter_by_model
| | | \-filter_by_repository
| | | \-master
| | | \-navigation
| | | \-structure_by_adjacency_list
| | | \-structure_by_foreign_key
| | | \-structure_by_modified_pre-order_tree_traversal
| |-objects
| | |-0e
| | \-1fc38e5762a43d46fc3fa149c846b851e1fdfc
| | ...
| | |-info
| | \-packs
| | |-pack
| | \-pack-4ef6cd852a2081fb393e4f3720cbd01a151822d4.idx
| | \-pack-4ef6cd852a2081fb393e4f3720cbd01a151822d4.pack
| |-refs
| | |-heads
| | \-checkout
| | \-development
| | \-filter_by_fragment
| | \-filter_by_model
| | \-filter_by_repository
| | \-master
| | \-navigation
| | \-structure_by_adjacency_list
| | \-structure_by_foreign_key
| | \-structure_by_modified_pre-order_tree_traversal
| | |-tags
COMMIT_EDITMSG
HEAD
ORIG_HEAD
config
description
index
packed-refs
tortoisegit.data
tortoisegit.index

虽然可能与我无关,但我已将git LFS安装到存储库中,并且大多数情况下是通过tortoisegit使用它的。

.git/HEAD的内容为空白(由Torek先生/女士要求)。对其进行调整以反映我在切换之前所处的原始分支会返回以下错误:

error: bad signature
fatal: index file corrupt

1 个答案:

答案 0 :(得分:2)

好的,第一部分是错误的HEAD文件,这并不奇怪,因为HEAD文件是最活跃的文件。撰写好的HEAD会使您随后抱怨索引文件不正确。

索引包含有关将要放入 next 提交的所有文件的信息。最初,这只是 current 提交中所有文件的副本。当您运行git add file时,会将文件的新版本(新内容)放入索引中。 1 如果文件本身是全新文件,则文件将进入索引中。第一次。 2

因此,索引通常是存储库中第二个最活跃的文件。但是,幸运的是,除非您git add编写了一些内容,然后用 other 内容覆盖了工作树中的内容,或者删除了工作树副本,否则您仍然有一个该数据在工作树中的副本。 (自从Git将提交提取到工作树中以来,您保留的文件在其他两个地方(即当前提交和工作树)具有良好的副本。 )

这意味着在大多数情况下,您可以简单地删除索引,然后让Git从当前提交中重建一个:

rm .git/index
git reset       # the default, equivalent to `git reset --mixed HEAD`

git reset创建一个全新的索引来替换刚刚删除的索引。新索引保存的文件与当前提交的文件相同,即您所有的git add工作都未完成。 3 但是只要工作树中的副本仍然可以,您可以再次git add将它们复制回 new 索引。


1 从技术上讲,内容本身作为松散对象进入存储库,而索引仅获取新对象的哈希ID。但是,效果就好像文件位于索引中一样。

2 如果文件在其他提交中,但不在当前提交中,则可能不是第一次 时间,但是发生的是索引获取一个新条目,而不是覆盖一些现有条目,这样也足够接近。

3 如果您在旧索引中的任何条目上设置了假定不变或跳过工作树位,这些位也将消失,但您可以在新索引上再次进行设置。 / p>