- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的团队正计划从 Perforce 切换到 Git,我正试图找到一种方法让 Git 忽略分支之间的 pom 版本差异。这在 Perforce 中运行良好,我没有运气用 Git 重现该行为。
这是我的步骤:
check out 父分支
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'.
从中创建子分支
ndeckard@ws /c/dev/proj/testgit (release/1.0)
$ git branch branch/FEA-650
切换到新分支
ndeckard@ws /c/dev/proj/testgit (release/1.0)
$ git checkout branch/FEA-650
Switched to branch 'branch/FEA-650'
更新子分支pom版本
<version>1.0.0-FEA-650-SNAPSHOT</version>
添加并提交
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(-)
切换回父分支
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'.
将子分支 merge 到父自动接受的父分支版本中(使用“我们的” merge 策略)
ndeckard@ws /c/dev/proj/testgit (release/1.0)
$ git merge branch/FEA-650 -s ours
Merge made by the 'ours' strategy.
尝试将子项第二次 merge 到父项中(已经是最新的。)很好。这就是我想要的
ndeckard@ws /c/dev/proj/testgit (release/1.0)
$ git merge branch/FEA-650
Already up-to-date.
checkout 子节点并将父节点 merge 到子节点中(它快进并将父分支 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(-)
在第 7 步之后,我想在父子之间的任一方向 merge 说(已经是最新的。)
Git 有没有办法让以后的 merge 忽略分支之间 pom 文件中的版本号差异?
最佳答案
我最初的想法是通过部分外部化 POM 来自动化您的 POM 版本号 <version>
计算,请参阅答案中的进一步内容。如果您不想这样做,那么您需要重新评估您的 Git 工作流程。
双向 merge ,进入master
然后回到功能分支会导致问题。你的git merge branch/FEA-650 -s ours
使用 ours 策略告诉 Git 您已经将功能分支中的所有 提交和更改集成到 master
中,包括你的 pom.xml
版本更改,丢失,带有 master
保留其版本。 master 分支现在认为 feature 分支的 HEAD 是一个共同的祖先(它是 merge 时的父提交),所以当你将它 merge 回 feature 分支时,Git 说“当你 merge 到 master 时一切都已解决,没有变化……快进”。
简单的答案是你应该在 merge 到 master 后重新分支到一个新的特性分支,给你的特性分支一个新的/后来最年轻的共同祖先,然后你需要以某种方式重放你的 POM <version>
改变。你不应该继续在原来的功能分支上工作,因为它已经被 merge 了。要从 master 那里获取新的变化,你应该重新分支。似乎有一些暗示,您可能在未与 master merge 的功能分支上留下了更改,否则您将不再需要它并且可以重新分支,或者它可能只是 <version>
更改您感兴趣的提交。
有许多方法可以简化/加速/自动化重新分支的版本号管理,从外部化(见下文)到 cherry-picking
它来自占位符分支,使用 Maven 插件,例如Versions Maven Plugin .
原始答案
另一种方法是从外部计算最终/有效 <version>
在 POM 文件之外,基于分支元数据或来自 CI 的其他输入。在 Maven 中,如果不进行预修改,这有点棘手 pom.xml
checkout 后自己,但看看 Maven External Version Plugin .
它 Hook 到 Maven 生命周期并将构建一个 pom.xml.new-version
动态文件(你可以 .gitignore
),根据你提供的任何内容动态替换全部或部分版本号 - 功能分支名称,git commit hash 等。
构建/部署插件并将其添加到您的 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>
...然后通过替换版本字符串发挥创意,例如您可以:
mvn install -Dexternal.version-qualifier=$(git symbolic-ref --short HEAD| sed s_^master\$__)
... 这将改变 1.2.3-SNAPSHOT
至 1.2.3-FEA-650-SNAPSHOT
如果当前 checkout 的 Git 分支是 FEA-650
.您可能需要考虑更换 /
与 -
在你的分支命名策略中,取决于 Maven 的想法(我发现 /
令人困惑,但那只是我),或修改 sed
相应地。
在最坏的情况下,这将允许您从 POM 中删除版本号,因此可以安全地 merge 其他 POM 更改,并且已知这些更改与版本号无关——如有必要,您可以将版本号保存在另一个文件中,使用 Maven Properties Plugin 加载它们并在需要时替换整个版本号。
关于git - Git有没有办法让 future 的 merge 忽略分支之间pom文件中的版本号差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30407227/
我正在使用 Maven 3.x,我的父 pom 和子 pom 中有以下结构。 父类 com.mygoogle.sample workorder 1.0-SNAPSHOT pom 1.0-SN
我已将各个项目中的所有存储库配置重构为一个父 pom,该父 pom 是为了对存储库和分发管理等内容进行单点配置的特定目的而创建的。据我了解,这应该是最佳实践。将我的父 pom 部署到 Nexus 服务
我尝试使用 mvn help:effective-pom 命令在示例应用程序上生成有效的 pom。 http://books.sonatype.com/mvnref-book/reference/po
在一个项目中,我们有一个名为时间戳的属性,它没有在父 POM 和子 POM 中定义,但仍然可以在 pom.xml 中访问。任何线索将不胜感激。 最佳答案 它可以由插件设置(如 https://www.
我在使用“uploadArchives”上传存档时收到“无法初始化 POM pom-default.xml:无法验证 POM”。我也尝试了 maven-publish 插件,但仍然没有成功。我们将不胜
我创建了一个程序,使用 HTML5 canvas 绘制一个 pom pom,参数大小、x、y、蓬松度和颜色。 pom pom 是通过从中心出来的画线创建的,参数蓬松度决定了从中心出来的股数。我有一个确
我正在关注maven的教程。我有一个非常简单的项目,里面有几个模块。在模块 pom 上,我想通过 ${parent.groupid} 和 ${parent.version} 引用主项目 pom 版本和
当我构建我的项目时,我收到以下警告: [INFO] ------------------------------------------------------------------------ [
我正在尝试构建一个 Maven 项目。我的其他团队成员能够毫无问题地构建它。我收到以下错误: [WARNING] The POM for org.hectorclient:hector-core:ja
我目前正在为 Maven 苦苦挣扎:我有一个由几个嵌套模块组成的复杂项目,对于其中一些模块,我在 POM 中有类似的配置。 我想让它干净。实际上,我想定义一个“runnable-jar”通用配置并在某
我正在将 maven Artifact 推送到 nexus,对于版本号小于子 POM 的父 POM 是否有任何影响? 最佳答案 据我所知没有。多模块项目中的模块版本可能以任何可能的方式有所不同。但是,
我在 Eclipse (Helios) 中有一个项目,带有 Maven pom.xml。我的项目是一个将使用 Hibernate、MySQL 的 Web 应用程序。 但是我在正确处理 pom.xml
repository我的 build.grade 部分已: mavenLocal() //maven { url { 'http://192.168.2
在多模块项目结构中 myApp |-moduleA |---pom.xml |-moduleB |---pom.xml |-pom.xml 如果我在 parent.pom 中有以下属性 4
我为 Maven 插件编写了代码,用于更新 pom 文件中的版本号。但是,当我尝试保存新的 pom 时,它被保存为有效的 pom。有没有办法将其保存为解析之前的样子?谢谢! private Maven
我有一个父 pom 在 pluginManagement 中定义了插件的一些配置项,其中有一个特定的配置。我不想在 child pom 中。 我尝试覆盖我的子 pom 中的其他配置项,这有效,但“删除
我不确定这是否受 Maven 支持。我很感激我能得到的任何帮助。 我有一个定义依赖项和排除项的父 pom。我无法更改父 pom: foo bar 1.0
当前场景: 父pom有一个distributionManagement部分,里面定义了两个repositories(releases和snapshots);引用如下: 父 pom:
似乎有几种方法可以在多项目构建中构建父 pom,我想知道是否有人对每种方式的优点/缺点有任何想法。 拥有父 pom 的最简单方法是将其放在项目的根目录中,即 myproject/ myprojec
我想在我的 Maven 项目中定义一个本地存储库。 我有一个 super pom 和几个子模块。我的文件结构是: /root /repository /child po
我是一名优秀的程序员,十分优秀!