Git - 如何处理相同的存储库但不同的协议(http和ssh)

时间:2016-10-31 20:58:23

标签: git http ssh

在我的工作中,有关于SSH连接的限制。您只能在公司网络中访问,否则您必须处理HTTP和系统凭据。

因此,当我在家工作时,我无法通过SSH。好吧,我添加了一个名为“http”的遥控器,指的是同一个存储库,但通过HTTP协议。

所以有时候在家里,当我推送/获取或某些,git状态镜头我有一些提交转发源/分支但不是真的,这只是我推动感谢HTTP协议和SSH(原点)可以'在家里使用。

我该如何处理?

1 个答案:

答案 0 :(得分:2)

我不确定我推荐这个想法,但随时尝试它,因为它可能会起作用。但是,我没有对这种情况进行测试(我怀疑一些写得不好的shell脚本可能会遇到异常命名空间设置问题,尽管运气好的话,所有Git自己的内部工作都在这里工作)。

背景

远程背后的一般概念是它是较长URL的简称。这里讨论的网址是ssh://...http://...(或https://...,这可能会更好。)

作为一个重要的便利,每个遥控器还提供了一组远程跟踪分支。最常见的是,我们只有一个名为origin的遥控器,因此我们所有的远程跟踪分支都被命名为origin/masterorigin/develop,依此类推。这隐藏了这些远程跟踪分支的整个name space(计算机科学/信息学术语)这一事实。 (命名空间有时是连字符,或者有时写成两个单词或只写一个单词:它们都意味着相同的东西。)

您添加了第二个远程http,因此现在您有两个名称空间,其中包含两个远程跟踪分支,例如origin/masterhttp/master 。除了两个(显然)不同的遥控器originhttp实际上是相同的系统之外,这没什么大不了的。

因此,我们在这里可能希望将两个名称空间折叠回单个名称空间。让我们使用origin,因为那是原始的,可能是你经常使用的那个(尽管最终并不重要)。如果我们可以说服Git更新origin/master而不是http/master,即使我们从名为http的远程提取和/或推送时,Git也会更新正确的远程跟踪分支。

事实证明,我们可以使用与每个遥控器关联的fetch配置行完成

配置Git

使用不会对文件进行Unicode-ize的编辑器打开您的.git/config文件,或者如果您愿意,可以使用git config执行所有这些配置项。 (运行git config --edit让Git启动常规编辑器。)查看现有的两个[remote]部分,您会看到:

[remote "origin"]
    url = ssh://...
    fetch = +refs/heads/*:refs/remotes/origin/*

[remote "http"]
    url = http://...
    fetch = +refs/heads/*:refs/remotes/http/*

这两行fetch行控制从remote-name到remote-trackig分支名称的映射。如果您将http替换为originrefs/remotes/http/*fetch的远程“http”,Git将开始使用refs/remotes/origin命名空间。

要使用git config而不是编辑器执行此操作,只需运行:

$ git config remote.http.fetch '+refs/heads/*:refs/remotes/origin/*'

然后,您可能希望删除所有旧的http名称:

$ git branch -r -d http/master

另外,请确保您的本地分支机构跟踪origin/*而不是http/*。使用git branch -vv查看每个本地分支的跟踪分支。 (跟踪信息存储在同一个.git/config文件中 - 现在应该很明显如何在编辑器中更改它 - 但如果您愿意,可以使用git branch --set-upstream-to进行更新。)您可以解决此问题任何时候,在删除远程跟踪分支之前或之后。