【问题标题】:Can I change the username on a mercurial changeset?我可以更改 mercurial 变更集上的用户名吗?
【发布时间】:2010-10-18 11:36:25
【问题描述】:

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

【问题讨论】:

  • 查看以下文档。重写文档中涵盖的历史有很多缺点,因此通常不赞成。不过,这看起来是可能的。 - Editing History

标签: mercurial


【解决方案1】:

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

如果您已经发布了您的存储库,请考虑对您的用户的影响,mercurial wiki 有一些reasons not to edit history

通过将这些行添加到您的 .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 name”,进行更改,然后“$ hg convert --authors theFile myWrongLocalRep”。现在它生成“.-hg”文件,该网站说应该有“hg status”的东西,但我找不到任何东西(虽然有。我有错误的作者提交名称为'hh'所以我创建了一行'hh =hhh' 到文件,但在推送之后,现在更改并且在“$ hg update”和“$ hg push”之后,没有更改。我错过了什么?
  • 您可以检查作者/验证命令是否与此命令一起使用 $ hg log --template '{author}\n'|less,还没有得到它的工作 - 不了解 authormap 的东西。
  • 假设我想将“userA userA@gmail.com”更改为“userB userA@gmail.com”,将“useA userA@gmail.com”更改为“userA userA@gmail.com”。上面的语法是什么?我尝试了许多变体,但得到了许多不同的结果,不了解分隔符。
  • 这对我不起作用。它改写了整个历史,无论我是不是作者。之后变基失败。有没有办法只转换最近的、未推送的提交?
  • 如果您解释了“SOURCE”和“DEST”应该是什么,这也会有所帮助。路径?不幸的是,即使是 hg 的帮助也无法解释它们是什么。
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢,这对我来说效果很好。上帝,我喜欢 mercurial - 我真的喜欢,但是像这样的小事情在 hg 中往往比在 git 中更难。例如。在 git 中是 --reset-author。对于 hg,总是有很多像我们在这个线程中看到的解决方案,而且都是痛苦和困难的(除了你的)。谢谢!
【解决方案3】:

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

你就完成了。您的存储库仍被列为相关,因此您不会收到任何关于推送的投诉。

【讨论】:

  • 得到“中止:无法导入合并修订[修订号]
  • 为我工作。不过,我必须先将提交的状态从“已发布”更改为“草稿”。
  • 结束引号之前需要一个尾随/,否则perl 命令会产生错误Substitution replacement not terminated at -e line 1。否则完美,谢谢!
  • 很好的解决方案,很有帮助!
【解决方案4】:

我使用了histedit 扩展名,它允许我更改作者,而无需像“convert”那样创建新的存储库或诉诸“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 一起出现。副作用是提交的时间戳也会更新。

【讨论】:

  • 它似乎不起作用:“abandon: can only histedit a changeset及其所有后代”
猜你喜欢
  • 2011-07-05
  • 2018-02-23
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多