我正在使用svn2git从现有的SVN存储库创建一个Git存储库。我下载了所有的代码(所有的10+分支,10+标签,超过4000个提交),并保存在Git repo中。现在,不幸的是,所有的作者都搞砸了。
所有的作者都没有电子邮件地址或名字,而且大多数作者在项目的生命周期中使用了多个电子邮件地址,所以我可能想要将它们合并起来。我该怎么做呢?
发布于 2012-01-14 03:23:30
您需要的工具是git-filter-branch。这允许您设置一个“提交过滤器”,以更改存储库中每个提交的作者姓名。
这是一个在运行svn2git之后设置并运行一次的步骤。这不是你通常想要在Git存储库上运行的东西,因为你已经做了进一步的提交。
你的问题表明“所有的作者都没有电子邮件地址或姓名”,这似乎表明svn2git中的某些东西并不完全像它应该做的那样。然而,请注意,Git对每个提交都有两个名称-“作者”和“提交者”(因为它们可以是不同的)。
发布于 2015-04-09 21:53:28
您真正想要的工具是reposurgeon。
一旦你达到了你的问题规模(10个作者,1000个提交),git filter-branch就太慢太笨拙了。它一次只更改一个作者,而迭代整个存储库,整个过程可能需要几个小时。我有72个作者和21000个提交,这需要18个小时!
虽然reposurgeon一开始可能相当令人望而生畏,但对于这项任务来说,它是非常简单的。
无论如何,
svn2git所需的作者映射文件(比如authors.txt),其中包含表单的每个SVN作者一行oldauthor = New Author <new@email>
如果你愿意,你可以在这里将多个SVN作者映射到一个实际的作者。
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存储库也完好无损--这在出错的情况下很有用。这只是复活的冰山一角...谢谢你,埃里克!
发布于 2015-03-13 16:52:34
下面是一个使用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>。
https://stackoverflow.com/questions/8856024
复制相似问题