Git 当分支不';不要排队

Git 当分支不';不要排队,git,svn,git-svn,Git,Svn,Git Svn,我怀疑这可能只是因为git和svn之间的阻抗不匹配,但我想征求SO社区的意见 我正在从事一个使用svn进行版本控制的项目。这不会改变,我也无法控制。我一直很高兴使用gitsvn在我的分支上进行工作。然而,我遇到了一个奇怪的问题,与SVN项目的奇怪设置方式有关 在SVN中,项目如下所示: 项目根 分支机构 我的分行 Dir1 Dir2 等等 树干 项目主管 Dir1 Dir2 等等 .git/config: [core] repositoryformatversio

我怀疑这可能只是因为
git
svn
之间的阻抗不匹配,但我想征求SO社区的意见

我正在从事一个使用
svn
进行版本控制的项目。这不会改变,我也无法控制。我一直很高兴使用
gitsvn
在我的分支上进行工作。然而,我遇到了一个奇怪的问题,与SVN项目的奇怪设置方式有关

在SVN中,项目如下所示:

  • 项目根
    • 分支机构
      • 我的分行
        • Dir1
        • Dir2
        • 等等
    • 树干
      • 项目主管
        • Dir1
        • Dir2
        • 等等
.git/config:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[svn-remote "svn"]
    url = http://svn-repo
    fetch = project/trunk:refs/remotes/trunk
    branches = project/branches/*:refs/remotes/*
    tags = project/tags/*:refs/remotes/tags/*
创建分支时,它们是在
trunk
下一级创建的。我也无法控制这一切

当我尝试从
MyBranch
合并到
trunk
时,我的树会向上合并一级。也就是说,
MyBranch/Dir1
trunk/Proj_Main/Dir1
没有关系。在本机的
svn
中,它确实理解这种关系,我可以使用
svn
工具进行合并,但是
git
丢失了


是否有一种方法可以告诉
git
master
指向
trunk/Proj_Main
,而不仅仅是
trunk

fetch = project/trunk/Proj_Main:refs/remotes/trunk

那应该可以。。。。但是,我不知道您是否需要再次从修订版1中提取,这样的更改才能正常工作。

将提取行编辑为类似以下内容:

fetch = project/trunk/Proj_Main:refs/remotes/trunk

那应该可以。。。。但是,我不知道您是否需要再次从修订版1中获取,这样的更改才能正常工作。

@eftshift0采用了正确的方法。有时候,挽救一个糟糕的局面是不可能的。我确保一切都与SVN同步,然后重新开始

git svn clone -r<start>:HEAD http://svn-repo/project \
    --prefix=mine/ \
    --trunk=trunk/Proj_Main --branches=branches --tags=tags \
    --no-minimize-url
git svn克隆-r:HEADhttp://svn-repo/project \
--前缀=我的/\
--trunk=trunk/Proj_Main--branchs=branchs--tags=tags\
--没有最小化url
因为这是一个非常成熟的SVN回购协议,我不关心5年前的历史,为了时间,我限制了我克隆的范围

--前缀
基于中的建议

我没有使用
-s
-stdlayout
,而是明确指定了SVN中的布局方式。请注意,早期应用此方法的尝试遇到了抓取,可能与已删除的SVN分支有关。这是限制获取范围的另一个原因


--no minimize url
是由于服务器上存在其他回购协议。如果没有这个开关,git svn会提升一个级别,并在尝试解决分支、合并等问题时考虑所有回购协议。这对我来说不是一件好事。

@eftshift0的方法是正确的。有时候,挽救一个糟糕的局面是不可能的。我确保一切都与SVN同步,然后重新开始

git svn clone -r<start>:HEAD http://svn-repo/project \
    --prefix=mine/ \
    --trunk=trunk/Proj_Main --branches=branches --tags=tags \
    --no-minimize-url
git svn克隆-r:HEADhttp://svn-repo/project \
--前缀=我的/\
--trunk=trunk/Proj_Main--branchs=branchs--tags=tags\
--没有最小化url
因为这是一个非常成熟的SVN回购协议,我不关心5年前的历史,为了时间,我限制了我克隆的范围

--前缀
基于中的建议

我没有使用
-s
-stdlayout
,而是明确指定了SVN中的布局方式。请注意,早期应用此方法的尝试遇到了抓取,可能与已删除的SVN分支有关。这是限制获取范围的另一个原因


--no minimize url
是由于服务器上存在其他回购协议。如果没有这个开关,git svn会提升一个级别,并在尝试解决分支、合并等问题时考虑所有回购协议。这对我来说不是一件好事。

在svn和git之间映射分支时,对于特定的分支,您可以指定分支的确切位置。如果您在初始化git svn时指定了
-s
,那么它假定有一个名为trunk的分支。。。但是,如果适合您的环境,您可以指定trunk/whatever。也许您还可以添加.git/config中与svn相关的部分?至少设置为
分支
获取
的行。我使用了-s来初始化repo。问题是,事后我如何修复它?你的评论表明我想要的是可能的,我只是不够成熟,无法自己解决:)在svn和git之间映射分支时,对于特定的分支,你可以指定分支的确切位置。如果您在初始化git svn时指定了
-s
,那么它假定有一个名为trunk的分支。。。但是,如果适合您的环境,您可以指定trunk/whatever。也许您还可以添加.git/config中与svn相关的部分?至少设置为
分支
获取
的行。我使用了-s来初始化repo。问题是,事后我如何修复它?你的评论表明,我想要的是可能的,我只是不够成熟,无法自己解决:)我可以简单地编辑.git/config,还是需要运行一些命令?在任何像样的文本编辑器上编辑文件都可以。。。。然后您可以尝试
git svn fetch
。。祝你好运,我遇到了麻烦。。。上的服务器实际上承载许多SVN存储库。把整个东西放到我的git里会耗尽磁盘空间。当我按照您的建议编辑.git/config并运行
git svn fetch
时,它会尝试拉取所有的repo,而不仅仅是
project
,听起来更像是您应该花时间用适当的
分支/fetch
行设置svn repo的布局,而不仅仅是使用
git svn init-s
c