我必须编写一个脚本来自动从一个 mercurial repo 中提取。无论如何我可以执行一个hg pull -u
包括在同一命令中传递请求的用户名和密码的操作吗?我知道有一个交互方法是默认行为,我不想将用户名和密码保存在 hgrc 或其他地方,因为它将被多个用户使用,所以有没有办法通过传递用户名和密码命令行?我尝试proc_open
在 PHP 中使用,但效果不如标准输入。
5 回答
我找到了两个解决方案:
1. 明确提供 URL,包括完整凭据:
hg pull -u https://user:pass@host/path
2. 使用 --config 提供凭据,使用 * 作为前缀(来自 Victor 的回答):
hg pull -u --config auth.x.prefix=* --config auth.x.username=user --config auth.x.password=pass
解决方案 2 特定于存储库。做
[auth]
x.prefix = *
x.username = USERNAME
x.password = PASSWORD
使其适用于所有存储库。此外,如果你把它放在“~/.hgrc”中并给予 600 的权限,你就不必使用 HGRCPATH 技巧。把它留在那里。
在命令行上传递密码是不安全的,因为其他用户可以看到它使用ps
和类似的。你应该做的是:
hg
与您返回的管道进行通信proc_open
。您需要仔细解析 Mercurial 的输出,并将用户名和密码输入标准输入。将 Mercurial 运行为:hg --config ui.interactive=yes
确保它会和你说话——否则我担心它会检测到没有 TTY 并且根本不会提示你。
编写一个带有
[auth]
section的临时配置文件。它看起来像这样:[auth] x.prefix = output of "hg paths default" x.username = USERNAME x.password = PASSWORD
(
x
不重要,它可以是任何东西。)确保文件只能由您运行脚本的用户读取。然后设置HGRCPATH
环境变量指向该文件并执行 Mercurial。完成后删除文件!
命令服务器有一个libhg PHP 库,但我在该库中看不到任何有关拉取或克隆的用户名或密码的信息。该库正在进行中,但当它更成熟时,我建议使用它。但是目前,上述方法应该可以帮助您。
那行得通:
hg --config auth.rc.prefix=http://host/ --config auth.rc.username=user --config auth.rc.password=password pull -u http://host/full/path/to/repo
您也许可以--config
像这样使用开关来执行此操作:
hg --config auth.username=USERNAME --config auth.password=PASSWORD pull -u
我个人从未这样做过,但希望这会有所帮助。