2011-04-21 59 views
2

是否可以确定我可以安全地从新的远程仓库中提取,即两个仓库共享一个共同的祖先?我正在编写一个程序,可以自动克隆和更新大量的git,hg等存储库,并且我想无缝地处理远程存储库移动到新URL的情况。看来,git将允许我从任何远程拉,可能会产生巨大的冲突。 Svn拥有存储库uuid来确定您是否可以切换到新的url。我意识到git是分布式的,并且意味着可以轻松分叉,所以uuid并没有什么意义,但是git中有没有类似的功能?如何确定远程git仓库是否“安全”从

回答

3

您可以将add and fetch the remote branch存储到您的存储库中,而无需将其合并到您的历史记录中。然后,您可以测试一下,看看是否有使用git merge-base

git remote add test-remote [email protected]:/path/to/repo.git 
git remote update 
git merge-base test-remote/master master || echo "No common ancestors!" 
+0

谢谢!看起来我需要更多地检查“低级别”git命令:) – 2011-04-23 19:09:06

0

git中的“pull”仅仅是一个“获取”,然后是“合并”到当前分支。当你这样做,有没有共享祖先远程的Git“取”,你会得到这样的警告:

警告:没有共同的承诺

你应该能够做到从URL中提取,然后检测这个来自该操作输出的消息。

+1

此消息是否是获取不相关历史记录的可靠指示器很大程度上取决于确切的使用情况。特别是,该消息不会出现重复获取相同的不相关历史记录(除非本地存储库在提取之间被“清除”)。由于远程追踪分支的头部在获取期间将使用“有/无”协商,所以在通过定义的远程获取(即,获取远程追踪分支而不是仅追入FETCH_HEAD)时,尤其如此。 – 2011-04-21 03:27:55

1

我认识了Git是分布式的,意思是容易forkable,所以UUID并没有真正意义上的共同祖先,但没有任何可比性功能/功能在Git?

相反,git作为分布式版本控制系统非常有用的部分原因是,每个提交都有一个唯一定义该提交及其完整历史的ID。 (这些是您看到的与git中的提交相关联的哈希值,正确地称为“对象名称”。)提交已被提取或推送到哪个存储库并不重要,它仍表示与树完全相同的状态以及完全相同的历史记录,包括作者身份等。

从你的问题来看,我不太清楚你是否想知道(a)是否有任何共同祖先或(b)是否有历史记录分支A完全包含分支B的历史(即,将A合并成B将是“快进”)。

如果您在(a)之后,那么Brian Campbell's answer就是您想要的,即基本上测试git merge-base test-remote/master master是否成功返回。另一方面,如果你在(b)之后,那么你应该测试git merge-base test-remote/master master的输出是否与git rev-parse --verify master相同。

+0

我想我可能想坚持(a),因为用户可能已经修改了本地回购协议,以避免快速转发可能,但感谢您的详细解释! – 2011-04-23 19:08:04