代码之家  ›  专栏  ›  技术社区  ›  Daniel Spiewak

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

  •  52
  • Daniel Spiewak  · 技术社区  · 16 年前

    我有一个储存库 已经 从SVN克隆。我已经在这个存储库中以git的形式做了一些工作,我不想再次克隆而丢失这个结构。但是,当我最初克隆存储库时,未能正确指定 svn.authors 属性(或语义相似的选项)。既然存储库是完全Git化的,那么我是否可以指定SVN作者映射?最好,我希望更正所有旧提交作者以表示Git作者,而不是原始SVN用户名。

    3 回复  |  直到 16 年前
        1
  •  57
  •   Dustin    15 年前

    先看看你要清理的东西:

    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 最近就像你描述的那样(除了我有很多作者)。

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

        2
  •  11
  •   Jörg W Mittag    12 年前

    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 .

        3
  •  3
  •   Greg Hewgill    16 年前

    你可能想调查一下 git-filter-branch 特别是 --commit-filter 选择权。这个命令是一个强大的链锯,可以重写整个存储库历史,更改您可能想要更改的内容。

    注意,当您这样做时,应该从更新的存储库中提取新的克隆,因为每个提交的sha1散列可能已经更改。