【问题标题】:Exclude some files from inter-branch merges in git从 git 中的分支间合并中排除一些文件
【发布时间】:2017-07-15 05:27:49
【问题描述】:

我有几个文件(一个 pom.xml 和一个 appengine-web.xml(GAE 配置文件)),我想在同一个项目的不同分支中保持不同的状态。

之前有人问过类似的问题,我之前看到的两个解决方案是:

  • git merge --no-commit from-branch,以及,
  • 在同一目录中创建文件 .gitattributes,使用以下行:filename.ext merge=ours(释义)

如果在合并过程中发生冲突,这两个都只保护当前分支中的文件不被合并。在 FF 合并的情况下,当前分支中的版本会被覆盖。我希望这些文件即使在 FF 合并的情况下也不会被覆盖。

难道没有办法保护当前分支中的版本不被合并覆盖,除非被特定文件的命令调用?

我目前不签入每个分支的文件,将它们放在存储区,然后当我回到分支时从那里恢复。有没有更高效、更不容易出错的方法?

【问题讨论】:

    标签: git merge


    【解决方案1】:

    另一种方法是:

    • 跟踪pom.xml
    • 跟踪 pom.xml.masterpom.xml.mybranch:这样,任何合并都不会影响它们,因为它们的名称不同。

    然后,您可以版本和跟踪:

    • 每个分支一个 pom.xml(在所述分支之后有一个命名约定)。
    • 一个脚本能够根据当前分支获取正确的 pom.xml.<abranch> 文件,并生成 pom.xml 文件(未跟踪,私有)
    • .gitignore 忽略生成的 pom.xml 文件
    • .gitattribute 声明涂抹内容过滤器(见下文)

    实际pom.xml 的生成是通过content filter driver 自动生成的,使用.gitattributes declaration


    (图片来自"Customizing Git - Git Attributes"来自“Pro Git book”))

    在本地配置中声明内容文件管理器驱动程序后,它将自动在git checkout 上为您生成pom.xml 文件。
    请参阅“Best practice - Git + Build automation - Keeping configs separate”中的完整示例。

    appengine-web.xml 文件重复相同的想法。

    【讨论】:

    • 谢谢!我会研究一下并尝试一下,看来这可能是我的解决方案。
    • +1 - 如果您没有可以为您执行此操作的构建系统(或者不想假设或调用一个)
    • 困惑。涂抹过滤器是否获得要“涂抹”的文件名?是否还必须定义清洁过滤器?可以在未跟踪的文件上运行污迹过滤器吗?创建了特定于分支的文件,但没有写出 pom.xml 的任何地方(在我的情况下,我只需将 pom.xml. 复制到 pom.xml)。
    • @markvgti 涂抹过滤器是否将文件名设为“涂抹”?不:它适用于您在.gitattributes. 中定义的内容(在您的情况下:pom.xml.* filter=my_smudge_filter)“是否还必须定义干净的过滤器?”不:您不修改任何跟踪文件,因此您不必清理任何跟踪文件。您使用涂抹来生成未跟踪的文件。 “可以在未跟踪的文件上运行涂抹过滤器吗?”:不,因此我建议跟踪 pom.xml.xxx,并从那里生成实际的 pom.xml
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 2011-04-21
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2015-06-17
    • 2012-02-24
    相关资源
    最近更新 更多