获取已使用git-svn重命名的SVN仓库的完整历史记录

时间:2011-06-29 00:39:21

标签: git git-svn

我有一个SVN存储库,从“Project”重命名为“Project v1”。

然后我做了git svn clone来创建重命名的SVN文件夹的git版本。

当我git log新创建的git存储库时,我只看到一个历史记录项。这是我在重命名文件夹时给SVN存储库的提交消息。

git存储库是否有办法在重命名文件夹之前拥有所有SVN历史记录(或者在该文件夹之前的任何其他可能的重命名)?

1 个答案:

答案 0 :(得分:9)

我过去唯一这样做的方式(不知道它是最好的还是唯一的方式!)是明确git svn fetch先前的历史(你可能需要第二个遥控器),然后移植重命名使用git filter-branch将旧历史记录到树上(在重新显示树的文档中有一个特定示例)。

实施例

来自:svn://server/repo/project 到:svn://server/repo/project_v1

可选的第一步:如果您没有现有的git-svn回购,请继续git svn clone svn://server/repo/project。大多数人可能已经拥有这个回购,因为他们一直在与git-svn合作。如果你还没有git repo,你可以在任何一方进行初始克隆。

git-svn repo中添加一个遥控器作为项目的新名称。我不认为有这方面的命令,你只需要为你的.git/config添加一个非常类似于已经存在的节的节:

[svn-remote "svn_v1"]
        url = svn://server/repo/project_v1
        fetch = :refs/remotes/git-svn-v1

可以使用--remote svn_v1选项为任何git-svn命令选择新的SVN远程。您要做的第一件事是git-svn fetch --remote svn_v1,它将使用该副本的历史记录填充您的git仓库。正如原始问题所指出的那样,这将是一段非常简短的历史!

现在我们在git filter-branch联机帮助页中应用该示例。您需要知道旧历史的提示,即git show-ref -s remotes/git-svn(再次,假设您的原始克隆是旧版本)。然后使用git filter-branch --parent-filter 'sed "s/^\$/-p <graft-id>/"' remotes/git-svn-v1,其中<graft-id>是您刚刚获得的SHA,用于旧历史的提示。

验证这是否适用于git log remotes/git-svn-v1并查看所有历史记录。

此时,您可以转到您的工作分支,git reset --hard remotes/git-svn-v1将该分支切换到新历史记录。

请注意,名为“svn”的svn-remote将是您的默认设置,因此最后您需要在[svn-remote "..."]的{​​{1}}行中重命名遥控器,以便你的主要名字叫“svn”。您可以将另一个命名为.git/config,甚至可以远程命名。

警告:这是来自记忆,我不仅仅是自己重复这些步骤。欢迎评论和更正。