在我的工作中,有关于SSH连接的限制。您只能在公司网络中访问,否则您必须处理HTTP和系统凭据。
因此,当我在家工作时,我无法通过SSH。好吧,我添加了一个名为“http”的遥控器,指的是同一个存储库,但通过HTTP协议。
所以有时候在家里,当我推送/获取或某些,git状态镜头我有一些提交转发源/分支但不是真的,这只是我推动感谢HTTP协议和SSH(原点)可以'在家里使用。
我该如何处理?
答案 0 :(得分:2)
我不确定我推荐这个想法,但随时尝试它,因为它可能会起作用。但是,我没有对这种情况进行测试(我怀疑一些写得不好的shell脚本可能会遇到异常命名空间设置问题,尽管运气好的话,所有Git自己的内部工作都在这里工作)。
远程背后的一般概念是它是较长URL的简称。这里讨论的网址是ssh://...
和http://...
(或https://...
,这可能会更好。)
作为一个重要的便利,每个遥控器还提供了一组远程跟踪分支。最常见的是,我们只有一个名为origin
的遥控器,因此我们所有的远程跟踪分支都被命名为origin/master
,origin/develop
,依此类推。这隐藏了这些远程跟踪分支的整个name space(计算机科学/信息学术语)这一事实。 (命名空间有时是连字符,或者有时写成两个单词或只写一个单词:它们都意味着相同的东西。)
您添加了第二个远程http
,因此现在您有两个名称空间,其中包含两个远程跟踪分支,例如origin/master
和http/master
。除了两个(显然)不同的遥控器origin
和http
实际上是相同的系统之外,这没什么大不了的。
因此,我们在这里可能希望将两个名称空间折叠回单个名称空间。让我们使用origin
,因为那是原始的,可能是你经常使用的那个(尽管最终并不重要)。如果我们可以说服Git更新origin/master
而不是http/master
,即使我们从名为http
的远程提取和/或推送时,Git也会更新正确的远程跟踪分支。
事实证明,我们可以使用与每个遥控器关联的fetch
配置行完成。
使用不会对文件进行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
替换为origin
行refs/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
进行更新。)您可以解决此问题任何时候,在删除远程跟踪分支之前或之后。