我有一个已经从 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"
'
这基本上是我最近用于大型重写的脚本,与您描述的非常相似(除了我有大量作者)。
编辑Use π 在我的脚本中指出了一个引用问题。谢谢!
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
选项。该命令是一个强大的电锯,可以重写您的整个存储库历史记录,更改您可能想要更改的任何内容。
请注意,执行此操作时,您应该从更新的存储库中提取新的克隆,因为每次提交的 SHA1 哈希值可能已更改。