Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将凌乱的svn存储库转换为git_Git_Svn_Merge - Fatal编程技术网

将凌乱的svn存储库转换为git

将凌乱的svn存储库转换为git,git,svn,merge,Git,Svn,Merge,我正在尝试将稍微混乱的svn存储库转换为git。我试着读了一些指南和其他一些问题,但对于什么是最好的方法,我有点不知所措 SVN存储库具有顶级文件夹结构,其中包含文件夹,如: |- client |- server |- website |- misc 大多数文件夹具有“标准”svn结构:即主干、分支和标记。然而,有些只是平面文件夹 |- client |- trunk |- branches |- tags |- server |- trunk

我正在尝试将稍微混乱的svn存储库转换为git。我试着读了一些指南和其他一些问题,但对于什么是最好的方法,我有点不知所措

SVN存储库具有顶级文件夹结构,其中包含文件夹,如:

 |- client
 |- server
 |- website
 |- misc
大多数文件夹具有“标准”svn结构:即
主干
分支
标记
。然而,有些只是平面文件夹

 |- client
    |- trunk
    |- branches
    |- tags
 |- server
    |- trunk
    |- branches
    |- tags
 |- website
 |- misc
不同文件夹之间的分支和标记可能具有相同的名称。例如,客户端和服务器文件夹都可能有一个名为
1.0
的分支

我设法使用转换单个文件夹,它似乎可以很好地获取历史记录和分支。我可以为每个文件夹创建一个单独的git存储库。但是,我希望最终将所有内容都保存在一个存储库中

在维护每个文件夹的分支、标记和历史记录的同时,将这些文件夹(现在是git存储库)合并为一个文件夹的最佳方式是什么?使用,我似乎丢失了提交历史和合并自存储库的分支。。。或者我只是错过了一些重要的步骤或者做错了什么


否则,在每个文件夹上分别使用
svn2git
可能不是从svn迁移到git的最佳方法?

在转换为git之前,我会将svn存储库重写为以下结构:

- trunk
  |-client
  |-server
  |-website
  `-misc
- branches
  |-client
  |-server
  |-website
  `-misc
- tags
  |-client
  |-server
  |-website
  `-misc
要重组您的svn存储库,您必须
svnadmin dump
将存储库转储到一个文件中,更新该文件中的所有路径,然后
svnadmin将更新的转储文件加载到一个新的存储库中


查看转储文件的结构—使用支持搜索/替换的编辑器可以轻松完成实际的重构。但它需要二进制安全,因为除了ascii元数据之外,转储文件还包含原始二进制数据(存储库中的二进制文件)。

我最终选择了上的方法

基本上:

  • 为svn存储库中的每个子文件夹创建git项目(使用svn2git)
  • 创建新的git存储库将所有存储库合并到
  • 将每个项目(包括所有分支)添加为远程:

    git remote add alpha <url/path-to-alpha-repo>
    git remote add bravo <url/path-to-bravo-repo>
    git remote add charlie <url/path-to-charlie-repo>
    for r in $(git remote); do
      git config remote.$r.fetch \
      "$(git config remote.$r.fetch | sed -e 's.remotes.heads/all.')"
      git config --add remote.$r.fetch \
      "$(git config remote.$r.fetch | sed -e 's.heads.tags.g')"
      git config remote.$r.tagopt --no-tags
    done
    git remote update
    
    git远程添加alpha
    git远程添加bravo
    git远程添加charlie
    对于r,单位为美元(吉特远程);做
    git config remote.$r.fetch\
    “$(git config remote.$r.fetch | sed-e's.remotes.heads/all.””
    git config--添加远程。$r.fetch\
    “$(git config remote.$r.fetch | sed-e's.heads.tags.g')”
    git config remote.$r.tagopt--无标记
    完成
    git远程更新
    
  • 将合并的存储库推送到远程存储库(从现在起,这将是“官方”存储库)


谢谢。听起来这是一种有趣的方法,但您是否知道有哪些资源/工具可以帮助您安全地完成此任务?我快速查看了一个svn转储文件,但不知道从哪里开始(更不用说处理合并问题了,例如客户端和服务器同名的两个分支…)-在转储文件中搜索
节点路径。如果您执行了复制/移动操作,
Node copyfrom path
可能也与此相关。老实说,这件事似乎超出了我的想象。。。在如此大规模的情况下进行一些正则表达式搜索/替换,在svn内部转储格式上乱搞并不是我所希望的解决方案。谢谢你建议这个方向!