【问题标题】:Is is possible to use to use git-flow (or vanilla git), to have different set of (build) files on master & develop branches?是否可以使用 git-flow(或 vanilla git)在 master 和 development 分支上拥有不同的(构建)文件集?
【发布时间】:2014-01-18 15:41:25
【问题描述】:

可以使用 git-flow(或普通的 git 命令链,或其他 gitXXX 糖果)在 ma​​ster(即发布)和 上拥有一组不同的文件开发分支?

由于 git repos 用于部署(见下文),我希望我的 develop 分支包含严格的源文件,但是当我将它合并到 ma​​ster ,我希望 master(release) 分支也包含发布/编译输出、zip 文件、优化资源等。

注意:问题寻求:

  • 一个 示例场景git/git-flow 命令 将保持 develop 和其他分支清理编译/构建的东西,而只有 @ 987654324@ 将它们放在一个额外的 ./build 目录中。

  • 两个分支仍应保持良好同步,并且整个分支/合并过程应该是自动的、无痛且安全的。也许有一天它会成为标准的 git-flow 功能和实践。

  • 我知道这是不推荐的、麻烦的、非最佳的等,但请记住:

    • git repos 越来越多地用于部署 - 例如,请参阅http://bower.io,它严格使用 git repossemver 标签来部署编译的东西。

    • 该问题询问的是是否可能,而不是是否可取良好做法。如果不可能,最好有一个好的解释。

【问题讨论】:

  • 你真的不想在你的 git repo 中编译二进制文件。那是可怕的膨胀。让您的构建系统自动将结果复制到命名/日期文件夹中。
  • 我同意,在 git 上构建文件是一个坏主意 - 但我看到它经常发生,我希望至少让我的“开发”分支干净整洁......(如果你可以不要逃避它,试着享受它)
  • 我只是特别痛苦,因为我在工作中维护了一个原始的 git repo。它只是源代码,所以它克隆得非常快。然后有人倾倒在一堆DLL中。仅此一项就增加了几百 MB。 T_T
  • 正如修改后的描述中提到的,bower.io 严格使用 git repos 和 semver 标签来部署编译的东西。这个答案没有提供问题的答案,它只是反驳它。

标签: git git-branch bower git-flow


【解决方案1】:

听起来您想将 Git 用作构建或部署系统。这不是 Git 所做的,将已编译的工件包含在您的存储库中也不是一种好的做法。

考虑为您的环境使用合适的构建系统。

编辑更新后的问题:

如果您真的想这样做,完全可以将构建工件包含在一个分支中而不是另一个分支中。您可以在您的build 分支中简单地add 他们:

git checkout -b build
# Run build command
git add build/
git commit -m "Add build artefacts"

当您切换回master 时,您的构建目录将不存在。

作为Magnus mentions below,这可能会在合并过程中导致一些不愉快,但如果您只从master 合并到build 并且从不以其他方式在这方面应该没问题。它也确实增加了一些你在工作时需要牢记的心理包袱。

如果您要走这条路,我建议您只保留导致标记发布的构建提交。然后,您可以在提交消息中包含标签。我可能还会将源提交压缩为构建阶段的一个提交。

要运行新构建,您的方法类似于

git checkout build
git merge -s recursive -X theirs --squash master
# Run build command

现在,根据构建是否是您想要保留的版本,您可以保留它

git commit -a -m "Update build files for version 1.2.3"
git checkout master
git tag -a 1.2.3

或丢弃它

git reset --hard HEAD

我仍然不喜欢在您的源存储库中提交构建工件的想法,Bower.io 的人是 aware that this is a problem and are working on a solution(强调我的):

是否建议所有 bower 包都应在其 Git 存储库中包含构建文件?

不。正在开发一种类似 npm 的发布模型,以支持将构建的资产发布到 Bower 服务器,从而避免安装后和 check-in-of-build-products 反模式。在那之前,没有像 jQuery Mobile 这样的安装包的好方法。

很遗憾,在过去的十个月里,这方面似乎没有太大进展。

【讨论】:

  • 我和克里斯的家伙在这里。 GIT 没有提供自动化的方法来做这样的事情。在我们的环境中,构建工件及其归档策略是构建系统的功能,而不是版本控制系统。
  • 我同意反对这样做的理由(请参阅对问题本身的评论) - 但这个答案仍然没有真正解决所问的问题。
  • 正如修改后的问题中提到的,bower.io 严格使用 git repos 和 semver 标签来部署编译的东西。这个答案没有提供问题的答案,它只是反驳它。
  • @AgelosPikoulas,我已经更新了我对您修改后的问题的回答。希望您发现它更有帮助。 (尽管我确实相信“不要那样做”的答案有时是合适的。)
  • @Chris 谢谢,修改后的问题更适合问答 :-) 我投了赞成票,但如果出现更完整/git-flow 的答案,我会留下未回答的问题。跨度>
【解决方案2】:

我完全同意其他 cmets - 将二进制工件与源代码一起提交。根据您的二进制文件的大小,您可能会严重影响存储库的大小(以及克隆它所需的时间),甚至会使其过大。

但是,要回答您的问题,在两个分支上有不同的文件集是完全可以的。如果您从具有文件超集的分支合并,则此类分支之间的合并可能会出现问题,因为 Git 想要在合并中包含这些文件,但在您的情况下,它是目标分支包含文件的超集,然后就可以了。

【讨论】:

  • 我认为这是更接近要求的答案 - 您能否提供一个简单的示例以及可能出现问题的命令链及其解决方法
  • @AgelosPikoulas:具体的例子是什么?如果从 A 合并到 B,添加到分支 A 的文件将包含在分支 B 中?
  • 如果我们能有一个 git-flow 感知(或 vanilla git)场景以及能够保持开发 clean 已编译/构建内容的命令,而 master将它们放在一个额外的 ./build 目录中,但仍保持良好同步。这甚至可能吗?
猜你喜欢
  • 2013-12-04
  • 2017-03-18
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
相关资源
最近更新 更多