52

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

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

既然存储库完全被 Git 化了,有什么方法可以指定 SVN 作者映射?

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

4

3 回答 3

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

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

编辑Use π 在我的脚本中指出了一个引用问题。谢谢!

于 2008-12-25T01:52:40.467 回答
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/"`
'

与往常一样,以下适用:为了改写历史,你需要一个阴谋

于 2008-12-24T23:49:45.550 回答
3

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

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

于 2008-12-24T23:36:52.893 回答