Git://协议被公司屏蔽,我怎样才能绕过它?

尝试像 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://协议,但是失败了。有没有办法改变这个命令的工作方式之类的?

93035 次浏览

Github 还提供了 http (s)访问,这种访问不太可能被你的公司屏蔽。要告诉子模块使用这个函数,可以这样做:

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

这就是为什么 init 和 update 是分开的命令——您可以 init、自定义位置,然后更新。update --init只是当您不需要自定义任何 URL 时的一个快捷方式。

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

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

基因克隆 https://github.com/joyent/node

祝你好运

如果您的防火墙阻塞了 git: protocol 端口(9418) ,那么您应该做一个更持久的更改,这样您就不必记得为每个 git 回购发出其他帖子建议的命令。

下面的解决方案也适用于可能也使用 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 端口被防火墙屏蔽了,我们能做些什么呢?继续读:)

基本 URL 重写

Git 提供了一种使用 git config重写 URL 的方法:

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 系统管理员,并且您不希望您的用户必须经历上述痛苦,那么您可以对整个系统进行快速的 git 配置更改。

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

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

如果您的公司防火墙正在干扰 https,那么您还可以尝试 ssh 协议。在我的例子中,防火墙阻塞了 git 协议,为 https 重新发放 ssl 证书,这对我来说是破坏 Bower,即使关闭了 stern-ssl 选项。您可以对 ssh 进行类似的 url 重写,并创建 ssh 键/对 就像 Github 上描述的那样

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

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

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

另一个不涉及到 git config的选项是通过 HTTPS 启用 SSH 连接。为此,可以将 SSH 设置更改为使用 HTTPS 端口443,而不是使用 SSH 连接的常规 SSH 端口22。

来自 GitHub 关于 通过 HTTPS 端口使用 SSH的文章:

编辑位于 ~/. ssh/config 的文件,并添加以下部分:

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

在这个改变之后,我能够成功地从 git push到 Github。

当您回到家中,您可以删除这个 SSH 配置更改恢复到默认设置。