这是场景:我有一个本地git存储库,它反映了另一个源控制系统(一个专有的)的内容。我编写了一个脚本,定期将我的git分支与该系统的同一分支的最新副本同步(由另一个系统中的另一个术语调用,但在概念上类似)。
现在,假设在另一个系统中,有人从我正在同步的分支创建了一个分支,并开始对其进行攻击。我想要做的是下拉另一个分支的第一个版本,然后在最接近新分支的主分支的git版本中找到提交。如果我能做到这一点,我将知道主分支中的哪个提交作为这个新分支的父级。
这听起来像计算“树距”的问题。但是由于SHA1哈希没有距离度量,除了明显的手动深度搜索每个提交以找出哪个具有最多相似blob之外,还有另一种方法吗?
更新:见下文,找到了一种特定于域的方法。
答案 0 :(得分:2)
这样做的一个完整方法是针对每个候选分支创建补丁文件,看看哪个是最小的。
答案 1 :(得分:2)
感谢您的回答!
事实证明我对我的特定应用程序很满意。目标系统删除描述文件,该文件包含构成分支当前状态的文件和版本号。我提交这些,所以我可以找到所有这些这样的文件,并使用一个简单的评分系统来找出这些文件中的两个“相近”,正面分数意味着你的更新,负面意味着分支更新。与最接近零的分数配对找到与新分支最相似的提交。
我不打算将这个答案标记为最佳答案,因为它只适用于我的情况。
所有其他人,我浏览了git源代码并找到了match_trees.c。目前这是由子树合并策略使用的,但它有一个漂亮的score_tree()方法,可以为此目的显示给用户。
答案 2 :(得分:1)
比这更糟糕;在一般情况下,你必须计算斑点上的编辑距离,看看它们有多相似。
希望这是一个罕见的事件,我将克隆git存储库并开始回滚版本以找到最接近您希望复制的树的提交。考虑使用git bisect
会很好,但由于没有总排序而且没有good
或bad
的绝对概念,我不知道如何避免尝试每次提交
最小编辑距离也是NP难度,所以你在这里有一个真正的痛苦。
如果幸运的话,在其他系统中,您可以恢复创建新分支的日期和时间。那么也许你可以在那个时间戳之前抓住最后一次提交?
答案 3 :(得分:1)
为什么不在您的自己的分支中工作,并在需要提交时与主干合并?
听起来你可能需要一个Vendor Branch的解决方案。