我可以更改汞变更集上的用户名吗?

我没有在我的开发计算机上设置用户名,并做了一些提交。我是否可以追溯性地更改用户名,以便弄清楚是谁提交了这些变更集?

22277 次浏览

如果您还没有发布您的存储库,那么这应该不会太难。您需要使用 转换分机 to Mercurial,它将允许您“筛选”现有的存储库以创建一个新的存储库。Author 开关允许您在过滤每个提交时编辑作者。

如果您的 发布了您的存储库,请考虑对您的用户的影响,多变的 wiki 有一些 不编辑历史的理由

通过将这些行添加到. hgrc 中来启用扩展:

[extensions]
hgext.convert=

编写一个文件将旧名称映射到新名称(authors.Convert.list) :

user@ubuntu=real.name@my.example.com

运行转换:

hg convert --authors authors.convert.list SOURCE DEST

我刚刚检查过,它对我有效:)。

我尝试了几种不同的方法(包括 转换扩展,我发现它创建了一个不相关的存储库)。我发现 使用 MQ 编辑历史记录的 Mercurial wiki 指令是最有帮助的。(当然,编辑任何 众所周知历史记录通常都是个坏主意,但只有您拥有的本地变更集可以编辑)。

我将在这里总结关键的步骤,并阐明更改作者的机制。假设第一个错误的作者提交是在修订版 BAD(当然您还没有在任何地方发布您的更改) ,您应该能够执行以下操作(我假设您是在存储库根目录) :

通过将其添加到 $HOME/. hg/hgrc 来启用 MQ

[extensions]
hgext.mq=

将最近的变更集转换为补丁:

$ hg qimport -r BAD:tip

(现在可以在 .hg/patches找到它们)

“取消应用”所有补丁(假设它们已经被应用,然后反转它们) ,以便在 BAD之前使存储库进入修订状态:

$ hg qpop -a

如果你查看你的补丁,你会发现作者被编码在所有补丁的一种注释行中:

$ grep User .hg/patches/*
.hg/patches/102.diff:# User Firstname Lastname <f.lastname@oops.wrongurl.example.com>

现在使用您最喜欢的搜索/替换工具来修复补丁(我在这里使用 Perl)。假设您希望提交名称为 f.lastname@righturl.example.com:

$ perl -pi -e 's/f\.lastname\@oops\.wrongurl\.example\.com/f.lastname\@righturl.example.com/' .hg/patches/*.diff

现在检查您是否成功地更改了作者姓名,然后重新应用补丁:

$ hg qpush -a

然后将应用的补丁转换为适当的变更集:

$ hg qfinish -a

你完成了。你的仓库仍然被列为相关的,所以你不会得到任何关于推送的抱怨。

我已经使用了 histedit扩展,它允许我改变作者,而不必像“转换”会或诉诸于“ mq”新的回购协议。

首先,在 Mercurial 配置文件中,确保用户名设置正确,并启用 histedit 扩展名:

[ui]
username = Your Name <your.name@domain.org>


[extensions]
histedit =

然后,如果你想修改40版,使用:

hg histedit -r 40

在出现的文件中,对应于修订本40的行中,将单词 pick改为 edit。保存并关闭文件。

现在,hg commit。您需要重新输入提交消息并保存。

最后,hg histedit --continue

提交将随新的 username一起出现。一个副作用是提交的时间戳也会更新。

如果您有一个 单身输出变更集,有一个非常简单的方法可以做到这一点:

$ hg ci --amend --user "My Name <mymail@example.org>" -X "**"

如果没有任何本地更改,则可以省略 -X "**"选项。