67

是否可以将 git 配置为仅对特定域使用代理?

我想使用我们的公司代理来访问 Github,但不要使用它来访问我们自己的内部 git 存储库。

我正在使用凉亭,它需要在我们的防火墙和 github 上都需要项目,所以我不能将其作为每个项目设置来执行。它需要是某种全局配置选项。有什么想法吗?

4

7 回答 7

74

要添加另一种可能性,您可以通过git config http.proxy.

git config --global http.proxy http://mydomain\\myusername:mypassword@myproxyserver:proxyport

但真正整洁的是,从 git1.8.5 (October 2013) 开始,您可以为每个 url 设置 http 设置

http.*现在可以根据配置应用的 URL 指定“ ”变量。
例如,

[http]
   sslVerify = true
[http "https://weak.example.com/"]
   sslVerify = false

http.sslVerify仅在与该指定站点交谈时才会关闭。


请参阅提交 d4770964d5

$ git config --bool --get-urlmatch http.sslVerify https://good.example.com
true
$ git config --bool --get-urlmatch http.sslVerify https://weak.example.com
false

<section>指定后,您可以获得该部分中所有变量的列表,其值适用于给定的 URL。例如

$ git config --get-urlmatch http https://weak.example.com
http.sslverify false

所有细节都在提交 6a56993b中:

http.<url>.*::

上面的任何 http.* 选项都可以选择性地应用于某些 url。
对于匹配 URL 的配置键,配置键的每个元素都会与 URL 的元素进行比较,顺序如下:

  • 方案(例如,https在 中https://example.com/)。
  • 主机/域名(例如,example.com在 中https://example.com/)。
  • 端口号(例如,8080在 中http://example.com:8080/)。
  • 路径(例如,repo.git在 中https://example.com/repo.git)。
  • 用户名(例如,userin https://user@example.com/repo.git

上面的列表按优先级递减排序;与配置键路径匹配的 URL 优先于与其用户名匹配的 URL。
例如,如果 URL 是https://user@example.com/foo/bar的配置键匹配,https://example.com/foo则将优先于 的配置键匹配https://user@example.com

在尝试任何匹配之前,所有 URL 都会被规范化(密码部分,如果嵌入在 URL 中,出于匹配目的始终会被忽略),以便简单拼写不同的等效 url 将正确匹配。

环境变量设置总是覆盖任何匹配项
匹配的 url 是直接提供给 Git 命令的那些。
这意味着由于重定向而+访问的任何 URL 都不参与匹配。

于 2013-09-10T07:00:35.357 回答
67

我通常使用环境变量:

  • http_proxy=http://username:password@proxydomain:port
  • https_proxy=http://username:password@proxydomain:port

这是在访问 GitHub 存储库时由 git 获取的。

笔记:

  • 两者都http_proxy必须https_proxy使用http://代理的 url (no https://)。
  • 始终使用(不要依赖其短名称)的fqn(全限定名)proxydomain

但是对于内部仓库,我所要做的就是定义并导出另外一个环境变量:

  • no_proxy=.my.company,localhost,127.0.0.1,::1myrepo.my.company, 用于访问具有类似localhost的地址的任何 repo 。

你可以定义NO_PROXYor no_proxy,没关系。

但以防万一,我总是设置HTTP_PROXY, HTTPS_PROXY, http_proxy, https_proxy,NO_PROXYno_proxy.

于 2013-04-17T20:43:35.217 回答
39

正如一些人在这里提到的,您可以通过指定 URL 和代理设置来做到这一点,但这是为我解决此问题的用例。感谢上面的VonC!

请注意,下面我指定了 Git 服务器的根目录。您克隆的 git 存储库的完整路径不是必需的。您可以使用单个条目来处理整个服务器。

将以下内容添加到您的 .gitconfig 文件中。在我的 Windows 系统上,我正在使用 %userprofile%\.gitconfig

[http]
    proxy = http://my.proxy.net:8080
[https]
    proxy = http://my.proxy.net:8443
[http "http://my.internalgitserver.com/"]
    proxy = ""
于 2017-01-12T22:05:44.537 回答
16

您可以专门为每个遥控器调整各种配置选项。假设我们有 2 个遥控器,分别命名为originupstream。您为每个执行以下操作调整代理:

git config --path remote.origin.proxy http://user:pass@proxy_for_origin:8080
git config --path remote.upstream.proxy http://user:pass@proxy_for_upstream:8080

这将更改本地存储库配置 ( .git/config) 中每个远程的部分。

如果您愿意,您还可以调整全局配置选项。由于在全局配置文件 ( ) 中引用远程名称没有意义$HOME/.gitconfig,因此您可以使用url 匹配(IIRC,自 Git 1.8.5 起支持)。例子:

[http "https://example.com/repo1.git"]
    proxy = http://user:pass@proxy1:8080
[http "https://example.com/repo2.git"]
    proxy = http://user:pass@proxy2:8080

如果您想查看已设置的内容:

git config --path --get-urlmatch https://example.com/repo1.git
git config --path --get-urlmatch https://example.com/repo2.git
于 2016-02-17T12:04:48.277 回答
8

假设您的代理(如我的ss)是:socks5://127.0.0.1:1086

配置 git 代理

  • 对所有人
    • 添加git config --global http.proxy socks5://127.0.0.1:1086
    • 删除git config --global --unset http.proxy
  • 仅适用于特定域,例如:https ://github.com
    • 添加git config --global http.https://github.com.proxy socks5://127.0.0.1:1086
    • 删除git config --global --unset http.https://github.com.proxy

笔记

添加代理后,使用

cat ~/.gitconfig

可以看到相关的全局配置:

[http]
        proxy = socks5://127.0.0.1:1086

或者

[http "https://github.com"]
        proxy = socks5://127.0.0.1:1086
于 2020-02-13T10:01:49.293 回答
1

我有一个类似的问题,我在我的公司代理后面。我基本上有两种存储库:

  1. 外部 - 需要代理
  2. 内部 - 不需要代理

我必须在全局配置中设置一个代理,如果本地配置中没有另外指定,它将作为默认值。

下面是配置命令:

使用代理设置全局配置

git config --global --add http.proxy "http://username:password@proxydomain:port"
git config --global --add https.proxy "https://username:password@proxydomain:port"

然后移动到包含 .git 文件夹且不需要代理的本地目录

cd "C:\Users\username\directory_without_proxy\"

使用空代理设置本地配置

git config --local --add http.proxy ""
git config --local --add https.proxy ""

也可以通过其他方式完成。也就是说,您使用代理设置将全局配置保持为空和本地配置。

仔细检查一下,您可以使用以下命令分别列出全局和本地的配置设置:

git config --global --list
git config --local --list
于 2019-07-22T11:01:41.907 回答
-1

在 Windows 上,只需 [note without password] 以下对我有用

git config --global http.proxy http://mydomain\\myusername:@myproxyserver:proxyport

git config --global https.proxy http://mydomain\\myusername:@myproxyserver:proxyport
于 2015-04-30T06:44:52.573 回答