有没有办法在整个存储库历史记录中更改SVN用户的用户名?

Wal*_*ess 18 svn history rename repository

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

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

是否有用于在存储库的整个历史记录中更改用户名的工具?

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

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

Jas*_*tta 20

你可以使用svndumptool:

svnadmin dump path/to/my/repo> repo.dump

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


Ste*_*pel 13

TortoiseSVN对此功能提供了出色的支持:在其修订日志对话框中,可以按作者进行过滤(甚至通过正则表达式),根据需要从过滤列表中选择修订(通常在此问题中都是如此),然后从上下文中选择"编辑作者"菜单.

当然,正如jeroenhs 回答中提到的那样,使用pre-revprop-change钩子的前提条件仍然适用.

该处理是相当缓慢的,但根据需要的人,这可能仍然是很多更快和/或更方便的然后有倾倒整个仓库,并处理与脚本这些潜在的巨大转储文件(S).


jer*_*enh 12

就在这里:

svn propset --revprop -r revision_number svn:author new_username
Run Code Online (Sandbox Code Playgroud)

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

exit 0
Run Code Online (Sandbox Code Playgroud)

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

编辑:我没有通过测试,但我认为这应该在PowerShell中做到这一点:

([xml] ( svn log --xml )).log.logentry 
   | ? {$_.author -eq "Mike"} 
   | foreach {svn propset --revprop -r $_.revision svn:author msmith}
Run Code Online (Sandbox Code Playgroud)

  • svnadmin解决了问题 (2认同)

Gre*_*reg 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
Run Code Online (Sandbox Code Playgroud)

这是在做什么:

  1. 将新用户名存储在最后没有换行符的文件中(echo -n)
  2. 获取/ svn中存储库的完整日志,仅显示摘要信息(而不是日志消息)(svn log -q)
  3. 找到Mike(grep)的台词
  4. 过滤除第一个字段(修订版#)以外的所有内容(剪切)
  5. 对步骤4(xargs)中找到的每个修订运行svnadmin命令.每次执行命令(-n1)只传递一个修订版.这将使用msmith.txt文件的内容替换svn:author属性.


Wal*_*ess 2

我花了很多时间寻找,但最终找到了一个针对 SVN 转储文件的 Perl 脚本。

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

这是直接链接