20

这是我目前用于我的 svn 项目的工作流程(我从不使用 svn 分支,有些项目也由其他人积极参与):

  • 在服务器上,执行git svn fetch可能需要数小时的初始操作。还要创建一个“构建”分支。
  • 在开发机器上克隆现在很快:git clone srv://project.git, git checkout build然后git update-refs ..., git svn fetch恢复到 svn 存储库的链接
  • 工作,承诺,工作承诺,...
  • 检查事情是否正常,git push build到服务器并触发该分支的 Hudson 构建
  • 存储工作,以便我可以从另一台机器上工作,同时推送构建分支
  • 满意后,按逻辑步骤将提交合并在一起(例如,每个错误一个),提交到 svn 并重置所有内容,例如git checkout master, git merge build, git svn dcommit, git push, git checkout build, git rebase master, git push build

输入 svn 外部。我已经在这里尝试了每个脚本,但都失败了。我的外部设置如下:

/path/to/x x
/path/to/y/z y/z
/path/to/a/b.file a/b.file

并且脚本执行诸如尝试/path/to/x在文件系统的根目录中创建和git svn fetch /path/to/x. 此外,单个文件似乎会导致更多问题。(子问题 1:这些脚本编写的 svn:externals 格式是什么?)

修改其中一个脚本来处理我的情况并正确复制我所追求的目录结构似乎并不难,但是我遇到了一个主要问题:如果我同时更改 x 和 y/z 中的文件目录,我看不到将其加入单个 svn 提交的方法,这就是我首先开始使用 git 的原因之一。

因此,问题是:有没有一种方法可以复制上述工作流程,仅使用某个 svn 存储库的一部分,以便我可以在根目录中执行 svn dcommit?我更喜欢在 linux 和 windows 上都可以使用的即用型解决方案。

编辑我快速破解了我找到的一个脚本,并使其复制了 svn 外部的目录结构。我无法克隆单个文件,这里是输出:

git svn clone -r HEAD srv://svn/repo/path/to/projects.sln
Initialized empty Git repository in xxx/projects.sln/.git/
Invalid filesystem path syntax: REPORT request failed on '/svn/repo/!svn/vcc/default':
  Cannot replace a directory from within at yyy/git/libexec/git-core/git-svn line 5114

子问题2:通过git svn 获取单个文件是不可能的吗?

4

2 回答 2

14

不幸的是,svn 的外部非常灵活。我遇到了许多将它们视为 <path> <url> 的脚本,但也允许使用 <url> <path>。所以我认为有些剧本在这方面只是被打破了。

回答你的第二个子问题:不。'git svn fetch' 需要对 Subversion 的 repo 的子树进行操作,但它必须是可以像分支一样对待的东西。唯一能很好地映射到该范式的是目录(例如,trunk/)。FWIW、Bazaar 和 Mercurial 也在这里受苦。归根结底,Subversion 只是一个版本化的文件系统,而 Git 有一个一流的分支概念。这是阻碍的不匹配之一。:-(

于 2011-04-05T01:55:18.050 回答
1

只是关于第二个子问题的另一个注释。据我所知,截至今天,颠覆也不支持文件的svn外部,只支持文件夹。所以我猜这些属性中的条目是无效的。不知道是否有任何工具可以处理这种情况。

于 2013-01-31T19:48:20.763 回答