git 从 "working tree" 中找到提交

git find commit from "working tree"

假设某人克隆了一个 git 存储库并删除了 .git 文件夹。有没有办法恢复他们正在进行的提交?这不是 Best way to restore .git folder or Can deleted .git be restored? 的重复,因为自此事件以来 已经过去。我现在正在尝试将其恢复到 git 以将其更新到新版本。但是,那些年可能已经引入了更改,我需要 merge/rebase 到新版本。

我目前的想法是:

  1. 使用 git clone --bare
  2. 将当前存储库从 github 克隆到另一个文件夹
  3. 使用 git config --local --bool core.bare false
  4. 将回购标记为非裸
  5. 将神秘版的文件复制到此文件夹
  6. 在某处保存工作树与当前提交哈希的差异
  7. 将 HEAD 更新为 HEAD^(不太确定如何在不修改工作树的情况下执行此步骤。可能会切换回裸机,结帐 HEAD^ 切换回非裸机?我还阅读了 git symbolic-ref 管道但不知道如何使用它)
  8. 重复步骤 4-5 直到到达根目录
  9. 选择尺寸最小的差异。这应该是此代码偏离的提交的一个很好的近似值。在该提交周围搜索确切的分歧点。

有没有更好的方法?有一个 semver,但更新不多,所以它只将范围缩小到一两年左右。我不相信存储库有太大变化,所以我猜有完全匹配的文件。也许我可以使用该信息来缩小可能的提交范围?谢谢!

我会做:

  1. 将实际来源提交到某个分支(例如 _tmp_),以便索引干净

  2. 迭代所有可能的提交(例如git rev-list master)并检查差异

    git rev-list master | while read rev; do git diff "$rev" "_tmp" && echo "it is $rev!" done

    _tmp_ 包含存储库中未跟踪的文件时,git diff 永远不会成功,您必须分析差异(例如,最低 wc -l 获胜)。