代码之家  ›  专栏  ›  技术社区  ›  Carel

切换分支时机器崩溃

git
  •  2
  • Carel  · 技术社区  · 7 年前

    我的机器出故障时正在换树枝。从本质上讲,Android Studio(大概是Gradle做了一些同步工作),iTunes和Chrome在Windows决定要进行病毒扫描(我看到了通知,观看了机器冻结,然后上床睡觉)时,竞相消耗尽可能多的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安装到了Respository中,并且主要通过TortoiseGit与之合作。

    内容 .git/HEAD 空白(Torek先生/女士要求)。调整此项以反映切换之前打开的原始分支,返回以下错误:

    error: bad signature
    fatal: index file corrupt
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   torek    7 年前

    好的,第一部分不好 HEAD 文件,这并不奇怪 头 文件是最活跃的。写一篇好文章 头 给你带来了关于一个坏索引文件的后续投诉。

    索引包含有关将要放入 下一个 承诺。最初,这只是 现在的 承诺。当你奔跑 git add file 将文件的新版本(新内容)放入索引。 一 如果文件本身是全新的,那么文件将第一次进入索引。 二

    因此,索引通常是 第二 -存储库中最活跃的文件。但是,你很幸运,除非你 git add 编辑了一些内容,然后用 其他 内容或删除了工作树副本,您在工作树中仍然有该数据的副本。(自git提取提交后保持不变的文件 进入之内 你的工作目录有一个很好的副本 二 其他地方,即当前提交和工作树。)

    这意味着在大多数情况下你可以 去除 索引,然后让Git从当前提交中重新生成一个:

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

    这个 git reset 创建一个全新的索引来替换刚刚删除的索引。新索引与当前提交保存相同的文件,即 Git添加 工作没有完成。 三 但只要工作树中的副本仍然正常,您就可以 Git添加 再把它们复制回 新的 索引。


    一 从技术上讲,内容本身作为一个松散的对象进入存储库,索引只获取新对象的散列ID。然而,其效果就像文件在索引中一样。

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

    三 如果在旧索引中的任何条目上设置了“假定不变”或“跳过工作树位”,那么这些条目也会消失,但您可以在新索引中重新设置它们。