gpt4 book ai didi

git - Git有没有办法让 future 的 merge 忽略分支之间pom文件中的版本号差异?

转载 作者:太空狗 更新时间:2023-10-29 12:54:43 25 4
gpt4 key购买 nike

我的团队正计划从 Perforce 切换到 Git,我正试图找到一种方法让 Git 忽略分支之间的 pom 版本差异。这在 Perforce 中运行良好,我没有运气用 Git 重现该行为。

这是我的步骤:

  1. 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'.
  2. 从中创建子分支

    ndeckard@ws /c/dev/proj/testgit (release/1.0)
    $ git branch branch/FEA-650
  3. 切换到新分支

    ndeckard@ws /c/dev/proj/testgit (release/1.0)
    $ git checkout branch/FEA-650
    Switched to branch 'branch/FEA-650'
  4. 更新子分支pom版本

    <version>1.0.0-FEA-650-SNAPSHOT</version>
  5. 添加并提交

    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(-)
  6. 切换回父分支

    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'.
  7. 将子分支 merge 到父自动接受的父分支版本中(使用“我们的” merge 策略)

    ndeckard@ws /c/dev/proj/testgit (release/1.0)
    $ git merge branch/FEA-650 -s ours
    Merge made by the 'ours' strategy.
  8. 尝试将子项第二次 merge 到父项中(已经是最新的。)很好。这就是我想要的

    ndeckard@ws /c/dev/proj/testgit (release/1.0)
    $ git merge branch/FEA-650
    Already up-to-date.
  9. 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-SNAPSHOT1.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com