git://协议被公司阻止,我该如何解决这个问题?

时间:2011-02-03 20:45:51

标签: git github

尝试类似git clone git://github.com/ry/node.git之类的内容无效,会导致:

Initialized empty Git repository in /home/robert/node/.git/
github.com[0: 207.97.227.239]: errno=Connection timed out
fatal: unable to connect a socket (Connection timed out)

但是,通过HTTP克隆工作正常。到目前为止,我已经收集到这是协议的问题,但我正在尝试安装需要命令的cloud9

git submodule update --init --recursive

试图使用git://协议并失败。有没有办法改变命令的工作方式?

7 个答案:

答案 0 :(得分:419)

如果这是防火墙阻止git:protocol端口(9418)的问题,那么您应该进行更持久的更改,这样您就不必记住为每个git repo发出其他帖子建议的命令。< / p>

以下解决方案也适用于可能也使用git:protocol的子模块。

由于git消息并未真正指向防火墙阻塞端口9418,因此我们尝试将其诊断为实际问题。

诊断问题

参考文献:https://superuser.com/q/621870/203918https://unix.stackexchange.com/q/11756/57414

我们可以使用多种工具来确定防火墙是否导致我们的问题 - 使用系统上安装的任何一种。

# Using nmap
# A state of "filtered" against port 9418 (git) means
#   that traffic is being filtered by a firewall
$ nmap github.com -p http,git

Starting Nmap 5.21 ( http://nmap.org ) at 2015-01-21 10:55 ACDT
Nmap scan report for github.com (192.30.252.131)
Host is up (0.24s latency).
PORT     STATE    SERVICE
80/tcp   open     http
9418/tcp filtered git

# Using Netcat:
# Returns 0 if the git protocol port IS NOT blocked
# Returns 1 if the git protocol port IS blocked
$ nc github.com 9418 < /dev/null; echo $?
1

# Using CURL
# Returns an exit code of (7) if the git protocol port IS blocked
# Returns no output if the git protocol port IS NOT blocked
$ curl  http://github.com:9418
curl: (7) couldn't connect to host

好的,现在我们已经确定我们的git端口被防火墙阻止了,我们能做些什么呢?请继续阅读:)

基本网址重写

Git提供了一种使用git config重写网址的方法。只需发出以下命令:

git config --global url."https://".insteadOf git://

现在,好像通过魔术一样,所有git命令都会执行git://替换为https://

此命令做了哪些更改?

使用以下方法查看您的全局配置:

git config --list

您将在输出中看到以下行:

url.https://.insteadof=git://

通过查看~/.gitconfig,您现在可以看到已添加以下两行,您可以看到它在文件中的显示效果:

[url "https://"]
    insteadOf = git://

想要更多控制权?

只需在替换中使用更完整/特定的URL。例如,要仅让GitHub URL使用https://而不是git://,您可以使用以下内容:

git config --global url."https://github".insteadOf git://github

您可以使用不同的替换多次运行此命令。但是,如果URL匹配多个替换,则最长匹配“获胜”。每个网址只会进行一次替换。

系统管理员的系统范围更改

如果您是Linux系统管理员并且不希望用户必须经历上述困难,那么您可以在系统范围内快速进行git配置更改。

只需编辑或将以下内容添加到/etc/gitconfig即可,您的用户无需担心以上任何内容:

[url "https://"]
    insteadOf = git://

答案 1 :(得分:29)

Github也提供http(s)访问权限,不太可能被贵公司阻止。要告诉子模块使用它,您可以这样做:

git submodule init
git config submodule.<name>.url https://github.com/...
git submodule update

这实际上就是为什么init和update是单独的命令 - 你可以初始化,自定义位置,然后更新。 update --init只是您不需要自定义任何网址的快捷方式。

对于遇到此问题的其他任何人,您当然也可以使用ssh URL(如果您的公司阻止git://但不阻止ssh),但在这种情况下,OP可能没有SSH访问远程回购。

答案 2 :(得分:11)

另一个不涉及触摸git配置的选项是将ssh设置更改为使用端口443而不是常规22端口。

参考:Using SSH over the HTTPS port

从那篇文章:

edit the file at ~/.ssh/config, and add this section:

Host github.com
   Hostname ssh.github.com   
   Port 443

之后,我能够成功地向Github推送。在家里,你可以改变ssh配置,如果你想要的话。

答案 3 :(得分:6)

我有一段时间也有同样的问题。然后我尝试使用建议的命令更改git配置:

git config --global url."https://".insteadOf git://

,遗憾的是没有为我做的伎俩。我还有同样的问题!

最终解决了我的问题是,我使用以下命令重新设置了我的存储库的远程URL:

git remote set-url origin https://github.com/<my_user_name>/<my_repo_name>.git

之前是这样的:

git remote set-url origin git@github.com:<my_user_name>/<my_repo_name>.git

使用https://而非git@git.com设置远程网址后,问题已解决。

答案 4 :(得分:2)

扩展上述Nathan的答案,如果您的公司防火墙干扰了https,您也可以尝试使用ssh协议。在我的情况下,防火墙阻止了git协议,重新发布了https的ssl证书,这对我来说打破了bower,即使关闭了strict-ssl选项。您可以为ssh执行类似的url重写,并创建一个ssh密钥/对as described on github

 git config --global url."ssh://git@github.com".insteadOf git://github.com

你的git安装也需要turn on the ssh-agent

答案 5 :(得分:1)

这是因为节点服务器的GIT adresse已经改变,你现在必须输入:

git clone https://github.com/joyent/node

祝你好运

答案 6 :(得分:0)

简介

我将在这里添加我自己的方法(如果你有一个支持https的公共可访问的git存储库则不需要这样做。)

我在一家只能从公司内部访问git存储库的公司工作。但我也在家工作。

如何从家中推送到公司存储库?

我在google驱动器上创建了一个包含文件夹的存储库。除git和https外,您可以将存储库包含为路径。

enter image description here

因此,我不是推动原点而是推向“gDrive”。这导致文件夹从我的家庭工作站同步到谷歌驱动器,然后我的工作计算机拉动更改。此外,由于“.git”目录中的某些文件有时不同步,因此我暂时将文件夹重命名为例如“trunk”到“trunk2”。这会强制家庭和工作计算机100%与谷歌驱动器同步。

然后我通过checkpoint-vpn remote(或teamviewer)登录我的工作计算机,并将我的更新推送到work git存储库。

此外,该流程反之亦然,可以推送到被阻止的公司外部的git存储库。

  1. 从工作站git repo推送到google drive中的文件夹。
  2. 通过临时重命名gDrive中的项目目录强制100%同步。
  3. 通过某种远程访问家庭计算机并推送更改。