我想从svn服务器迁移到git并完全转移到git。
我的svn存储库包含多个文件夹,每个文件夹都包含差异项目。
我使用git svn将svn存储库克隆到git然后我尝试使用此命令将每个文件夹拆分为差异分支: git subtree split -P name-of-folder -b name-of-new-branch。
问题在于,在历史的某些部分,我将其中一个文件夹转移到其他位置,而git存储库中的历史记录只保留在此位置。
在运行git svn clone
后,我甚至无法立即看到历史记录我的svn布局是这样的:
svnrepo/ folderA/ projectA files(.sln,.cpp) folderB/ projectB files(.java) folder/ folderC/ folderC files(.cs) folderD/ folderD files(.cs)
我希望这将是文件夹A分支,分支用于folderB分支,用于folderC,分支用于folderD。
修改的 在我的项目的某些方面,我像这样移动了folderC和folderD:
folder/ web/ folderC/ folderC files(.cs) folderD/ folderD files(.cs)
然后,当我尝试从folderC的url克隆时,我只从我将folderC移动到web的那一点获得历史记录,尽管之前有很多历史记录。
有没有办法保存以前位置的历史记录?
答案 0 :(得分:0)
git-svn已经有了处理SVN分支和标记的选项,但它们已记录在init
而不是clone
中。 git svn clone
基本上是git svn init
加git svn fetch
并且可以选择。
对于典型的SVN布局......
svnrepo/
trunk/
branches/
branch1/
branch2/
tags/
tag1/
tag2/
您可以使用--trunk
,--tags
和--branches
告诉git-svn您的布局。 git svn clone --trunk=trunk/ --tags=tags/ --branches=branches/ <svnurl>
。此标准布局有一个快捷方式--stdlayout
。
对于OP的非标准布局......
svnrepo/
folderA/
projectA files(.sln,.cpp)
folderB/
projectB files(.java)
folder/
folderC/
folderC files(.cs)
folderD/
folderD files(.cs)
这将是git svn --branch=folderA --branch=folderB --branch=folder/folderC --branch=folder/folderD
。但是从OP的描述来看,这些听起来更像是单独的项目,而不是单个项目的分支。它们应该是单独的Git存储库。
SVN存储库的设置和维护成本很高,因此SVN鼓励您将不相关的项目推送到一个存储库中。 Git存储库非常便宜,当每个项目都是自己的存储库时,Git效果最好。因此,当您进行转换时,最好将每个项目拆分为自己的Git存储库。然后稍后如果您发现需要,可以与git subtree
一起缝合相关项目。
对于要将多个项目转换为多个Git存储库的SVN存储库,只需在每个SVN目录上多次运行git svn clone
,就像从SVN中检出它们一样。
git svn clone https://svn.example.com/folderA/
git svn clone https://svn.example.com/folderB/
git svn clone https://svn.example.com/folder/folderC/
git svn clone https://svn.example.com/folder/folderD/
Pro Git有一章关于从SVN转换为Git,这将有助于更多。