撤销 Git Filter-Repo 并恢复已删除的仓库

5

我进行了git filter-repo操作,现在所有文件都被删除了。VS Code的git图表显示该仓库没有提交记录。有没有办法恢复我的仓库?我的整个项目都被删除了,而且它是一个本地仓库,所以我没有任何备份。我已经在上面工作了几个月了。这让我很痛苦,请帮帮我。我非常绝望。

在.filter-repo文件夹中,我有一个commit-map文件,其中包含以下内容:

old                                      new
2dcc8b30c4fb13d32f7b448c77a487de1a1d9bd5 0000000000000000000000000000000000000000
4e6915559685c96fe9dc336e1c929f129b603cbc 0000000000000000000000000000000000000000
8bf8d9d278523bf10d50b568eab1f8e5ac6cf8eb 0000000000000000000000000000000000000000
06a897ea4763c3f6034ccdd15e906580dda5f27b 0000000000000000000000000000000000000000
92e8933b223cd7e40bc80f9ac0a2853978bede3d 0000000000000000000000000000000000000000
0b7e2ade7c560078178cb66c0b3acd7d50b5fc10 0000000000000000000000000000000000000000
c296e3f6dd1cfcea8c3ec536c21d17112a9a0222 0000000000000000000000000000000000000000
8ce24d364c43023585109ef680dc2e4dadeeeff6 0000000000000000000000000000000000000000
e9614633a8463e3cdcf0a47206e0639a06aa7527 0000000000000000000000000000000000000000
66f3b8712aa57eaa396251dcc0f5f3285db5ff3b 0000000000000000000000000000000000000000
44442eace317b2b19063cc8c31ffe4a81d216ee7 0000000000000000000000000000000000000000
42877255047bf0376002b98173607a6a89bfab71 0000000000000000000000000000000000000000
54db7f7714302506a137c7b28bcb9a2bad7fc2b4 0000000000000000000000000000000000000000
0f3416c5c8fd3951d7e59a4d23db63f74b9383a3 0000000000000000000000000000000000000000
56379fdd472c102dd50691d9294d27da4b7c9a3d 0000000000000000000000000000000000000000
cc6bb41310efe3e5c2d0f58c956b3dcfd2b9e41a 0000000000000000000000000000000000000000
d7b1b929c943d923e91640b5bcdf49003c6f97cd 0000000000000000000000000000000000000000
f70375aae8340cccfb3c7db235e08464d9cfd1d8 0000000000000000000000000000000000000000
1dfe31b45b82aeb7ef514d81f26547736d60501a 0000000000000000000000000000000000000000
d19e2c4829a2c38c1a0c2adbe60e5a9ca70f7700 0000000000000000000000000000000000000000
7961c20ba12b49ef13996d34f5c4ac6038848418 0000000000000000000000000000000000000000
26ca13021b43c0b8b1b4e6a03948eb091ac6eb12 0000000000000000000000000000000000000000
f03d117ed04f449ae4f4ec1e61e895883acbe491 0000000000000000000000000000000000000000
f0d6ee7e4c778d28f65c864752f0e5cb80648fca 0000000000000000000000000000000000000000
5ce120582976dce9e8921c26adfdd7e5f23814c8 0000000000000000000000000000000000000000
818cd9397dbaa6278f0c33d9ce0ee5115c0c071b 0000000000000000000000000000000000000000
c4cd1317a269f9dc59ded0b9888754c6c205b711 0000000000000000000000000000000000000000

还需要一个ref-map文件,其中包含:

c4cd1317a269f9dc59ded0b9888754c6c205b711 0000000000000000000000000000000000000000 refs/heads/master

有没有办法可以恢复数据?情况非常糟糕,我简直要哭了。请帮忙!

编辑:我使用的命令如下:

D:\my_project>git filter-repo --force --subdirectory-filter back\ 
Parsed 27 commits
New history written in 0.53 seconds; now repacking/cleaning...
Repacking your repo and cleaning out old unneeded objects
Updating files: 100% (6161/6161), done.
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), done.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
Completely finished after 9.45 seconds.

D:\my_project>git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .idea/
        .vscode/
        front/

nothing added to commit but untracked files present (use "git add" to track)

D:\my_project>git log
fatal: your current branch 'master' does not have any commits yet

git reflog 返回 fatal: your current branch 'master' does not have any commits yet - rawm
你有回放你的案例所需的命令列表吗?我刚刚克隆了一个真正的repo,在其上运行了git-filter-repo与一些虚拟参数,但似乎仍能重构原始repo:地图文件中的许多条目未设置为零(尚不知道原因),而git show-ref显示git-filter-repo创建了许多refs/replaced/...以便进行恢复。(同时它的帮助文档建议使用--source--target以避免破坏现有的存储库...) - terrorrussia-keeps-killing
@terrorrussia-keeps-killing 我在问题中添加了我使用的命令。 - rawm
我不确定您是否已经运行了两次这些命令以将日志复制到您的问题中...但是,作为最后的手段,.git/objects的内容是否代表着有意义的东西?(包括infopack目录(其中包含.idx和.pack文件),可能有很多xx目录,这些目录可能没有被清理,但仍然包含git对象)--如果是这样,那么它们可能会用于恢复(或至少备份以便从中提取数据),但在非常低的级别上。我已经没有更多的想法了。 - terrorrussia-keeps-killing
@terrorrussia-keeps-killing 这个问题有没有解决办法?我需要一个答案,这样我才可以重新开始构建它。 - rawm
显示剩余15条评论
2个回答

0
据我从推荐此命令的帖子评论和其他论坛主题中了解到,似乎没有办法撤销这个操作(虽然我不是完全确定)。
无论如何,如果您使用的是IDE,那么IDE缓存了对文件所做更改的历史记录,并且您可以从中恢复。我知道Jetbrains IDE(PyCharm、IntelliJ、Clion)确实有这样的功能,昨天它救了我的命。
在Jetbrains IDE中执行此操作,选择“文件>本地历史记录>显示历史记录”,并在运行该命令之前还原快照即可。
这个答案对你来说肯定太晚了,但也许我可以为其他人挽回局面...

0

在当前仓库中调用 git-filter-repo 前获取原始仓库:

 git fetch . +refs/original/*:*
    

这将在当前目录中创建存储库的原始版本(例如 my_project)及其提交历史记录。将该存储库的源设置为远程存储库的 URL。

cd my_project
git log # should have complete git history before git-filter-repo
git remote add origin <remote repository url>

强制推送本地仓库以更新远程仓库:

git push -f

远程仓库现在应该已经恢复了提交历史和文件。您可能需要重新在本地克隆它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接