假设一个人克隆了一个git仓库并删除了.git文件夹。有没有办法恢复他们所在的提交?这不是Best way to restore .git folder或Can deleted .git be restored?的副本,因为从这个事件以来已经过去了 * 年 *。我现在尝试把它放回git下更新到一个新的版本。然而,在那些年里可能已经引入了一些变化,我需要将其合并/重定基到新版本上。
我目前的想法是:
1.使用git clone --bare
将当前仓库从github克隆到另一个文件夹
1.使用git config --local --bool core.bare false
将存储库标记为非裸
1.将文件从神秘版本复制到此文件夹中
1.将工作树与当前提交哈希值的差异保存到某个位置
1.将HEAD更新为HEAD^(不确定如何在不修改工作树的情况下完成这一步。可能切换回bare,checkout HEAD^切换回non-bare?我也读过git symbolic-ref plumbing,但不知道如何使用它)
1.重复步骤4-5,直到到达根位置
1.选择大小最小的diff。这应该是此代码偏离的提交的近似值。在该提交周围搜索准确的偏离点。
有更好的方法吗?有一个semver,但是它没有更新太多,所以它只把范围缩小到大约一两年。我不相信仓库有太多的变化,所以我猜有确切的匹配文件。也许我可以使用这些信息来缩小可能的提交?谢谢!
2条答案
按热度按时间gopyfrb31#
我会做:
1.将实际的源代码提交到某个分支(例如
_tmp_
),这样索引就干净了1.遍历所有可能的提交(例如
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
获胜)。ltqd579y2#
我也有同样的需求,但我必须检查的工作树也包含修改,因此我在ensc的答案上构建了一个脚本,它自动化了查找提交的过程,使差异最小。
其可用价格为https://github.com/deribaucourt/git-find-worktree。