我可以在商业变更集上更改用户名吗?


73

我没有在开发计算机上设置用户名,而是进行了一些提交。我是否可以追溯更改用户名,以便清楚是谁提交了这些更改集?


签出以下文件。重写文档中介绍的历史记录有很多弊端,因此通常会皱眉。但是,这似乎是可能的。-编辑历史
戴夫ķ

Answers:


84

如果您尚未发布存储库,那么这应该不太困难。您需要使用Convert扩展为Mercurial,这将使您“过滤”现有存储库以创建一个新存储库。使用--authors开关,您可以在过滤每个提交时编辑其作者。

如果您发布存储库,请考虑对用户的影响,Mercurial Wiki有一些不编辑历史记录的原因

通过将以下行添加到.hgrc来启用扩展名:

[extensions]
hgext.convert=

编写一个文件以将旧名称映射为新名称(authors.convert.list):

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

运行转换:

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

我刚刚检查了一下,它对我有用:)。


@Andrew Aylett:您是如何检查的?“ $ hg clone myWrongRep名称”,进行更改,然后“ $ hg convert --authors theFile myWrongLocalRep”。现在它生成了“ .-hg”文件,该站点说应该有“ hg status”的东西,但我什么都找不到(尽管有。我输入了错误的作者提交名称“ hh”,所以我创建了一行“ hh” = hhh'到文件,但是在推送之后,现在进行更改,并且在“ $ hg update”和“ $ hg push”之后,没有变化,我还缺少什么?
hhh

您可以检查作者/验证命令是否可以与此命令一起使用$ hg log --template '{author}\n'|less,尚未使它起作用-不了解authormap-东西。
hhh

假设我要将“ userA userA@gmail.com”更改为“ userB userA@gmail.com”,将“ useA userA@gmail.com”更改为“ userA userA@gmail.com”。上面的语法是什么?我尝试了许多变体,但是得到了许多不同的结果,而不是了解分隔符。
hhh

4
那对我没用。无论我是不是作者,它都重写了整个历史。之后,重新设置失败。有没有一种方法可以只转换最近未推送的提交?
东武

7
如果您解释了“ SOURCE”和“ DEST”应该是什么,也将有所帮助。路径?不幸的是,即使是hg的帮助也无法解释它们的含义。
Thomas Tempelmann

17

如果你有一个单一的传出变更,有一个很简单的方法来做到这一点:

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

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


谢谢,对我来说效果很好。天哪,我确实很喜欢,我确实很喜欢,但是像这样的小事情在hg中比在git中更难。例如。在git中是--reset-author。对于hg,总是有很多解决方案,就像我们在此线程中看到的一样,所有解决方案都是痛苦而艰难的(尽管您的除外)。谢谢!
亚历克斯

14

我尝试了几种不同的方法(包括Convert Extension,我发现它创建了一个不相关的存储库)。我发现使用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

这样就完成了。您的存储库仍被列为相关存储库,因此您不会对推送有任何抱怨。


“中止:无法导入合并修订版[修订版号]
Meetai.com

1
为我工作。不过,我必须首先将提交的状态从“已发布”更改为“草稿”。
user2428118 2014年

/在结束引号之前需要尾随,否则perl命令产生错误Substitution replacement not terminated at -e line 1。否则完美,谢谢!
ederag

1
很好的解决方案,非常有帮助!
亚历山大·K

11

我使用了histedit扩展名,该扩展名使我可以更改作者,而无需进行新的回购,例如“ convert”或求助于“ mq”。

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

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

[extensions]
histedit =

然后,如果要更改版本40,请使用:

hg histedit -r 40

在出现的文件中,与修订40对应的行上,将单词更改pickedit。保存并关闭文件。

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

最后, hg histedit --continue

提交将与您的new一起出现username。副作用是提交的时间戳也会被更新。


它似乎不起作用:“放弃:只能将变更集及其所有后代一起进行编辑”
Thomas LAURENT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.