我没有在我的开发计算机上设置用户名,并做了一些提交。我是否可以追溯性地更改用户名,以便弄清楚是谁提交了这些变更集?
如果您还没有发布您的存储库,那么这应该不会太难。您需要使用 转换分机 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(当然您还没有在任何地方发布您的更改) ,您应该能够执行以下操作(我假设您是在存储库根目录) :
BAD
通过将其添加到 $HOME/. hg/hgrc 来启用 MQ
[extensions] hgext.mq=
将最近的变更集转换为补丁:
$ hg qimport -r BAD:tip
(现在可以在 .hg/patches找到它们)
.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:
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”新的回购协议。
histedit
首先,在 Mercurial 配置文件中,确保用户名设置正确,并启用 histedit 扩展名:
[ui] username = Your Name <your.name@domain.org> [extensions] histedit =
然后,如果你想修改40版,使用:
hg histedit -r 40
在出现的文件中,对应于修订本40的行中,将单词 pick改为 edit。保存并关闭文件。
pick
edit
现在,hg commit。您需要重新输入提交消息并保存。
hg commit
最后,hg histedit --continue。
hg histedit --continue
提交将随新的 username一起出现。一个副作用是提交的时间戳也会更新。
username
如果您有一个 单身输出变更集,有一个非常简单的方法可以做到这一点:
$ hg ci --amend --user "My Name <mymail@example.org>" -X "**"
如果没有任何本地更改,则可以省略 -X "**"选项。
-X "**"