Retroactively Correct Authors with Git SVN?

后端 未结 3 844
臣服心动
臣服心动 2020-12-07 10:00

I have a repository which I have already cloned from Subversion. I\'ve been doing some work in this repository in its Git form and I would hate to lose that struct

相关标签:
3条回答
  • 2020-12-07 10:32

    You probably want to look into git-filter-branch, specifically the --commit-filter option. This command is a powerful chainsaw that can rewrite your entire repository history, changing whatever you might want to change.

    Note that when you do this, you should pull new clones from the updated repository since the SHA1 hashes of every commit may have changed.

    0 讨论(0)
  • 2020-12-07 10:37

    git filter-branch can be used to rewrite large chunks of history.

    In this case, you would probably do something like (totally untested):

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

    As always, the following applies: in order to rewrite history, you need a conspiracy.

    0 讨论(0)
  • 2020-12-07 10:43

    Start out by seeing what you've got to clean up:

    git shortlog -s
    

    For each one of those names, create an entry in a script that looks like this (assuming you want all the authors and committers to be the same):

    #!/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"
    '
    

    That's basically the script I used for a large rewrite recently that was very much as you described (except I had large numbers of authors).

    edit Use π pointed out a quoting problem in my script. Thanks!

    0 讨论(0)
提交回复
热议问题