我在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正在进行真正的合并 - “合并为动词”时,我喜欢称之为-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
。
简答:不。但你可以使用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
。