用Git SVN追溯纠正作者?

问题描述 投票:52回答:3

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

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

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

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

svn git git-svn
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="[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的脚本,就像你描述的那样(除了我有大量的作者)。

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


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

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


3
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.