git - 查找对象属于哪个提交?

标签 git

我正在调试由硬盘驱动器故障引起的 git 存储库损坏的情况。我有

>git fsck --full
fatal: loose object 25e9d8d2deb964c3da0f86f60bbd5a23e8387349 (stored in
.git/objects/25/e9d8d2deb964c3da0f86f60bbd5a23e8387349) is corrupt

>git show 25e9d8d2deb964c3da0f86f60bbd5a23e8387349
fatal: loose object 25e9d8d2deb964c3da0f86f60bbd5a23e8387349 (stored in
.git/objects/25/e9d8d2deb964c3da0f86f60bbd5a23e8387349) is corrupt

现在,我想了解有关该对象的一些信息 - 它是什么,它属于哪里? (哪个文件夹,哪个提交?)

当我尝试调查其存储的对象时,我得到:

>git show e9d8d2deb964c3da0f86f60bbd5a23e8387349
fatal: ambiguous argument 'e9d8d2deb964c3da0f86f60bbd5a23e8387349': unknown revision or
path not in the working tree. Use '--' to separate paths from revisions

我应该如何进行?

我有一份今天早些时候的存储库副本,但我不想仅仅丢弃我的本地更改 - 我更愿意看看是否可以修复该存储库,或者只是丢弃单个提交。

附注- 我发现了几个关于“松散对象”问题的线程,但没有任何关于如何调查/解决的具体说明,无论是在我确实在另一个存储库中找到损坏对象的备份的情况下,还是在没有损坏对象的情况下该对象的备份。

附注2 - 奇怪的是,gitk --all 运行良好并且不关心这种损坏状态。

最佳答案

消息“loose object 25e9d8d2deb964c3da0f86f60bbd5a23e8387349”已经告诉您该对象的确切哈希值;它是25e9d8d2deb964c3da0f86f60bbd5a23e8387349。 Git 只是通过将前两个字符拆分为单独的目录来组织子目录中的对象。因此该对象存储在 /25/e9d8d2deb964c3da0f86f60bbd5a23e8387349 中,但这并没有改变它的标识符是完整的哈希值。

因此,您只需要使用git show 25e9d8d2deb964c3da0f86f60bbd5a23e8387349。然而,由于对象已损坏,这会失败,因此没有真正的方法来恢复它。

然而,好消息是“松散对象”意味着没有任何东西指向它,因此如果您的存储库在其他方面都很好,您将不需要该对象。

Oddly enough, gitk --all works well and doesn't care about this corrupt state.

gitk – 以及来自 Git 的几乎所有其他用户命令 – 只查看可从 HEAD 或其他命名引用(分支、标签)访问的对象。因此,如果有一个松散对象,则没有任何东西指向它,尤其是 HEAD 或另一个命名引用都没有指向它,并且不会出现错误。

关于git - 查找对象属于哪个提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9368967/

相关文章:

git - 你什么时候会使用 .git/info/exclude 而不是 ~/.gitignore (core.excludesFile) 来排除文件?

linux - 将子文件夹移出到新存储库中

混帐获取 : Cannot allocate memory

git - 为什么 git 不显示我的文件已修改?

Gitignore 不忽略文件夹

python - Heroku django 没有这样的应用程序

git - 动态 git 配置 user.name - 取决于主机名

Git merge 驱动程序 - 文件属性

git - 智能 : Viewing diff of all changed files between local and a git commit/branch

merge 提交的 git 显示