【问题标题】:git find commit from "working tree"git 从“工作树”中找到提交
【发布时间】:2018-03-01 22:34:13
【问题描述】:

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

我目前的想法是:

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

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

【问题讨论】:

    标签: git restore


    【解决方案1】:

    我愿意:

    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 获胜)。

    【讨论】:

    • 谢谢,这让我朝着正确的方向前进。 git diff 将打印/调用查看器。此外,看起来所有空格都已更改。所以我用echo "$rev" `git diff -w --shortstat "$rev" "_tmp_" >> ../diffs.txt 替换了这个命令,然后扫描并找到了插入/删除最少的那个。
    猜你喜欢
    • 1970-01-01
    • 2020-11-23
    • 2010-11-20
    • 2021-04-22
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2011-04-22
    相关资源
    最近更新 更多