如何使用Mercurial保存用户名和密码?

277

我在个人项目中使用了Mercurial,但每次想要推送到服务器时都需要输入用户名和密码。

我尝试将以下内容添加到我主目录下的.hgrc文件中,但似乎完全被忽略了。

[ui]
username = MY_USER_NAME
password = MY_PASSWORD

如何以正确的方式实现这个功能?

8个回答

336

你可以在你的.hgrcMercurial.ini文件中创建一个授权部分,如下所示:

[auth]
bb.prefix = https://bitbucket.org/repo/path
bb.username = foo
bb.password = foo_passwd

'bb'部分是一个任意标识符,用于将前缀与用户名和密码匹配 - 便于管理具有不同站点(前缀)的不同用户名/密码组合。

您也可以仅指定用户名,然后在推送时只需输入密码。

我还建议查看keyring扩展。因为它将密码存储在系统密钥环中而不是明文文件中,所以更安全。它在Windows上与TortoiseHg捆绑在一起,并且目前正在讨论在所有平台上分发它作为捆绑扩展的问题。


3
为什么当服务器是:ssh://HGSERVER时,它不能工作? 即使使用"ssh://username:password@HGSERVER"格式也不起作用。 - Oren
1
@Oren -- 看看下面的评论 -- 如果你正在使用SSH,为什么不使用基于密钥的登录呢? - David Eads
正如文本所说,“任意”标签仅用于将用户名和密码与前缀关联起来,因此请提供任何有意义的标记。 - Chris McCauley
我真的不建议以明文形式存储密码(即使这个答案也简要提到了更好的替代方案)。 - Jasper

170

有三种方法可以实现:使用.hgrc文件,使用ssh或使用keyring扩展


1. 不安全的方式-更新您的~/.hgrc文件

对我有效的格式(在我的~/.hgrc文件中)如下:

[ui]
username=Chris McCauley <chris.mccauley@mydomain.com>

[auth]
repo.prefix = https://server/repo_path
repo.username = username
repo.password = password


通过在唯一标识符前添加更多的前缀、用户名和密码三元组,您可以配置任意数量的存储库。

这仅适用于Mercurial 1.3,并且显然您的用户名和密码以明文形式存储,这样做并不好。


2. 安全的方法 - 使用SSH来避免使用密码

Mercurial完全支持SSH,因此我们可以利用SSH's ability to log into a server without a password - 您只需进行一次性配置即可提供自行生成的证书。 这是迄今为止最安全的方法,可以实现您想要的功能。


您可以在此处找到有关配置无密码登录的更多信息


3. Keyring扩展程序

如果您希望获得安全选项,但不熟悉SSH,请尝试这个。

来自文档...

该扩展程序会在第一次对给定远程存储库进行拉取/推送(就像默认情况下所做的那样)时提示HTTP密码,但会将密码(由用户名和远程存储库URL的组合键入)保存在密码数据库中。在下一次运行时,它会检查.hg/hgrc中的用户名,然后检查密码数据库中的合适密码,并在找到这些凭据时使用。

此处有更详细的信息


3
Satoru,Chris谈论的不是水银,而是SSH:可以设置SSH以使您无需使用密码进行身份验证(例如在此处描述:http://www.debian-administration.org/articles/152)。 - Tomislav Nakic-Alfirevic
4
方法2真的是处理事情安全并在远程系统上维护用户级权限的唯一方式。 - Peter Rowell
2
user570626的答案使用了密钥环集成,比这两个方法都要好得多。@Peter Rowell:如果你有几个用户和存储库,ssh设置真的很麻烦;你需要本地Unix用户,并且必须限制可以使用的命令,使用.ssh/authorized_keys和shell包装器。不是一个特别干净的解决方案。 - Draemon
6
  1. 有什么差别吗?我说的是他的解决方案更好而不是更快。
  2. 这与主机环境无关,纯粹是客户端(不像你的SSH解决方案需要在服务器端进行更改才能支持)。
  3. 忽略掉那些恶意评论和夸夸其谈的话,我仍然认为这不是一个干净的解决方案。你需要一个本地用户并给他们 shell 访问权限,然后限制它。shell访问权限并不总是明智的选择。我很惊讶有你这样经验的人还没有遇到过不想给你的服务 shell访问权限的系统管理员。
- Draemon
2
@Draemon:我猜我们的经验不同。就我个人而言,我不会在没有 shell 提示符的系统上工作。这使我完全依赖于其他系统已经安装了我需要的东西。我的一般经验是,如果我不能得到提示符,那么我几乎肯定无法获得其他我认为对我的工作流程至关重要的服务。不同的人有不同的偏好。 - Peter Rowell
显示剩余8条评论

65

没有人提到密钥环扩展。它会将用户名和密码保存到系统密钥环中,这比上面提到的在静态文件中存储密码要安全得多。执行以下步骤,你就可以顺利完成了。我在Ubuntu上做到这一点只用了大约2分钟。

>> sudo apt-get install python-pip
>> sudo pip install keyring
>> sudo pip install mercurial_keyring

**Edit your .hgrc file to include the extension**
[extensions]
mercurial_keyring = 

https://www.mercurial-scm.org/wiki/KeyringExtension


1
这是我最喜欢的解决方案。... 正如@hadrien所说,在执行了上述三个步骤后,它在Mac OS X系统下可以完美工作。 - ngeek
我也支持 @ngeek 支持我! - Hadrien
在Windows上,至少TortoiseHg支持keyring扩展:全局设置->扩展->mercurial_keyring。 - user272735
很不幸,目前在Windows上,密钥环扩展存在一个bug,只能一次保存一个密码。请参见此问题 - Laurens Holst
这似乎是最好的解决方案,但当我尝试在OSX上使用它时,Python在尝试从钥匙串中获取密码时崩溃。 - Isaac
显示剩余2条评论

30

一个简单的技巧是在您项目的.hg/hgrc文件中添加用户名和密码到推送URL:

[paths]
default = http://username:password@mydomain.com/myproject

(请注意这种方式会以明文存储密码)

如果您在同一域名下工作于多个项目,您可能希望在~/.hgrc文件中添加重写规则,以避免为所有项目重复此操作:

[rewrite]
http.//mydomain.com = http://username:password@mydomain.com

由于密码以明文形式存储,因此我通常只存储我的用户名。

如果您在Gnome下工作,我将在这里解释如何集成Mercurial和Gnome Keyring:

http://aloiroberto.wordpress.com/2009/09/16/mercurial-gnome-keyring-integration/


我已经下载了这个扩展,但是当我尝试进行推送时,密码提示框拒绝让我通过 :( 可能是我做错了什么。我以前从未使用过 Gnome Keyring。无论如何,谢谢大家。 - satoru
你可能想要在 hg push 命令中使用 --debug 和 --verbose 选项,以查看出现了什么问题... - Roberto Aloi
非常适合当前的情况...如果您正在使用ssh,您不需要输入密码...这就是密钥的作用。 - beauXjames
假设您有一个可以获取公钥的设备,当然这是一种奢侈。 - David Given

25

没有人向新手用户解释或澄清术语,他们会被这些术语弄糊涂。

.hg/hgrc - 这个文件用于版本库,位于本地/工作区位置或实际版本库的.hg文件夹中。

~/.hgrc - 这个文件与上面的那个不同。该文件位于用户主目录(~)下。

myremote.xxxx=..... bb.xxxx=......

这是在使用mercurial钥匙扩展时,在[auth]部分/指令下的一行。确保你在那里放置服务器名称与你使用"hg clone"时匹配,否则钥匙才会说找不到用户。下面的bb或myremote是你在执行"hg clone http:/.../../repo1 bb或myremote"时必须给出的“别名名称”,否则它将无法工作或你必须确保你本地存储库的.hg/hgrc文件包含相同的别名,即(你在最后一个参数中给出的hg clone ..)。

PS:以下链接提供了详细信息,对于快速编写的语法错误,请谅解。

例如,如果在~/.hgrc(Linux/Unix中的用户主目录)或Windows上的mercurial.ini文件中包含以下行,如果你执行

`"hg clone http://.../.../reponame myremote"`

如果你在~/.hgrc文件下的[extensions]部分添加了"mercurial_keyring ="或者"hgext.mercurial_keyring = /path/to/your/mercurial_keyring.py"这样的一行,则每个http仓库链接只需要输入一次用户凭据。

[auth]
myremote.schemes = http https
myremote.prefix = thsusncdnvm99/hg
myremote.username = c123456

我正在尝试找出如何设置PREFIX属性,以便用户可以克隆或执行任何Hg操作,而无需输入用户名/密码提示,并且不用担心在使用Hg仓库链接时提到的http://..../...中的服务器名称是什么。它可以是IP、服务器名称或服务器的FQDN


4

使用MacPorts在Mac OSX上安装mercurial_keyring:

sudo port install py-keyring
sudo port install py-mercurial_keyring

请将以下内容添加到 ~/.hgrc 文件中:
# Add your username if you haven't already done so.
[ui]
username = email@address.com

[extensions]
mercurial_keyring =

在运行这些命令并更新我的.hgrc文件后,我在TortoiseHg中收到“no module named mercurial_keyring”的错误提示。 - Dunc
请确保您拥有正确的Python版本,如此处所述:https://dev59.com/v1TTa4cB1Zd3GeqPv9bX - phm

2
如果您使用的是TortoiseHg,则必须执行附加屏幕截图中显示的这三个步骤,这会为您正在使用的特定存储库添加凭据。

enter image description here

要添加全局设置,您可以访问文件C:\users\user.name\mercurial.ini并添加这个部分。
[auth]
bb.prefix=https://bitbucket.org/zambezia/packagemanager
bb.username = $username
bb.password = $password

希望这有所帮助。

0

虽然它可能适用于您的情况,但我发现使用Putty的Pageant生成公钥/私钥非常有用。

如果您也在使用bitbucket (.org),它应该可以让您向用户帐户提供公钥,然后到达存储库的命令将自动得到保护。

如果Pageant在重新启动时没有启动,您可以将Pageant的快捷方式添加到Windows“开始菜单”中,并且该快捷方式可能需要填写“属性”,以包含您的私有(.ppk)文件的位置。

有了这个设置,Mercurial和本地存储库将需要设置为使用SSH格式进行推送/拉取。

这里是Atlassian网站上关于Windows或Mac/Linux的详细说明。

您不必相信我的话,毫无疑问还有其他方法。也许这里描述的步骤更适合您:

  1. 从“开始”菜单中启动PuttyGen:开始 -> PuTTY-> PuttyGen
  2. 生成一个新的密钥,并将其保存为.ppk文件,不要设置密码
  3. 使用Putty登录到您想要连接的服务器
  4. 将PuttyGen中的公钥文本追加到~/.ssh/authorized_keys文件中
  5. 从“开始”菜单中创建一个快捷方式,指向.ppk文件:开始 -> Putty to Start -> Startup
  6. 在启动菜单中选择.ppk快捷方式(这将在每次启动时自动发生)
  7. 在系统托盘中看到Pageant图标了吗?右键单击它并选择“New session”
  8. 在“主机名”字段中输入username@hostname
  9. 现在您将自动登录。

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