Git - 如何管理不同分支中的构建文件?

时间:2010-05-14 14:55:14

标签: git git-svn

一些背景

我一直在使用Git一段时间。我一直在研究的项目在分支/标签方面并不是太复杂。

我决定在工作中使用git-svn。 SVN存储库有许多不同的分支。很多这些分支机构都是客户定制的主干版本。

问题

我经常在不同的时间为不同的客户解决问题。所以我一直在分支之间来回切换。问题是,每次我在分支之间切换时,为了测试产品,我必须重建项目。构建需要> 2小时(从头开始):(

我假设有一种方法可以在分支customer_a中存储构建文件,然后检出customer_b,修改,构建,测试,提交。然后隐藏构建文件并再次检出customer_a并弹出customer_a存储以返回到我所在的位置。

仅在跟踪(即添加或提交)构建文件时才有效。我不想跟踪构建文件,我绝对不想检查它们。有没有办法为非跟踪文件存储(或做类似的事情)?还是人们用来达到相同类型的常用做法?

请注意,我们的项目构建方式每个库(其中有数千个)会构建库文件夹本地的文件,即它们不会移动到项目根目录下的构建文件夹。所有构建的文件遍布整个地方。

更新...

所以基于一些评论,我认为我需要举例说明我的问题

这是我的文件夹结构。

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

所以问题在于branch1branch2具有相同的祖先但却分歧了很多。因此,如果我查看branch1并构建它,我将获得我在Makefile中链接的二进制文件(例如lib_1.o)以构建最终的组件二进制文件。

如果我然后结帐branch2c1.c进行更改并运行make it尝试链接到branch1(lib_1.o)创建的二进制文件,因为它们仍然存在在上一个分支中构建的目录中。为了避免这种情况,每次切换分支时都需要进行干净的构建(这需要几个小时)。

5 个答案:

答案 0 :(得分:5)

所以这个问题暂时没有得到答复,我只是在本地尝试不同的解决方案。

我提出的最好的方法是使用pre amd post checkoout hooks。

这就是我所做的

  1. 在存储库的顶层创建一个.binaries文件夹,并将其添加到.gitignore文件中。

  2. 同时将二进制文件的文件格式添加到.gitignore文件中。

  3. 使用您喜欢的脚本语言编写脚本,以查找所述格式的所有文件,这些文件将它们移动到相同路径结构下的.binaries/<BRANCH>/文件夹,例如src/library1/lib1.o应移至.binaries/<BRANCH>/src/library1/lib1.o - 这应该通过预先结帐来调用

  4. 编写脚本将文件从.binaries文件夹移动到当前分支中,例如.binaries/<BRANCH>/src/library1/lib1.o应移至src/library1/lib1.o - 这应该通过结帐后调用

  5. 现在,在分支之间切换将恢复为仅在该分支期间构建的二进制文件,并且在创建新分支时您将获得干净的结帐。

答案 1 :(得分:1)

也许我错过了一些明显的东西,但是当切换分支时,Git不会触及未跟踪或忽略的文件,所以如果你在一个分支中构建产品然后切换到另一个分支,那么构建的产品应该保留。

答案 2 :(得分:0)

问题是你需要找回正确的二进制文件:

  • 不仅需要正确的分支,
  • 但也适用于正确的版本

如果你继续开发2个分支的最新版本,那么最后一点并不是特别重要(如果从那里签出旧标签和分支,则接受重建所有内容)。
但是,如果在构建之后,您会自动将这些“.o”文件发布到用于管理二进制文件的存储库中,这样可以很好地解决您的问题。
例如,本地的Nexus回购是合适的。

答案 3 :(得分:0)

我通常通过将2个克隆的repo创建到2个单独的文件夹(称为customer_a和customer_b)并在一个文件夹中checkout branch1和在另一个文件夹中的branch2来解决这些问题。

答案 4 :(得分:0)

您是否考虑过工作树?

$ git worktree add ../branch2 branch2

这将创建一个工作树结帐到branch2

$ cd ../branch2
$ git branch
* branch2

您只有1个本地仓库,但有2个不同的工作区域,一个用于主仓,另一个用于分支2.

这样你就可以将目标文件分开。