18

当我的团队刚开始使用 SVN 时,我们都只是在提交存储库时使用了我们的名字,但是,现在我们的团队已经成长,我们遇到了问题,因为我们刚刚雇佣了第二个Mike.

我们想做的是将每个人的用户名更改为与他们计算机上的用户名相同(名字首字母+姓氏)。我看到的问题是 SVN 历史仍然会在提交时显示旧用户名。

是否有一种工具可以在整个存储库历史中更改用户名?

例如,我希望当前归因于 Mike 的每个提交都更改为 msmith,一直回到修订版 1。

我的第一个想法是我将不得不对转储文件进行一些解析和处理,但是一个工具会很好。

4

7 回答 7

21

您可以使用svndumptool

svnadmin 转储路径/to/my/repo > repo.dump

svndumptool transform-revprop svn:author originalregexp newvalue repo.dump newrepo.dump

于 2009-08-27T15:46:21.467 回答
13

TortoiseSVN对此功能有很好的支持:在其修订日志对话框中,可以按作者过滤(甚至通过正则表达式),根据需要从过滤列表中选择修订(通常都像这个问题一样)并从上下文中选择“编辑作者”菜单。

当然,在 jeroenhs 的回答中提到的有一个pre-revprop-change 钩子的前提条件仍然适用。

处理相当慢,但根据需要,这可能仍然更快和/或更方便,然后必须转储整个存储库并使用脚本处理这些潜在的巨大转储文件。

于 2009-11-04T17:44:18.163 回答
12

就在这里:

svn propset --revprop -r revision_number svn:author new_username

但是,svn 默认情况下不允许更改修订属性。您需要为此设置一个pre-revprop-change 挂钩脚本。在 Windows 上,将一个 bat 文件放在存储库的 hooks 文件夹中就足够了,该文件夹仅包含一行:

exit 0

如果已设置,您应该能够根据需要编写脚本。

编辑:我没有对此进行测试,但我认为这应该在 PowerShell 中解决问题:

([xml] ( svn log --xml )).log.logentry 
   | ? {$_.author -eq "Mike"} 
   | foreach {svn propset --revprop -r $_.revision svn:author msmith}
于 2009-07-28T16:57:51.120 回答
7

在存储库服务器上,您可以:

echo -n "msmith" > msmith.txt
svn log /svn -q | grep '^r[0-9]* | Mike |' | cut -f 1 -d' ' | xargs -n1 svnadmin setrevprop /svn svn:author msmith.txt -r

这就是这样做的:

  1. 将新用户名存储在末尾没有换行符的文件中(echo -n)
  2. 在 /svn 中获取存储库的完整日志,仅显示摘要信息(而不是日志消息)(svn log -q)
  3. 使用 Mike (grep) 查找行。注意:在大多数情况下,类似grep Mike这样的事情就可以了,但是如果您有一个名为 Jul 的用户,您可能会更新 7 月所做的每个提交(或多或少的风险取决于您的语言环境)
  4. 过滤除第一个字段(修订号)以外的所有内容(剪切)
  5. 对步骤 4 (xargs) 中找到的每个修订版运行 svnadmin 命令。每次执行命令 (-n1) 只通过一个修订版。这会将 svn:author 属性替换为 msmith.txt 文件的内容。
于 2012-08-01T20:43:42.010 回答
3

雷霆之下,二战中的 USS Barb 的故事中,一位新军官登上了船。船长问他的名字。“迈克”,他回应道。“不,我们已经有了迈克”,船长说。“我们叫你罗伯特。在战斗中,当我发出命令时,我不会混淆我在跟谁说话。”

我要说的是,让你的新迈克选择另一个名字是有先例的。

于 2009-07-28T17:22:37.153 回答
2

花了很多时间寻找,但我最终找到了一个适用于 SVN 转储文件的 perl 脚本。

我今天早上在我的存储库转储上尝试了它,它完美地工作。

这是直接链接

于 2009-07-29T13:20:15.487 回答
-2

根据记忆,改变历史中任何内容的标准 SVN 答案是对数据库进行文本转储,通过它进行搜索替换并从中重新创建数据库。

但是自从 0.x 天以来我还没有真正看过 SVN 的内部结构,所以我可能会离开......

于 2009-07-28T16:55:09.067 回答