【问题标题】:git:// protocol blocked by company, how can I get around that?git:// 协议被公司阻止,我该如何解决?
【发布时间】:2011-06-20 23:06:36
【问题描述】:

尝试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?
  • 人们试图关闭 git 问题是怎么回事?根据FAQ,SO的范围包括“程序员常用的软件工具”。这里有超过六千个 git 问题。他们属于这里。
  • 你可以让 Git 在看到 git:// URL 时自动使用 https://:git config --global url.https://.insteadOf git://

标签: git github


【解决方案1】:

如果这是您的防火墙阻止 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 端口被防火墙阻止了,我们能做些什么呢?继续阅读:)

基本 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://

【讨论】:

  • 效果很好!没有更多的搜索和替换。构建脚本现在就可以工作了。这个答案为我节省了很多时间。谢谢!
  • 为了更好地控制转换哪个 URL,您也可以指定 URL 的一部分。例如:我有一个私有内部服务器“myserver.lan.example.com”,它通过 SSH (gitlab) 托管 git repos,但不是 HTTPS。因此,如果我想利用方便的密钥身份验证,我必须使用 SSH。我也使用来自 Github 的 repos,但我的公司防火墙阻止了 SSH 到 Github。我不想简单地用 'https://' 替换所有 'git://' 实例,因为那样会破坏 gitlab。解决方案是git config --global url."https://github".insteadOf git://github
  • 这在 Windows 8 中不起作用。我观察到该命令没有在磁盘中设置值。对于 --list 操作它将打印。但是如果你去 /etc/gitconfig 文件它不会有变化。需要登录 bash shell 并手动编辑文件,然后尝试 bower install....然后它会工作。
  • 我从 cygwin 内部运行 git,我可以让它工作的唯一方法是为系统管理员做“系统范围的更改”并添加 'url.https://.insteadof =git://' 更改为 'C:\Program Files (x86)\Git\etc\gitconfig' 文件。感谢您的提示!
  • 要撤消此更改,可以使用git config --global --unset url."https://".insteadOf
【解决方案2】:

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,如果这很重要。
  • @Robert:如果有很多,你可以直接编辑配置文件并搜索替换:sed -i 's@git://github@https://github@' .git/config
  • 嗯,出于某种原因,他们在文件中说 http://,但命令仍然尝试 git://
  • 我遇到了 OP 中描述的相同问题,但是当我使用此解决方案时,它仍然失败,但错误略有不同。它说“错误:访问 https://... 致命:HTTP 请求失败” 有人对此有任何见解吗?我的主机是否阻止了什么?我的其他子模块更新正常,我只有一个有问题。
【解决方案3】:

另一个不涉及 git config 的选项是更改 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

之后,我能够成功地 git push 到 Github。在家里,您可以根据需要将 ssh 配置改回原来的样子。

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 我遇到了类似的问题。似乎设置全局只影响未来克隆的 repos,并且不会追溯更改。
    【解决方案5】:

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

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

    您还必须 turn on the ssh-agent 进行 git 安装。

    【讨论】:

      【解决方案6】:

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

      git 克隆https://github.com/joyent/node

      祝你好运

      【讨论】:

      • 这个问题是从 2 月份开始的,当时上面是有效的 URL。
      • @calccrypto 该链接是未标记代码的命令的一部分,并不意味着是信息链接。
      【解决方案7】:

      简介

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

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

      如何从家里推送到公司仓库?

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

      所以,我不是推到原点,而是推到“gDrive”。这会导致文件夹从我的家庭工作站同步到谷歌驱动器,然后我的工作计算机提取更改。此外,由于有时“.git”目录中的文件不同步,因此我暂时重命名该文件夹,例如“树干”到“树干2”。这会强制家庭和工作计算机与 Google Drive 100% 同步。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-01
        • 2014-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-21
        • 2013-09-22
        • 1970-01-01
        相关资源
        最近更新 更多