gpt4 book ai didi

git - 如何删除 Git 树中 sha1 为空的条目

转载 作者:太空狗 更新时间:2023-10-29 12:50:37 28 4
gpt4 key购买 nike

我继承了一个 git 存储库,其中树中的提交条目为空 sha1,阻止 FishEye 为存储库编制索引。

$ git fsck
Checking object directoriies: 100%(256/256), done.
warning in tree db22a67df70dc4ff90ec4cd666da91e9c2cb0d9:
contains entries pointing to null sha1
Checking objects: 100% (416532/416532), done.
Checking connectivity: 416532, done.

寻找给定的树给我以下结果:

$ git ls-tree db22a6
100644 blob e615f18b55a39f2719112ce209c2505dd92d8e75 .gitignore
100644 blob ac852f06c5a04420356c1d5efca44d9a864e78b0 .project
160000 commit 0000000000000000000000000000000000000000 SomeDirectory
100644 blob 631c17e28026261a2ccf6bc570842cf4af9f181c GoDeploy.bat
100644 blob 40e992ab5c3868af2910135c3ac4610c3646e7f8 pom.xml

回顾历史,我发现 SomeDirectory 最初是一个 git 子模块,似乎导致问题的提交是删除了 .gitmodulesSomeDirectory。现在,在罪魁祸首所在的位置有一个名为 SomeDirectory 的真实目录。
虽然我仍然可以尝试修复运行 git filter-branch 以查看我最终会得到什么,但它不起作用:

$ git filter-branch --force --index-filter \
$ 'git rm --cached --ignore-unmatch SomeDirectory' \
$ --prune-empty --tag-name-filter cat -- --all
[... striped out for clarity]
Rewrite c571a3ec94e9f84471577bac41ac7375c729ef08 (76/18522)error:
cache enttry has null sha1: SomeDirectory
fatal: unable to write new index file
Could not initialize the index
[... striped out for clarity]

我知道在导致问题的提交之前没有我知道的备份,接下来我应该尝试什么。

最佳答案

您收到的消息表明只有一棵树有一个错误的子模块。在这种情况下,您几乎不需要清理。您可以创建一个没有此问题的新固定树:

$ git ls-tree db22a67df70dc4ff90ec4cd666da91e9c2cb0d9 |> sed -e '/0\{40\}/d' |> git mktree(new tree SHA1 here)

您的问题已经显示了 git ls-tree 输出。 sed 删除带有错误子模块的行,git mktree 从结果中创建一个新的树对象。

一旦有了固定树,就可以使用这棵树创建固定提交:

$ git cat-file commit c571a3ec94e9f84471577bac41ac7375c729ef08 |> sed 's/db22a67df70dc4ff90ec4cd666da91e9c2cb0d9/(new tree SHA1 here)/' |> git hash-object -t commit -w --stdin(new commit SHA1 here)

git cat-file commit c571a3ec94e9f84471577bac41ac7375c729ef08 以文本形式打印有问题的提交对象。它将以 tree db22a67df70dc4ff90ec4cd666da91e9c2cb0d9 开始,然后继续提交信息的其余部分(父、作者、提交者、提交消息)。 sedtree 行对旧树的引用替换为新树。 git hash-object -t commit -w --stdin 根据结果创建一个新的提交对象,将其写入存储库,并打印其 ID。

一旦你有了固定的提交,你就可以使用git replace:

$ git replace c571a3ec94e9f84471577bac41ac7375c729ef08 (new commit SHA1 here)

这实际上并没有改变任何东西,但是告诉 Git 每当它读取提交 c571a3ec94e9f84471577bac41ac7375c729ef08 时,它应该读取新的提交对象。

最后,使用 git filter-branch 使其永久化。这会遍历所有提交,读取它们并将它们写回。通常,如果没有任何修改提交的选项,这不会有太大影响,但由于较早的 git replace,这会导致所有以 c571a3ec94e9f84471577bac41ac7375c729ef08 作为父项的提交被重写以引用新的提交,所有引用那些被重写的提交,等等。

关于git - 如何删除 Git 树中 sha1 为空的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24183847/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com