我有一个代码库,已经从Subversion中克隆了下来。我在Git版本中对这个代码库进行了一些修改,不想再次克隆而失去这个结构。
但是,在我最初克隆代码库时,我没有正确地指定svn.authors
属性(或类似的选项)。
现在这个代码库完全转为了Git形式,有没有办法仍然指定SVN作者映射呢?
最好的情况是,我想将所有旧的提交作者更正为表示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/"`
'
像往常一样,以下规则适用:为了重写历史记录,你需要一个阴谋。
git-filter-branch
,特别是 --commit-filter
选项。该命令是一款强大的链锯工具,可以重写整个存储库的历史记录,更改您想要更改的任何内容。
git svn rebase
之后,还有其他人成功吗? - Spencer Williams