git://协议被公司阻止,如何解决?


188

尝试类似的操作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://协议而失败。有没有办法改变该命令的工作方式?


您有SSH访问权限吗?还是只是HTTP?
巴勃罗·圣克鲁斯

56
人们试图关闭git问题又是什么呢?根据常见问题解答,SO的范围包括“程序员常用的软件工具”。这里有六千多个git问题。他们属于这里。
卡斯卡贝尔2011年

9
您可以让Git在看到git:// URL时自动使用https://:git config --global url.https://.insteadOf git://
WildlyInaccurate 2014年

Answers:


426

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

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

由于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提供了一种使用重写URL的方法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匹配多个替换,则最长的匹配“获胜”。每个URL仅替换一次。

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

如果您是Linux Sysadmin,并且不想让用户经历上述麻烦,则可以对整个系统进行快速git配置更改。

只需将以下内容编辑或添加到其中/etc/gitconfig,您的用户就不必担心以上任何一项:

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

9
辉煌的简单!
兰斯·亨特2012年

很棒!没有更多的搜索和替换。构建脚本现在可以正常工作。这个答案节省了我很多时间。谢谢!
杰里米·贝尔

7
要稍微控制要转换的URL,还可以指定URL的一部分。例如:我有一个专用的内部服务器“ myserver.lan.example.com”,该服务器通过SSH(gitlab)托管git repos,但不托管HTTPS。因此,如果我想利用方便的密钥身份验证,就必须使用SSH。我也使用来自Github的仓库,但是我的公司防火墙阻止了SSH到Github。我不想简单地将所有'git://'实例替换为'https://',因为这会破坏gitlab。解决方法是git config --global url."https://github".insteadOf git://github
clayzermk1 2013年

2
我是从cygwin内部运行git的,唯一可以使它起作用的方法是对“系统管理员进行系统范围的更改”并添加“ url.https://.insteadof=git://”更改到“ C:\ Program Files(x86)\ Git \ etc \ gitconfig”文件。感谢您的提示!
Craig 2015年

3
要撤消此更改,您可以使用git config --global --unset url."https://".insteadOf
djskinner

29

Github也提供http(s)访问,这很可能被您的公司阻止。要告诉子模块使用它,可以执行以下操作:

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

实际上,这正是为什么init和update是单独的命令的原因-您可以初始化,自定义位置,然后进行更新。update --init只是当您不需要自定义任何URL时的快捷方式。

对于发生这种情况的其他任何人,您当然也可以使用ssh URL(如果您的公司阻止git://而不是ssh),但是在这种情况下,OP可能无法通过SSH访问远程仓库。


听起来这可能对我有用,尽管似乎我必须逐一逐一检查。如果重要的话,专门在做github.com/ajaxorg/cloud9
罗伯特

4
@Robert:如果有很多,您可以直接编辑配置文件并进行搜索和替换:sed -i 's@git://github@https://github@' .git/config
卡斯卡贝尔2011年

嗯,由于某种原因,他们在文件中说了http://,但是命令仍然尝试git://
Robert

1
我在OP中遇到了相同的问题,但是当我使用此解决方案时,它仍然会失败,但是会有稍微不同的错误。它显示“错误:访问https:// ...时致命:HTTP请求失败”是否有人对此有任何见识?我的房东有东西挡住吗?我的其他子模块更新正常,我只遇到一个麻烦。
Jo Sprague 2012年

13

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

参考:通过HTTPS端口使用SSH

从那篇文章:

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

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

之后,我能够成功git push到Github。在家里,您可以根据需要将ssh config更改回原来的方式。


7

我也有一段时间遇到同样的问题。然后,我尝试使用建议的命令更改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问题的远程URL 后,为我解决了。


1
我遇到了类似的问题。似乎设置全局仅影响以后克隆的存储库,并且不会追溯更改任何内容。
泰勒·埃德米斯顿,

2

扩展上面Nathan的答案,如果公司防火墙干扰https,您也可以尝试ssh协议。在我的情况下,防火墙阻止了git协议,重新为https发行了ssl证书,即使关闭了strict-ssl选项,这也为我打破了烦恼。您可以对ssh进行类似的URL重写,并按照github所述创建ssh密钥/对。

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

您还必须为git安装打开ssh-agent


1

这是因为节点服务器的GIT地址已更改,因此您现在必须输入:

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

祝好运


6
这个问题来自2月,当时上述是有效的URL。
罗伯特

@calccrypto,该链接是未代码标记的命令的一部分,并不意味着它是信息的链接。
Mike Precup

0

介绍

我将在此处添加我自己的方法(如果您具有支持https的可公开访问的git存储库,则不需要此方法)。

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

如何在家中推送公司资料库?

我已经在Google驱动器上创建了一个带有文件夹的存储库。除了git和https,您还可以将存储库作为路径。

在此处输入图片说明

因此,我不是推送到源,而是推送到“ gDrive”。这将导致文件夹从我的家庭工作站同步到Google驱动器,然后我的工作计算机将所做的更改拉出。另外,由于有时“ .git”目录中的文件不同步,因此我将该文件夹从“ trunk”临时重命名为“ trunk2”。这会强制将家用和办公计算机与Google驱动器100%同步。

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

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

  1. 从工作站git repo推送到Google驱动器中的文件夹。
  2. 通过临时重命名gDrive中的项目目录来强制100%同步。
  3. 通过某种远程方式访问家用计算机并推送更改。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.