代码之家  ›  专栏  ›  技术社区  ›  Will

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

  •  15
  • Will  · 技术社区  · 15 年前

    一些背景

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

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

    问题

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

    我假设有一种方法可以在分支中存储构建文件 customer_a 然后结账 customer_b ,修改,构建,测试,提交。然后保存构建文件并签出 顾客A 再次打开 顾客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 有着相同的血统,但有很大的分歧。所以如果我退房 鳃1 然后构建它,我将得到二进制文件(例如lib_1.o),在我的 Makefile 以构建最终的组件二进制文件。

    如果我再结账 鳃2 更改为 c1.c 运行make它尝试链接到由 鳃1 (lib_1.o),因为它们仍然存在于前一个分支中构建的目录中。为了避免这种情况,我必须在每次切换分支时(这需要几个小时)进行一次干净的构建。

    5 回复  |  直到 7 年前
        1
  •  5
  •   Will    15 年前

    可以

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

    我想到的最好的方法是使用检查前和检查后挂钩。

    这是我做的

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

    2. 将二进制文件的文件格式添加到 吉蒂格诺 文件也。

    3. 用您最喜欢的脚本语言编写脚本,以查找将其移动到 .binaries/<BRANCH>/ 同一路径结构下的文件夹,例如 src/library1/lib1.o 应移至 .binaries/<BRANCH>/src/library1/lib1.o -这应该通过预结账来调用

    4. 编写脚本以将文件从 二进制文件 文件夹到当前分支,例如 .binaries/<branch>/src/library1/lib1.o 应移至 源代码/库1/lib1.o -这个应该在结账后调用

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

        2
  •  1
  •   mipadi    15 年前

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

        3
  •  0
  •   VonC    15 年前

    问题是您需要返回正确的二进制文件:

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

    最后一点并不太重要,如果你继续开发你的2个分支的最新版本(如果你从那里签出一个旧的标签和分支,接受重建所有东西)。
    但是,如果在构建之后,您自动将那些.o'文件发布到为管理二进制文件而创建的存储库中,这将很好地解决您的问题。
    例如,本地Nexus回购是合适的。

        4
  •  0
  •   Magnus    13 年前

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

        5
  •  0
  •   Alan    7 年前

    你想过行道树吗?

    $ git worktree add ../branch2 branch2
    

    这将创建一个工作树签出到Branch2

    $ cd ../branch2
    $ git branch
    * branch2
    

    您只有1个本地回购,但有2个不同的工作区,一个用于主服务器,另一个用于分支机构2。

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