在git代理密码中如何转义@字符

106

我有一个git代理配置,格式为'http.proxy=http://userId:pwd@123@ipaddress:port',但是在克隆远程项目时,出现了以下错误:

Cloning into git...
error: Couldn't resolve proxy '123@ipaddress' while accessing http://git.kernel.org/pub/scm/git/git.git/info/refs

fatal: HTTP request failed

如何在密码中转义 '@' 字符?

请注意:我无法更改密码。

5个回答

199

如果你在代理URL中传递密码,我建议尝试使用@符号的URL编码值(%40):

http.proxy=http://userId:pwd%40123@ipaddress:port

1
这对我很有帮助。你应该分别对名称和密码部分进行URL编码。这将帮助你避免任何特殊字符的问题。例如,可能会出现“:”符号,这也会导致问题。 - Stalinko
2
当您的用户名中包含“@”时,例如使用电子邮件地址作为用户名时,这也非常棒。 - ramdesh
非常感谢您在经过两天的努力后解决了我的问题...真的很难找到这种问题的原因。 - lleiou
你好。有没有 URL 编码值的列表,以便我可以保存并在需要时查阅? - Raul Chiarella
显示剩余2条评论

79

注(2013年11月)

对URL进行编码(尤其是密码中的任何特殊字符)是正确的解决方案。
下面提到的.netrc仅用于远程repo url,而不适用于用于解析所述远程repo url的代理。

关于该编码,请参见“百分号编码”:

百分号编码,也称为URL编码,是一种在某些情况下对统一资源标识符(URI)中的信息进行编码的机制。虽然它被称为URL编码,但实际上它更普遍地在主要的统一资源标识符(URI)集合中使用,其中包括统一资源定位符(URL)和统一资源名称(URN)。因此,它也用于准备应用程序/x-www-form-urlencoded媒体类型的数据,因为它经常用于在HTTP请求中提交HTML表单数据。

百分号编码后的保留字符:

!   #   $    &   '   (   )   *   +   ,   /   :   ;   =   ?   @   [   ]
%21 %23 %24 %26 %27 %28 %29 %2A %2B %2C %2F %3A %3B %3D %3F %40 %5B %5D

原始回答 (2011年5月)

两个评论:

  • 使用http(而不是https)访问服务器需要密码是很奇怪的,因为密码在客户端和服务器之间的通信过程中没有加密;

  • 您可以在$ HOME中设置一个.netrc(对于Windows是_netrc),并具有以下内容

    machine ipaddress:port
    login userId
    password pwd@

Git 在幕后使用的 curl 可以很好地处理编码,无论是否有 @


感谢您的回答。服务器是网络驱动器,只有我和其他两个开发人员会使用。因此,我认为没有必要进行加密。我会尝试使用netrc。 - Karthik
@Karthik:这将允许您简单地使用http://123@ipaddress:port/...作为克隆地址,而无需添加用户和密码信息。 - VonC

12

你需要对特殊字符进行百分号编码 | 编码。例如,不要写成:

http://user:Pa@s@http-gateway.domain.org:80

你写下这句话:

http://user:Pa%40s@http-gateway.domain.org:80

所以@会被替换为%40

11

对任何不寻常字符进行URL编码。

URL编码列表。

@ character is %40

在我的 git 配置文件中,我仅仅编码了用户名,比如说:

https://myemail%40gmail.com@myrepo.org/api.git


7
例如,您的密码存储在环境变量 GIT_PASSWORD 中,用户名为 GIT_USERNAME,那么:
git clone http://${GIT_USERNAME}:$(echo -n $GIT_PASSWORD | hexdump -v -e '"x" 1/1 "%02X"' | tr x %)@repository.git

解释:echo -n $GIT_PASSWORD | hexdump -v -e '"x" 1/1 "%02X"' | tr x %

  1. 打印密码:$GIT_PASSWORD <- hello
  2. 将'hello'转换为十六进制:hello <- x68x65x6Cx6Cx6F
  3. 将每个'x'更改为'%': x68x65x6Cx6Cx6F <- %68%65%6C%6C%6F

在解释的第一点中,您是不是想使用$GIT_PASSWORD而不是$GIT_REPOSITORY? - Ninju Bohra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接