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

Git-如何管理不同分支中的构建文件? 一些背景,git,git-svn,Git,Git Svn,我已经使用Git有一段时间了。我一直从事的项目在分支/标记方面并不太复杂 我已经决定在工作中使用git svn。SVN存储库有许多不同的分支。许多分支都是客户定制的主干版本 问题 我经常在同一时间为不同的客户解决问题。所以我总是在分支之间来回切换。问题是,要测试产品,我必须在每次切换分支时重新构建项目。构建需要>2小时(从头开始):( 我假设有一种方法可以将构建文件保存在分支customer\u a中,然后签出customer\u b,修改、构建、测试、提交。然后保存构建文件并再次签出custo

我已经使用Git有一段时间了。我一直从事的项目在分支/标记方面并不太复杂

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

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

我假设有一种方法可以将构建文件保存在分支
customer\u a
中,然后签出
customer\u b
,修改、构建、测试、提交。然后保存构建文件并再次签出
customer\u a
,然后弹出
customer\u 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
所以问题是
branch1
branch2
有着相同的祖先,但有着相当大的差异。因此,如果我签出
branch1
并构建它,我将得到我在
Makefile
中链接的二进制文件(例如lib_1.o),以构建最终的组件二进制文件


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

  • 不仅需要正确的分支
  • 但也适用于正确的版本
如果您一直在开发两个分支的最新版本(如果您签出一个旧标记并从那里开始分支,则接受重建所有内容),那么最后一点并不太重要。
但是,如果在构建之后,您自动将这些“.o”文件发布到用于管理二进制文件的存储库中,这将很好地解决您的问题。
例如,本地Nexus回购协议是合适的。

好的

所以这个问题已经有一段时间没有答案了,我只是在本地尝试不同的解决方案

我想到的最好的一个方法是使用amd前后期检查挂钩

这就是我所做的

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

  • 将二进制文件的文件格式也添加到
    .gitignore
    文件中

  • 用您最喜欢的脚本语言编写一个脚本,以查找上述格式的所有文件,并将其移动到相同路径结构下的
    .binaries/
    文件夹中,例如
    src/library1/lib1.o
    应移动到
    。binaries//src/library1/lib1.o
    -这应通过预签出调用

  • 编写脚本将文件从
    .binaries
    文件夹移动到当前分支,例如
    。binaries//src/library1/lib1.o
    应移动到
    src/library1/lib1.o
    -这应通过签出后调用


  • 现在,在分支之间切换将恢复到仅为该分支在期间构建的二进制文件,并且在创建新分支时,您将有一个干净的签出。

    我通常通过将repo的两个克隆创建到两个单独的文件夹(称为customer_a和customer_b)来解决此类问题然后在一个文件夹中签出branch1,在另一个文件夹中签出branch2。

    您考虑过工作树吗

    $ git worktree add ../branch2 branch2
    
    这将创建一个工作树签出到branch2

    $ cd ../branch2
    $ git branch
    * branch2
    
    您只有1个本地回购,但有2个不同的工作区,一个用于master,另一个用于branch2


    这样,您也可以将对象文件分开。

    这不是版本控制问题,而是构建工程问题。您需要能够指导构建工件(对象文件、库存档、可执行文件)要分离子树,您正在处理的每个客户/任务都有一个子树。@Novelocrat我有点同意。我也希望将生成文件放在某个地方的生成文件夹中。但是我的同事使用SVN,我在这里提出的问题也可以用SVN实现,因为每个分支在本地计算机上都有自己的文件结构。因此这也是SCM的问题(因为这在SVN中是可能的,但在Git中是不可能的)。如果人们正在从Subversion签出多个分支,那么没有理由不能在Git中使用多个工作树,每个工作树都有一个不同的分支签出。效果完全相同,只是Git将共享元数据,从而使用更少的磁盘空间。效果仅对跟踪文件相同(据我所见)。如果我切换分支,它不会保护未跟踪的文件。我在上面的问题中添加了更多信息,以给出我的问题的示例。没错,但生成的文件是不同的,因为源不同。因此,当我切换时,我要的是