从“工作树”中查找提交的Git命令

3
假设一个人克隆了一个git存储库并删除了.git文件夹。有没有办法恢复他们所在的提交?这不是Best way to restore .git folderCan deleted .git be restored?的重复,因为多年以来发生了这件事情。我现在正在尝试将其还原到git中,以便将其更新为新版本。但是,在这些年中可能已经引入了更改,我需要将其合并 / rebase 到新版本上。
我的当前想法是:
1. 使用git clone --bare从github克隆当前仓库到另一个文件夹 2. 使用git config --local --bool core.bare false将仓库标记为非裸仓库 3. 将神秘版本的文件复制到此文件夹中 4. 在某个地方保存工作树与当前提交哈希的差异 5. 将HEAD更新为HEAD^(不确定如何执行此步骤而不修改工作树。可能切换回裸仓库,checkout HEAD^然后再切换回非裸仓库?我也读过 git symbolic-ref plumbing ,但不知道如何使用它) 6. 重复步骤4-5直到到达根目录 7. 选择最小尺寸的差异。那应该是这段代码分叉时的很好近似。在该提交周围搜索确切的分歧点。
有更好的方法吗?有一个 semver,但它没有经常更新,因此仅将范围缩小到一两年左右。我不认为存储库有太多变化,所以我猜测存在精确匹配的文件。也许我可以使用这些信息来缩小可能的提交?谢谢!
2个回答

4
我会这样做:
  1. 将实际源代码提交到某个分支(例如 _tmp_),以使索引保持清洁。

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

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

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


谢谢,这让我朝着正确的方向前进了。git diff将打印/调用查看器。此外,似乎所有的空格都被更改了。因此,我用echo "$rev" `git diff -w --shortstat "$rev" "_tmp_" >> ../diffs.txt替换了命令,然后扫描并找到了插入/删除最少的那个。 - jgawrych

2
我有同样的需求,但我需要检查的工作树还包含修改,因此我在ensc的答案基础上构建了一个脚本,自动化查找差异最小的提交过程。
该脚本可在https://github.com/deribaucourt/git-find-worktree获取。

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