如何确定远程git回购是否为;“安全”;退出

如何确定远程git回购是否为;“安全”;退出,git,Git,是否可以确定我可以安全地从一个新的远程存储库中提取,即两个存储库共享一个共同的祖先?我正在编写一个程序,自动克隆和更新大量git、hg等存储库,我希望无缝地处理远程存储库移动到新URL的情况。看来git将允许我从任何遥远的地方撤出,这可能会造成巨大的冲突。Svn有存储库uuid来确定是否可以切换到新url。我意识到git是分布式的,并且易于分叉,因此uuid并没有真正意义,但是git中是否有任何类似的特性/功能?git中的“pull”只是一个“fetch”,然后是一个“merge”到当前分支中。

是否可以确定我可以安全地从一个新的远程存储库中提取,即两个存储库共享一个共同的祖先?我正在编写一个程序,自动克隆和更新大量git、hg等存储库,我希望无缝地处理远程存储库移动到新URL的情况。看来git将允许我从任何遥远的地方撤出,这可能会造成巨大的冲突。Svn有存储库uuid来确定是否可以切换到新url。我意识到git是分布式的,并且易于分叉,因此uuid并没有真正意义,但是git中是否有任何类似的特性/功能?

git中的“pull”只是一个“fetch”,然后是一个“merge”到当前分支中。当您在没有共享祖先的远程设备上执行git“fetch”时,会收到以下警告:

警告:没有常见的提交

您应该能够从URL中提取消息,然后从该操作的输出中检测该消息。

您可以将其保存到存储库中,而无需将其合并到历史记录中。然后,您可以测试是否有任何共同的祖先使用

我意识到git是分布式的,并且易于分叉,所以uuid并没有真正的意义,但是git中是否有类似的特性/功能

相反,git作为分布式版本控制系统如此有用的部分原因是,每个提交都有一个唯一定义该提交及其完整历史的ID。(这些是您在git中看到的与提交相关联的散列,通常称为“对象名称”。)提交从哪个存储库获取或推送到哪个存储库并不重要,它仍然表示完全相同的树状态和完全相同的历史,包括作者身份等

从你的问题中我不太清楚你想知道的是(a)是否有共同的祖先,还是(b)分支a的历史是否完全包含分支b的历史(即,将a合并到b将是一个“快进”)

如果您在(a)之后,那么这就是您想要的,即基本上测试
git merge base test remote/master
是否成功返回


另一方面,如果您在(b)之后,那么您应该测试
git merge base test remote/master master
的输出是否与
git rev parse相同——验证master

此消息是否是获取不相关历史的可靠指示器在很大程度上取决于确切的使用场景。特别是,对于相同的不相关历史记录的重复回迁,不会显示该消息(除非在回迁之间“清理”了本地存储库)。当通过定义的远程抓取时尤其如此(即,抓取到远程跟踪分支而不是仅仅抓取到FETCH_HEAD),因为远程跟踪分支的头将是抓取过程中使用的“想要/拥有”协商的“拥有”实体。我想我可能要坚持(a)由于用户可能已经修改了本地回购协议,因此无法进行快进,但感谢您的详细解释!谢谢看起来我需要进一步检查“低级”git命令:)
git remote add test-remote foo@bar:/path/to/repo.git
git remote update
git merge-base test-remote/master master || echo "No common ancestors!"