我使用svn2git
从现有SVN存储库创建Git存储库。我把它全部下载(所有10个以上的分支,10个以上的标签,> 4000个提交)和Git仓库。现在,不幸的是,所有作者都搞砸了。
所有作者都没有电子邮件地址或姓名,大多数作者在项目的整个生命周期中都使用过多个电子邮件地址,所以我想将它们合并。我怎么能这样做?
答案 0 :(得分:5)
您想要的工具是git-filter-branch
。这允许您设置“提交过滤器”,以更改存储库中每个提交的作者名称。
这是您在运行svn2git
后设置并运行一次的步骤。这通常不是你想要在你进行任何进一步提交的Git存储库上运行的东西。
您的问题表明“所有作者都没有电子邮件地址或名称”,这似乎表明svn2git
中的某些内容并没有完全符合预期。但请注意,Git每个提交都有两个名称 - “作者”和“提交者”(因为它们可能不同)。
答案 1 :(得分:2)
您真正想要的工具是reposurgeon。
一旦你达到你的问题规模(10个作者,1000个提交)git filter-branch
太慢而且笨重。它只会在迭代整个仓库时一次更改一个作者,整个过程可能需要数小时。我有72位作者和21000次提交,这需要18个小时!
虽然reposurgeon起初可能非常令人生畏,但这项任务很简单。
创建一个类似于authors.txt
所需的作者映射文件(比如说svn2git
),每个SVN作者的一行包含一行
oldauthor = New Author <new@email>
如果您愿意,可以在此处将多位SVN作者映射到一位实际作者。
进入转换后的git存储库并执行
reposurgeon "verbose 1" "read" "authors read <../authors.txt" "write >../export"
您现在在顶级目录中有一个快速导出文件。将其转换回实际存储库,如下所示:
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.tld
至New Name <new.address@domain.tld>
的所有提交。