【问题标题】:How do I set a default merge strategy specific to a file with Git?如何使用 Git 设置特定于文件的默认合并策略?
【发布时间】:2014-06-01 10:51:36
【问题描述】:

这个问题不是特定于 iOS 的,但为了清楚起见,我在此处包含了实际用例

我运行一个名为Foobar 的iOS 项目,显然它处于版本控制之下。 在 iOS 项目环境中的项目文件中,有一个名为 Foobar-Info.plist 的文件,它是一个 XML 文件,用于存储有关项目的有趣信息,例如版本和我所做的构建数量。

每次构建项目时,我都会增加存储在此文件中的构建计数,如下所示:

...
<key>BuildCount</key>
<string>2203</string>
<key>CFBundleShortVersionString</key>
<string>0.0.4</string>
<key>CFBundleVersion</key>
<string>0.0.4-release/0.0.4.2203</string>
...

其中 '0.0.4-release' 是 git-flow 分支名称,2203 是内部版本号。这是在CFBundleVersion 字段中使用的,因此对我来说构建的来源非常明显。

想象一下,在另一个分支中,自发布以来我已经取得了很大的进步,并且相同的字段看起来像:

...
<key>BuildCount</key>
<string>2754</string>
<key>CFBundleShortVersionString</key>
<string>0.0.4</string>
<key>CFBundleVersion</key>
<string>0.0.4-feature/add-quux-and-baz.2754</string>
...

假设我完成了发布,它被合并到主线 develop 分支中。

问题

为了获得发布分支中所做的最新更改,我想将功能分支重新定位到develop

当这种情况发生时,Foobar-Info.plist 将在变基过程中的每次提交时导致冲突。这是因为每次提交都会增加内部版本号;我必须通过手动选择行来手动合并最新版本的行。请注意,三向差异的基本版本也会有所不同。

<string>2000</string>  // Base
<string>2754</string>  // Local   ** always pick this one; it's the latest
<string>2203</string>  // Remote

我如何告诉 git 对于一个特定的文件 Foobar-Info.plist,我希望它通过进行最新的更改来为我解决冲突?

编辑:文件必须保存在源代码控制之下。我想保留BuildCount,因为它是我在项目中投入的努力的一个很酷的迹象,我想保留它!我知道这个数字只表示完成的最小构建数量,但这对我来说已经足够了。

【问题讨论】:

  • 我找到了stackoverflow.com/questions/928646/…,这可能是我的问题的答案。
  • “复制合并”不是我想要的。我有点想要一个仅用于冲突的副本合并。其他更改仍应照常应用和合并。
  • 另一件事:它不是复制合并,因为最新的更改不一定是本地分支:可以想象develop 具有来自其他功能的提交,这些功能具有更大的构建分支中的编号正在重新设置。
  • 我还发现了这个:stackoverflow.com/questions/7607125/… 他们编写了自己的合并驱动程序来处理他们的情况。

标签: git merge git-merge branching-strategy


【解决方案1】:

我意识到这是一个迟到的答案,但如果我理解您的问题,您正在寻找的是一个 .gitattributes 文件。

您可以使用来自.gitattributes 文件的相对路径为特定文件或文件夹指定合并策略,如下所示:

* text=auto
path/to/your/file.plist merge=union

【讨论】:

  • merge=union 结合了两个版本,所以你最终得到 CFBundleVersion100101
猜你喜欢
  • 1970-01-01
  • 2023-02-11
  • 2020-02-05
  • 2012-12-15
  • 1970-01-01
  • 2018-09-08
  • 2020-11-21
  • 2012-07-05
  • 2014-06-02
相关资源
最近更新 更多