9

分支的颠覆概念似乎集中在为整个存储库创建一个 [un] 稳定的分支以进行开发。是否有创建单个文件分支的机制?

对于用例,请考虑一个具有多个特定于平台的源 (*.c) 实现的通用头 (*.h) 文件。这种类型的分支是永久性的。所有这些分支都会看到持续的发展,偶尔会出现跨分支合并。这与通常具有有限生命周期的不稳定开发/稳定发布分支形成鲜明对比。

不想分支整个存储库(便宜与否),因为它会产生不合理的维护量以在主干和所有分支之间不断合并。目前我正在使用 ClearCase,它有一个不同的分支概念,这使得这很容易。我被要求考虑过渡到 SVN,但这种范式差异很重要。我更关心的是能够轻松地为单个文件创建替代版本,而不是像切割稳定的发布分支这样的事情。

4

8 回答 8

9

您不必分支整个存储库。您可以在项目中创建文件夹分支(例如包含文件夹)。正如其他人所指出的,您也可以只对单个文件进行“复制”。获得文件或文件夹的副本后,您“切换”到分支文件或文件夹以处理分支版本。

如果您在存储库中创建一个单独的分支文件夹,您可以通过服务器端命令将您的分支文件复制到那里:

svn 复制 svn://server/project/header.h svn://server/branched_files/header.h

然后您可以切换该文件以使用branches_files存储库路径

于 2008-09-22T20:42:06.137 回答
3

可悲的是,我认为这里真正的答案是 ClearCase 比 Subversion 更好地处理这种情况。使用颠覆,你必须分支一切,但 ClearCase 允许一种“懒惰分支”的想法,这意味着只有特定的一组文件被分支,其余的仍然遵循主干(或你指定的任何分支)。

此处提供的其他解决方案并不能真正按您的意愿工作,它们只是将文件复制到不同的路径。现在您必须做一些奇怪的事情才能实际使用该文件。

嗯,对不起。这真的不是一个很好的答案。但是 Subversion 并没有很好的解决方案。它的模型是分支合并。

编辑:好的,所以扩展 crashmstr 所说的内容。你可以这样做:

svn cp $REP/trunk/file.h $REP/branched_files/file.h
svn co $REP/trunk
svn switch $REP/branched_files/file.h file.h

但是哇!,是不是很容易出错。每当您执行 svn st 时,您都会看到:

svn st
    S  file.h

有点吵。而且,当您想在大型源存储库中分支一些文件或模块时,它会开始变得非常混乱。

实际上,这里可能有一个不错的项目,用于模拟 ClearCase 的带有 svn 属性的分支文件和切换,围绕 bog 标准 svn 客户端编写一个包装器来处理所有的混乱。

于 2008-09-22T20:54:50.193 回答
3

这是我如何理解你的问题。您有以下树:

时间.h
时间.c

对于多种架构,您需要拒绝它:

time.h 很常见
time.c (for x386), time.c (for ia64), time.c (for alpha),...

同样在您当前的 VCS 中,您可以根据需要从 time.c 创建尽可能多的分支,当您从 VCS 签出文件时,您会自动检查公共主干中的最新 time.h 和分支中的最新 time.c你正在努力。

您担心的问题是,如果您在签出分支时使用 SVN,您将不得不经常从主干合并 time.h,或者冒着处理旧文件(与主干相比)的风险,这样的开销是不可接受的给你。

根据您的源代码的结构,可能会有一个解决方案。想象你有

 
/
/标题/
/headers/test.h
/来源/
/source/test.c

然后你可以分支 /,并使用svn:externals功能将你的标题链接到主干的头部。它仅适用于目录,并且在提交回 test.h 方面存在一些限制(您必须进入头目录才能使其工作)但它可以工作。

于 2008-09-22T21:45:23.100 回答
1

Subversion“分支”只是存储库中某些内容的副本。因此,如果您想分支文件,您只需执行以下操作:

svn copy myfile.c myfile_branch.c
于 2008-09-22T20:33:43.990 回答
1

我认为分支单个文件没有多大意义?有没有办法用trunk代码测试它?

如果您想撤销更改并稍后应用它们,您可以使用补丁。

于 2008-09-22T20:57:14.057 回答
1

您确定您的 VCS 中确实需要此功能吗?

为什么不使用 C 预处理器并 #ifdef 去掉不需要的代码?或任何类似的工具。

就像是:

// foo.h:
void Foo();

// foo_win32.c
#ifdef _WIN32
void Foo()
{
   ...
}
#endif

// foo_linux.c
#ifdef _GNUC
void Foo()
{
   ...
}
#endif

有时,如果它不合适,那么它不是正确的解决方案。

于 2008-09-22T21:03:46.820 回答
0

SVN 中的一个分支只是一个副本。我相信要按照您希望的方式进行操作,您必须将文件的每个版本都放在存储库的单独目录中,并将其检出到您的源文件夹中。IE 将该文件视为一个单独的项目。

于 2008-09-22T20:35:54.077 回答
0

Subversion 中的一个分支正是您所说的。所有文件都是主干的精确副本,您更改的文件除外。这就是 SVN Book 中谈到的“廉价复制”方法论。唯一需要注意的是需要不时将主干合并到分支中,以确保在那里所做的更改反映在分支中。当然,如果不需要这些更改,则不需要进行主干-> 分支合并。

允许自动合并主干更改(模拟 Clear Case 范例)的一种简单方法是使用预提交挂钩脚本在提交之前合并主干更改。(实际上,这始终是防止代码漂移的好策略)。

于 2008-09-22T21:52:54.017 回答