用Git SVN追溯纠正作者?

时间:2008-12-24 23:22:03

标签: svn git git-svn

我有一个存储库,我已经已经从Subversion克隆了。我一直在用它的Git形式在这个存储库中做一些工作,我不想再通过克隆来丢失这个结构。

但是,当我最初克隆存储库时,我无法正确指定svn.authors属性(或语义相似的选项)。

有没有办法可以指定SVN作者映射,因为存储库完全是Git-ified?

最好,我想纠正所有旧提交作者以代表Git作者而不是原始SVN用户名。

3 个答案:

答案 0 :(得分:57)

首先看看你要清理的东西:

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="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"
'

这基本上是我最近用于large rewrite的脚本,就像你描述的那样(除了我有大量的作者)。

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

答案 1 :(得分:11)

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/m@i.l/; s/svnname2/correct.name@e.mail/"`
    GIT_COMMITTER_EMAIL=`echo "${GIT_COMMITTER_EMAIL}" | sed -e "s/svnname1/m@i.l/; s/svnname2/correct.name@e.mail/"`
'

与以往一样,以下情况适用:为了重写历史记录,您需要conspiracy

答案 2 :(得分:3)

您可能希望查看git-filter-branch,特别是--commit-filter选项。这个命令是一个功能强大的电锯,它可以重写整个存储库历史记录,改变你想要改变的东西。

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