我有一个SVN存储库,从“Project”重命名为“Project v1”。
然后我做了git svn clone
来创建重命名的SVN文件夹的git版本。
当我git log
新创建的git存储库时,我只看到一个历史记录项。这是我在重命名文件夹时给SVN存储库的提交消息。
git存储库是否有办法在重命名文件夹之前拥有所有SVN历史记录(或者在该文件夹之前的任何其他可能的重命名)?
答案 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
,甚至可以远程命名。
警告:这是来自记忆,我不仅仅是自己重复这些步骤。欢迎评论和更正。