【问题标题】:Git - How do I manage built files in different branches?Git - 如何管理不同分支中的构建文件?
【发布时间】: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

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

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

【问题讨论】:

  • 这不是版本控制问题,而是构建工程问题。您需要能够将构建工件(目标文件、库存档、可执行文件)定向到单独的子树,每个子树对应您正在处理的每个客户/任务。
  • @Novelocrat 我有点同意。我也希望构建文件是某个地方的构建文件夹。但是我的同事使用 SVN,而我在这里问的问题可以使用 SVN,因为每个分支在本地机器上都有自己的文件结构。所以这也是一个 SCM 问题(因为它在 SVN 中是可能的,但在 Git 中是不可能的)。
  • 如果人们从 Subversion 检出多个分支,那么没有理由不能在 Git 中使用多个工作树,每个树都检出不同的分支。效果完全一样,只是 Git 会共享元数据,从而使用更少的磁盘空间。
  • 效果只对跟踪文件相同(据我所知)。如果我切换分支,它不会保护未跟踪的文件。我在上面的问题中添加了更多信息,以举例说明我的问题。

标签: git git-svn


【解决方案1】:

好的

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

我想出的最好的方法是使用 pre amd post checkout hook。

这是我所做的

  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 - 这应该在结帐后调用

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

【讨论】:

  • 这太好了,非常感谢!我想知道您是否对不止一个开发人员的类似情况有想法?可能将 .binaries 放在共享网络文件夹中?而且我认为 VonC 是正确的,它需要适用于版本,而不仅仅是分支......
  • 是的,这也可以用于版本。你只需要决定你想做什么并适当地使用钩子。您可能会创建一个挂钩,该挂钩将在创建新版本时构建并部署到共享文件夹。
【解决方案2】:

你考虑过工作树吗?

$ git worktree add ../branch2 branch2

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

$ cd ../branch2
$ git branch
* branch2

您只有 1 个本地 repo,但有 2 个不同的工作区,一个用于 master,另一个用于 branch2。

这样您也可以将目标文件分开。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 没错,但是由于来源不同,构建的文件不同。因此,当我切换时,我希望在该分支上构建的内容出现,而不是在前一个分支上构建的内容。
    【解决方案4】:

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

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

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

    【讨论】:

    【解决方案5】:

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

    【讨论】:

    • 那你为什么用Git?
    猜你喜欢
    • 1970-01-01
    • 2011-12-29
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多