大规模重命名Git作者?

大规模重命名Git作者?,git,Git,我正在使用svn2git从现有的SVN存储库创建Git存储库。我下载了全部内容(所有10多个分支,10多个标记,超过4000次提交),并在Git repo中完成。现在,不幸的是,所有的作者都搞砸了 所有作者都没有电子邮件地址或姓名,而且大多数作者在项目生命周期中使用了多个电子邮件地址,因此我可能希望将它们合并。我怎样才能做到这一点?您需要的工具是。这允许您设置“提交筛选器”,更改存储库中每次提交的作者名称 这是一个在运行svn2git后设置并运行一次的步骤。它不是您通常希望在Git存储库上运行的

我正在使用
svn2git
从现有的SVN存储库创建Git存储库。我下载了全部内容(所有10多个分支,10多个标记,超过4000次提交),并在Git repo中完成。现在,不幸的是,所有的作者都搞砸了

所有作者都没有电子邮件地址或姓名,而且大多数作者在项目生命周期中使用了多个电子邮件地址,因此我可能希望将它们合并。我怎样才能做到这一点?

您需要的工具是。这允许您设置“提交筛选器”,更改存储库中每次提交的作者名称

这是一个在运行
svn2git
后设置并运行一次的步骤。它不是您通常希望在Git存储库上运行的东西,您已经对它做了进一步的承诺


您的问题表明“所有的作者都没有电子邮件地址或姓名”,这似乎表明
svn2git
中的某些东西并没有达到预期的效果。但是,请注意,Git的每个提交都有两个名称——“作者”和“提交者”(因为它们可能不同)。

下面是一个使用Git筛选器分支的示例,如前面的答案所示:

git filter-branch --commit-filter '
    if [ "$GIT_AUTHOR_NAME" = "old.address@domain.tld" ];
    then
        GIT_AUTHOR_NAME="New Name" \
        GIT_AUTHOR_EMAIL="new.address@domain.tld" \
        GIT_COMMITTER_NAME="New Name" \
        GIT_COMMITTER_EMAIL="new.address@domain.tld" \
        git commit-tree "$@";
    else
        git commit-tree "$@";
    fi' -f HEAD

重写所有作者
旧的提交。address@domain.tld
新名称

您真正想要的工具是

一旦你达到了你的问题大小(10个作者,1000个提交)
git filter branch
就是太慢和笨拙了。它一次只改变一个作者,同时迭代整个回购协议,整个过程可能需要几个小时。我有72位作者和21000次提交,这需要18个小时

虽然一开始可能会让人望而生畏,但这项任务非常简单

  • 创建一个类似于
    svn2git
    所需的作者映射文件(比如
    authors.txt
    ),每个SVN表单作者包含一行

    oldauthor=新作者

    在这里,如果您愿意,您可以将多个SVN作者映射到一个实际作者

  • 进入已转换的git存储库并执行以下操作

    repose“详细1”“读取”“作者读取../export”

  • 现在,顶级目录中有一个快速导出文件。将其转换回实际存储库,如下所示:

  • 
    mkdir../new repo&&cd../new repo
    初始化
    git快速导入<../export
    git重置--硬头#出于某种原因,我需要这一步
    


    在我的大型存储库中,整个过程只需不到2分钟的时间,并且保持原始git存储库完好无损—在出现问题时非常有用。而这只是冰山一角,那就是。。。谢谢你,埃里克

    svn没有(必须)针对用户ID的电子邮件。这可能只是一个登录,没错。我仍然会说那是一个“名字”,只是不是一个全名。你能把我和一个“例如”链接起来,说明我需要做什么吗?在这个项目的生命周期中,我有大约10-15个用户,我想对每个用户进行重命名;他们的姓名和电子邮件地址。