2008-12-24 96 views
51

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

回答

55

通过看你有什么要清理开始了:

git shortlog -s 

对于那些名字中的每一个,创建一个脚本,看起来像这样的条目(假设你希望所有的作家和提交是相同的):

#!/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="[email protected]" ;; 
     "User Two") n="User Two" ; m="[email protected]" ;; 
esac 

export GIT_AUTHOR_NAME="$n" 
export GIT_AUTHOR_EMAIL="$m" 
export GIT_COMMITTER_NAME="$n" 
export GIT_COMMITTER_EMAIL="$m" 
' 

这基本上是我用于large rewrite最近的脚本,你描述的是非常多(除非我有大量的作者)。

编辑使用π在我的剧本指出了一个报价问题。谢谢!

2

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

注意,当你这样做,你应该从更新库得到新的克隆,因为每一个的SHA1散列提交可能已经改变。

10

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

在这种情况下,你可能会做这样的事情(没有经过测试):

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/[email protected]/; s/svnname2/[email protected]/"` 
    GIT_COMMITTER_EMAIL=`echo "${GIT_COMMITTER_EMAIL}" | sed -e "s/svnname1/[email protected]/; s/svnname2/[email protected]/"` 
' 

与往常一样,出现以下情况:为了改写历史,你需要一个conspiracy

+0

Upvoted为:“与往常一样,以下适用:为了改写历史,你需要一个阴谋”说得好。 (虽然链接不再加载) – 2012-03-05 19:36:19

+0

谢谢!我修复了这些链接。 – 2012-03-06 01:25:32