我有一个我已经从Subversion克隆的存储库。我一直在用它的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="[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的脚本,就像你描述的那样(除了我有大量的作者)。
编辑使用π指出我的脚本中的引用问题。谢谢!
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。
你可能想看看git-filter-branch
,特别是--commit-filter
选项。此命令是一个功能强大的电锯,可以重写整个存储库历史记录,更改您可能想要更改的内容。
请注意,执行此操作时,应从更新的存储库中提取新克隆,因为每次提交的SHA1哈希值可能已更改。