Nat*_*ard 8 git merge perforce pom.xml maven
我的团队正计划从Perforce切换到Git,我试图找到一种方法让Git忽略分支之间的pom版本差异.这在Perforce中运行良好,我没有运气再现Git的行为.
这是我的步骤:
结帐父母分支
ndeckard@ws /c/dev/proj/testgit (master)
$ git checkout release/1.0
Switched to branch 'release/1.0'
Your branch is up-to-date with 'origin/release/1.0'.
Run Code Online (Sandbox Code Playgroud)从中创建子分支
ndeckard@ws /c/dev/proj/testgit (release/1.0)
$ git branch branch/FEA-650
Run Code Online (Sandbox Code Playgroud)切换到新分支
ndeckard@ws /c/dev/proj/testgit (release/1.0)
$ git checkout branch/FEA-650
Switched to branch 'branch/FEA-650'
Run Code Online (Sandbox Code Playgroud)更新子分支pom版本
<version>1.0.0-FEA-650-SNAPSHOT</version>
Run Code Online (Sandbox Code Playgroud)添加并提交
ndeckard@ws /c/dev/proj/testgit (branch/FEA-650)
$ git status
On branch branch/FEA-650
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: pom.xml
no changes added to commit (use "git add" and/or "git commit -a")
ndeckard@ws /c/dev/proj/testgit (branch/FEA-650)
$ git add pom.xml
ndeckard@ws /c/dev/proj/testgit (branch/FEA-650)
$ git commit -m "set feature branch pom version"
[branch/FEA-650 59e156e] set feature branch pom version
1 file changed, 1 insertion(+), 1 deletion(-)
Run Code Online (Sandbox Code Playgroud)切换回父分支
ndeckard@ws /c/dev/proj/testgit (branch/FEA-650)
$ git checkout release/1.0
Switched to branch 'release/1.0'
Your branch is up-to-date with 'origin/release/1.0'.
Run Code Online (Sandbox Code Playgroud)将子分支合并为父自动接受父分支版本(使用"我们的"合并策略)
ndeckard@ws /c/dev/proj/testgit (release/1.0)
$ git merge branch/FEA-650 -s ours
Merge made by the 'ours' strategy.
Run Code Online (Sandbox Code Playgroud)尝试将孩子第二次合并为父母(已经是最新的).好.这就是我要的
ndeckard@ws /c/dev/proj/testgit (release/1.0)
$ git merge branch/FEA-650
Already up-to-date.
Run Code Online (Sandbox Code Playgroud)结帐子项并将父项合并为子项(快速转发并将父母分支pom版本粘贴到子项上).不好.我需要它像上面说"已经是最新的"并保持子分支pom版本,因为它已经在子分支上
ndeckard@ws /c/dev/proj/testgit (release/1.0)
$ git checkout branch/FEA-650
Switched to branch 'branch/FEA-650'
ndeckard@ws /c/dev/proj/testgit (branch/FEA-650)
$ git merge release/1.0
Updating 59e156e..2f3a2a0
Fast-forward
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Run Code Online (Sandbox Code Playgroud)在第7步之后,我想在父母和孩子之间的任何一个方向合并说(已经是最新的.)
有没有办法让Git使未来的合并忽略分支之间的pom文件中的版本号差异?
我最初的想法是通过部分外部化 POM<version>计算来自动化您的 POM 版本号,请参阅答案中的进一步内容。如果您不想这样做,那么您需要重新评估您的 Git 工作流程。
合并两种方式,进入master然后返回到功能分支会导致问题。您git merge branch/FEA-650 -s ours使用我们的策略告诉 Git,您已将功能分支中的所有提交和更改都集成到 中master,包括pom.xml丢失的版本更改,但master保留了其版本。master 分支现在认为 feature 分支的 HEAD 是一个共同的祖先(它是合并时的父提交),所以当你将它合并回 feature 分支时,Git 说“当你合并到 master 时,一切都解决了,没有变化......快进”。
简单的答案是你应该在合并到 master 后重新分支到一个新的功能分支,给你的功能分支一个新的/后来最年轻的共同祖先,然后你需要以某种方式重放你的 POM<version>更改。您不应该继续在原始功能分支上工作,因为它已被合并。要从 master 获取新更改,您应该重新分支。似乎有些暗示您可能在未与 master 合并的功能分支上留下了更改,否则您将不再需要它并且可以重新分支,或者它可能只是<version>您感兴趣的更改提交。
有许多方法可以简化/加速/自动化重新分支时的版本号管理,从外部化(见下文)到cherry-picking占位符分支,使用 Maven 插件,例如Versions Maven Plugin。
原答案
另一种方法是<version>根据分支元数据或来自 CI 的其他输入,在外部计算POM 文件之外的最终/有效值。在 Maven 中这样做有点棘手,而无需pom.xml在结帐后预先调整自己,但请查看Maven External Version Plugin。
它与 Maven 生命周期挂钩,并将动态构建一个pom.xml.new-version文件(您可以.gitignore),根据您提供的任何内容(功能分支名称、git commit 哈希等)动态替换全部或部分版本号。
构建/部署插件并将其添加到您的 POM:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-external-version-plugin</artifactId>
<version>0.1.0-SNAPSHOT</version>
<extensions>true</extensions>
<configuration>
<strategy hint="sysprop"/>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
...然后通过替换版本字符串获得创意,例如您可以:
mvn install -Dexternal.version-qualifier=$(git symbolic-ref --short HEAD| sed s_^master\$__)
Run Code Online (Sandbox Code Playgroud)
...这将改变1.2.3-SNAPSHOT到1.2.3-FEA-650-SNAPSHOT如果当前已签出的Git分支FEA-650。您可能需要考虑在分支命名策略中替换/with -,这取决于 Maven 的看法(我觉得/s 令人困惑,但这只是我),或相应地修改sed。
在最坏的情况下,这将允许您从 POM 中删除您的版本号,因此其他 POM 更改可以安全地合并并且已知为与版本号无关 - 如有必要,您可以使用 Maven 将版本号保留在另一个文件中属性插件加载它们并在需要时替换整个版本号。
每次合并都这样做可能会很麻烦,但这里有一个想法。
git merge --no-ff --no-commit <other-branch>
git checkout HEAD -- pom.xml
第一个命令允许您在合并完成之前更改内容,即使不存在任何合并冲突。第二个将 pom.xml 替换为当前分支上一次提交中的内容 - 有效地忽略来自其他分支的 pom.xml。
如果除 pom.xml 之外的任何文件中存在冲突,那么使用合并策略 --ours 就会出现问题,因此我会厌倦将其用于此目的。