比较包括所有分支的两个Git仓库

3
我有两个相同的Git仓库分支,我想检查它们是否完全相同,以便安全地删除其中一个而不会丢失任何信息。虽然我知道如何比较单个分支,但我想问是否有一种简单的方法可以比较所有分支、标签等。
3个回答

4

最快的方法是添加第二个远程仓库,然后比较每个 git ls-remote 的输出:

diff -u <(git ls-remote --refs origin) <(git ls-remote --refs other)

--refs选项会删除伪引用,例如HEAD,它可能在每个远程分支上指向不同的分支。

您甚至不需要将远程添加到本地检出中;您可以运行类似于git ls-remote https://github.com/username/repo.git的命令。

如果您看不到任何输出,则表示远程是相同的。如果您在差异中看到删除,则对应于origin上的分支,但不在other上;添加是在other上但不在origin上;修改是当该分支/标签存在于两者上但在每个上指向不同的提交时。


2
请注意,他的问题中的一部分:“因此可以安全地删除其中一个而不会丢失任何信息”无法通过这种简单的比较来回答。一个远程可能领先于另一个,这使得根据OP,“另一个”是安全可删除的,但这种简单的比较不会告诉您这一点,它只会告诉您它们确实不同。 - Lasse V. Karlsen
我甚至可以说,如果有任何不同之处,那么删除任何一个都不安全。这个问题只是询问它们是否相同,而不是知道哪一个领先于另一个;A 上的某些分支领先于 B,B 上的某些分支领先于 A,所以需要一些更深入的分析,例如 git branch --contains <commit-id> - cmbuckley

1
在仓库A中将仓库B作为远程添加,然后在A内从B获取。
$ git remote add B {local-path-or-url-of-B}
$ git fetch B

现在,B中存在的所有分支和标签也存在于A中,可以使用git branch -v查找本地分支并与远程分支(git branch -r -v)进行比较。
使用GUI Git客户端可以使比较更加容易。

--

目前,几乎所有在B中的内容也都在A中(存储库除外)。您可以使用rebase、merge、cherry-pick等方法将从B导入的分支和提交追加到A中存在的分支中(或反之亦然)。

您可以删除B存储库,但不要删除AB远程,直到您确定需要在A中使用的B中的所有内容都可以使用A的标签或分支访问。


0

这取决于你说的“等等”具体是什么意思——它举例来说不能帮助你处理钩子、.git/config以及一般不涉及引用之外的任何事情——但比较两个仓库中 git show-ref 命令的输出结果可能是检测它们是否不同的简单方法。


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