我有一个我已经从SVN克隆的存储库.我一直在用它的Git形式在这个存储库中做一些工作,我不想再通过克隆来丢失这个结构.但是,当我最初克隆存储库时,我无法正确指定svn.authors
属性(或语义相似的选项).有没有什么办法可以指定SVN作者映射,因为存储库完全是Git-ified?最好,我想纠正所有旧提交作者代表Git作者而不是原始SVN用户名.
首先看看你要清理的东西:
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" '
这基本上是我最近用于大量重写的脚本,就像你描述的那样(除了我有大量的作者).
编辑使用π指出我的脚本中的引用问题.谢谢!
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/"` '
与往常一样,以下情况适用:为了重写历史,您需要一个阴谋.