代码之家  ›  专栏  ›  技术社区  ›  gavenkoa

检查两个git存储库是否无关的简单方法是什么?

git
  •  0
  • gavenkoa  · 技术社区  · 7 年前

    检查两个git存储库是否无关的简单方法是什么?

    例如,假设我们克隆了以下存储库:

    我怎样才能确认一个人和另一个人共享部分历史?如何浏览常见的DAG和查看差异?

    注意:Git允许浅拷贝+存储库历史可以随着时间而变化。。。

    3 回复  |  直到 7 年前
        1
  •  3
  •   zigarn    7 年前

    您可以克隆第一个,然后将第二个作为附加远程添加:

    git clone https://github.com/spring-petclinic/spring-framework-petclinic
    cd spring-framework-petclinic
    git remote add other https://github.com/spring-projects/spring-petclinic
    git fetch --all
    

    然后可以浏览两个DAG:

    git log --graph --all --oneline --decorate
    

    通过观察两条主干线的合并基部,看看它们是否有共同的历史:

    git merge-base origin/master other/master
    
        2
  •  1
  •   torek    7 年前

    1

    正如你所注意到的,要证明他们是很难的 联合国

    git rev-list --all


    给定一个统一的哈希函数 谁的射程是 r=|{h(k)| 1 k 2 p=1/r . 唯一性的概率是这个的补充 . 概括到 n 1+x 对于 x 1个 体育课 (-n(n-1))/2r r 相当大。

    160 =146150163733092918203684832716283019655932542976。这满足我们的公式,这意味着我们可以使用近似值。

    因此,如果您将哈希的总数相加 并将其插入公式中:

    r=1461501637330902918203684832716283019655932542976
    1 - exp(-n*(n-1)/(2*r))
    

    你得到了碰撞的可能性。当然,要检查实际的冲突,您只需比较底层的实际对象:如果哈希匹配,则直接比较对象以检测冲突。但它是 一开始不太可能。如果我们取两个包含一千万个提交的存储库,我们计算:

    $ bc -l
    r=2^160
    n=10*1000*1000
    scale=100
    1 - e(-n*(n-1)/(2*r))
    .0000000000000000000000000000000000342113848680412753525884397196522\
    895097282878872708411144841034243
    

    你可以看到它还是很小的。直到我们到达:

    n=10*1000*1000*1000*1000*1000*1000*1000
    

    (十个六分种物体,使用短比例尺表示法)

    我们发现:

    1 - e(-n*(n-1)/(2*r))
    .0000342108030863093209851036344159518189002166758764416221121344549\
    079733424124497666779807175655625
    

    n=100*1000*1000*1000*1000*1000*1000*1000
    1 - e(-n*(n-1)/(2*r))
    .0034152934013810288444649336362559390942558976421984312395097770719\
    923433072593638116228277476790795
    

    1 - e(-n*(n-1)/(2*r))
    .2897326871923714506502211457721853341644126909116947422293621066225\
    555385326652788789421475224989232
    

    r 256

    (我正在使用 bc ^ 是指数和 -l e(x) 计算 e .)

        3
  •  0
  •   gavenkoa    7 年前

    要查找任何常见修订:

    comm -12 <(cd repo1; git rev-list --all | sort) <(cd repo2; git rev-list --all | sort)
    

    在我的例子中,两个存储库共享提交:

    bash# (cd spring-petclinic; git rev-list --all) | wc -l
    670
    
    bash# (cd spring-framework-petclinic; git rev-list --all) | wc -l
    571
    
    bash# comm -12 <(cd spring-framework-petclinic/; git rev-list --all | sort) <(cd spring-petclinic; git rev-list --all | sort) | wc -l
    427