大规模重命名Git作者?

时间:2012-01-13 19:21:00

标签: git

我使用svn2git从现有SVN存储库创建Git存储库。我把它全部下载(所有10个以上的分支,10个以上的标签,> 4000个提交)和Git仓库。现在,不幸的是,所有作者都搞砸了。

所有作者都没有电子邮件地址或姓名,大多数作者在项目的整个生命周期中都使用过多个电子邮件地址,所以我想将它们合并。我怎么能这样做?

3 个答案:

答案 0 :(得分:5)

您想要的工具是git-filter-branch。这允许您设置“提交过滤器”,以更改存储库中每个提交的作者名称。

这是您在运行svn2git后设置并运行一次的步骤。这通常不是你想要在你进行任何进一步提交的Git存储库上运行的东西。

您的问题表明“所有作者都没有电子邮件地址或名称”,这似乎表明svn2git中的某些内容并没有完全符合预期。但请注意,Git每个提交都有两个名称 - “作者”和“提交者”(因为它们可能不同)。

答案 1 :(得分:2)

您真正想要的工具是reposurgeon

一旦你达到你的问题规模(10个作者,1000个提交)git filter-branch太慢而且笨重。它只会在迭代整个仓库时一次更改一个作者,整个过程可能需要数小时。我有72位作者和21000次提交,这需要18个小时!

虽然reposurgeon起初可能非常令人生畏,但这项任务很简单。

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

    oldauthor = New Author <new@email>

    如果您愿意,可以在此处将多位SVN作者映射到一位实际作者。

  2. 进入转换后的git存储库并执行

    reposurgeon "verbose 1" "read" "authors read <../authors.txt" "write >../export"

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

  4. mkdir ../new-repo && cd ../new-repo git init git fast-import < ../export git reset --hard HEAD # I needed this step for some reason

    整个过程在我的大型存储库上只需不到2分钟,并且原始的git存储库保持原样 - 在出现问题时非常有用。这只是冰山一角的回头......谢谢,埃里克!

答案 2 :(得分:0)

以下是使用前一个答案中建议的git filter-branch的示例:

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

重写作者old.address@domain.tldNew Name <new.address@domain.tld>的所有提交。