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

Die*_*ros 8 git git-svn

我有一个SVN存储库,从"Project"重命名为"Project v1".

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

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

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

Ben*_*son 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仓库中,为项目的新名称添加一个远程.我不认为有这样的命令,你只需要添加一个与你.git/config已经存在的类似的节:

[svn-remote "svn_v1"]
        url = svn://server/repo/project_v1
        fetch = :refs/remotes/git-svn-v1
Run Code Online (Sandbox Code Playgroud)

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

现在我们在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-remote命名的"svn"将是您的默认值,因此最后您需要[svn-remote "..."]在您的行中重命名遥控器,.git/config以便您的主要名称命名为"svn".您可以命名另一个-old甚至远程.

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