使用Git SVN追溯正确的作者?

我有一个仓库,我已经从SVN克隆。 我一直在以Git的forms在这个仓库中做一些工作,我不愿意再次克隆掉这个结构。 但是,当我最初克隆存储库时,我没有正确指定svn.authors属性(或语义相似的选项)。 有没有什么办法可以指定SVN作者映射,现在的存储库是完全Git-ified? 最好,我想纠正所有的老提交作者代表Git作者,而不是原始的SVN用户名。

从看到你要清理的东西开始:

 git shortlog -s 

对于这些名字中的每一个,在脚本中创build一个条目,如下所示(假设您希望所有的作者和提交者都是相同的):

 #!/bin/sh git filter-branch --env-filter ' n=$GIT_AUTHOR_NAME m=$GIT_AUTHOR_EMAIL case ${GIT_AUTHOR_NAME} in user1) n="User One" ; m="user1@example.com" ;; "User Two") n="User Two" ; m="user2@example.com" ;; esac export GIT_AUTHOR_NAME="$n" export GIT_AUTHOR_EMAIL="$m" export GIT_COMMITTER_NAME="$n" export GIT_COMMITTER_EMAIL="$m" ' 

这基本上是我最近用来进行大量重写的脚本,与您描述的非常相似(除了我有大量的作者)。

编辑使用π指出我的脚本中的引用问题。 谢谢!

git filter-branch可以用来重写大块的历史logging。

在这种情况下,你可能会做一些像(完全未经testing):

 git filter-branch --env-filter ' GIT_AUTHOR_NAME=`echo "${GIT_AUTHOR_NAME}" | sed -e "s/svnname1/Right Name/; s/svnname2/Correct Name/"` GIT_COMMITTER_NAME=`echo "${GIT_COMMITTER_NAME}" | sed -e "s/svnname1/Right Name/; s/svnname2/Correct Name/"` GIT_AUTHOR_EMAIL=`echo "${GIT_AUTHOR_EMAIL}" | sed -e "s/svnname1/m@il/; s/svnname2/correct.name@e.mail/"` GIT_COMMITTER_EMAIL=`echo "${GIT_COMMITTER_EMAIL}" | sed -e "s/svnname1/m@il/; s/svnname2/correct.name@e.mail/"` ' 

一如既往,以下情况适用:为了改写历史,你需要一个阴谋 。

你可能想看看git-filter-branch ,特别是--commit-filter选项。 这个命令是一个强大的电锯,可以重写您的整个存储库的历史,改变任何你可能想改变。

请注意,执行此操作时,应该从更新的存储库中提取新克隆,因为每个提交的SHA1哈希值可能已经更改。