【发布时间】:2010-05-14 14:55:13
【问题描述】:
一些背景
我已经使用 Git 有一段时间了。我一直在做的项目在分支/标签方面并没有太复杂。
我决定在工作中使用 git-svn。 SVN 存储库有许多不同的分支。其中很多分支都是客户定制的主干版本。
问题
我经常在不同的时间为不同的客户解决问题。所以我一直在分支之间来回切换。问题是,为了测试产品,每次在分支之间切换时我都必须重新构建项目。构建需要 > 2 小时(从头开始):(
我假设有一种方法可以将构建文件存储在分支 customer_a 中,然后签出 customer_b,修改、构建、测试、提交。然后存储构建文件并再次签出customer_a 并弹出customer_a 存储以回到我所在的位置。
这仅在构建文件被跟踪(即添加或提交)时才有效。我不想跟踪构建文件,我绝对不想签入它们。有没有办法为未跟踪的文件存储(或做类似的事情)?还是人们用来实现相同类型事物的常见做法?
请注意,我们项目的构建方式每个库(其中有数千个)都构建了库文件夹本地的文件,即它们不会移动到项目根目录的构建文件夹中。所有构建的文件都散布在各处。
更新...
所以基于一些cmets,我认为我需要举一个我的问题的例子
这是我的文件夹结构。
branch1/
src/
component1/
c1.c
component2/
c2.c
libsrc/
library1/
lib_1.c
library2/
lib_2.c
branch2/
src/
component1/
c1.c
component2/
c2.c
libsrc/
library1/
lib_1.c
library2/
lib_2.c
所以问题是branch1 和branch2 具有相同的祖先,但分歧很大。因此,如果我查看 branch1 并构建它,我将获得我在 Makefile 中链接的二进制文件(例如 lib_1.o),以构建最终的组件二进制文件。
如果我随后检查 branch2 对 c1.c 进行更改并运行 make 它会尝试链接到由 branch1 (lib_1.o) 创建的二进制文件,因为它们仍然存在于内置目录中上一个分支。为了避免这种情况,我必须在每次切换分支时都进行干净的构建(这需要几个小时)。
【问题讨论】:
-
这不是版本控制问题,而是构建工程问题。您需要能够将构建工件(目标文件、库存档、可执行文件)定向到单独的子树,每个子树对应您正在处理的每个客户/任务。
-
@Novelocrat 我有点同意。我也希望构建文件是某个地方的构建文件夹。但是我的同事使用 SVN,而我在这里问的问题可以使用 SVN,因为每个分支在本地机器上都有自己的文件结构。所以这也是一个 SCM 问题(因为它在 SVN 中是可能的,但在 Git 中是不可能的)。
-
如果人们从 Subversion 检出多个分支,那么没有理由不能在 Git 中使用多个工作树,每个树都检出不同的分支。效果完全一样,只是 Git 会共享元数据,从而使用更少的磁盘空间。
-
效果只对跟踪文件相同(据我所知)。如果我切换分支,它不会保护未跟踪的文件。我在上面的问题中添加了更多信息,以举例说明我的问题。