可以将Git配置为始终将对一个分支中的文件的更改合并到另一个分支中的不同文件中吗?

问题描述 投票:0回答:2

我在GitHub上维护一个Ghost主题的自定义版本。它正在从主要的TryGhost / Casper回购中获取常规的更改,这不太难以跟踪。

有一件事困扰着我,这与我主题中的custom-*.hbs文件有关。每当Ghost更新post.hbs时,我必须记住将这些更改合并到每个custom-*.hbs模板中。

有没有办法告诉Git post.hbs的变化必须总是合并到我的多个文件中?

  • post.hbs - > post.hbs
  • post.hbs - > custom-blogger.hbs
  • page.hbs - > page.hbs
  • page.hbs - > custom-training.hbs
  • 等等

目前的回购可以在这里找到:

现在,我已经使用手动区分更改并将其应用于相关文件。

git ghost
2个回答
1
投票

简短的回答是否定的,这有点不幸。

当Git正在进行真正的合并 - “合并为动词”时,我喜欢称之为-Git与三个提交一起工作:Git自己发现的合并基础,以及两个提交提交。根据定义,其中一个提示始终是HEAD,另一个通常由一些分支名称标识:

          o--o--X   <-- you-are-here (HEAD)
         /
...--o--*   [merge base]
         \
          o--o--Y   <-- other-branch

像往常一样,所有三个提交都是所有文件的快照。 Git执行合并 - 组合自合并base-by以来实际运行的不同更改:

git diff --find-renames <hash-of-*> <hash-of-X>   # what we changed
git diff --find-renames <hash-of-*> <hash-of-Y>   # what they changed

然后Git梳理这些差异 - 由两个diff命令产生的变化集 - 并将文件配对,这样它就知道基础中的file.ext与我们和/或他们的file.ext文件相同。

如果重命名检测器检测到基础中的file.ext在我们的提交newname.ext中变成了X,Git知道它应该将他们对file.ext所做的更改与我们对newname.ext-vs-file.ext所做的更改结合起来,将最终结果存储在newname.ext中。但这完全是成对的。尽管git diff支持多个“查找副本”选项,但git merge没有“查找副本”选项。此外,没有“打破现有配对”选项(git diff有一个,-B有一个阈值,类似于-M用于重命名查找,-C用于复制查找):如果合并基础和一个提示包含一个路径为P的文件,该文件对在合并期间配对。如果合并基础和另一个提示包含路径为P的文件,则该文件对同样配对。

因此,如果你的合并基础包含post.hbs并且两个提示都包含post.hbs,那么配对是严格的post.hbs = post.hbs


1
投票

简答:不。但你可以使用git-merge-file来达到这样的目的:

git merge-file <current-version> <common-ancestor> <other-version>

您可以使用第三个占位符文件来创建“common-ancestor”,其中应包含预合并主文件:

git show HEAD~1:post.hbs > parent-post.hbs

然后运行以下将进行3向合并:

git merge-file custom-post.hbs parent-post.hbs post.hbs

为了自动化它,您需要创建一个post-merge githook,它在常规合并之后运行,重新创建common-ancestor文件,然后合并更改。

如果custom-*文件与其非自定义文件相同,请考虑使用symlinks

© www.soinside.com 2019 - 2024. All rights reserved.