java - Git 多樱桃选择与 Bash 抛出错误

标签 java bash git

我正在尝试同时为多个提交 ID 实现 Git Cherry Pick。 但它失败了,或者这不是它应该如何使用的。

我正在尝试从这里使用 bash 命令:https://stackoverflow.com/a/2553705/9614476

  #!/bin/bash

  if [ -z $1 ]; then
      echo "Equivalent to running git-cherry-pick on each of the commits in the range specified.";
      echo "";
      echo "Usage:  $0 start^..end";
      echo "";
      exit 1;
  fi

  git rev-list --reverse --topo-order $1 | while read rev
  do
    git cherry-pick $rev || break
  done

我为 ant 创建了一个像这样的目标:

<target name="git_multi_cherry_pick">
    <echo message="START: MultiMerge"/>
    <exec executable="C:\Program Files\Git\bin\bash.exe" osfamily="windows" failonerror="true">
        <arg value="${gitMultiCherryPick}"/>
        <arg value="${gitCommitIds}"/>
    </exec>
    <exec executable="/bin/bash" osfamily="unix" failonerror="true">
        <arg value="${gitMultiCherryPick}"/>
        <arg value="${gitCommitIds}"/>
    </exec>
</target>

我正在使用 Java 中的 AntExecutor 来调用上述目标。 AntExecutor 代码可以在这里找到 - https://github.com/asciidoctor/asciidoctor-ant/blob/master/src/test/java/org/asciidoctor/ant/AntExecutor.java

        Map<String, String> propertiesMap = new HashMap<>();
        propertiesMap.put("gitMultiCherryPick", "git-multi-cherry-pick.sh");
        propertiesMap.put("gitCommitIds", "204a3e81712000d09a2794cc4ef1d090c4280f4e,9c5242d6a15b14032e9fc1f408be3c91026b1e1f");
        List<String> sf_build = AntExecutor.executeAntTask("FullPath \\resources\\build\\build.xml",
                "git_multi_cherry_pick", propertiesMap);

但它因以下错误而失败:

可执行文件和参数周围的 ' 字符是 不是命令的一部分。,204a3e81712000d09a2794cc4ef1d090c4280f4e,9c5242d6a15b14032e9fc1f408be3c91026b1e1f,git-multi-cherry-pick.sh,致命:不明确的参数'204a3e81712000d 09a2794cc4ef1d090c4280f4e,9c5242d6a15b14032e9fc1f408be3c91026b1e1f':

我认为这不是我们传递 commitId 的方式。有人用过上面的 bash 脚本吗?

最佳答案

我认为您实际上正在寻找 git rebase ,而不是 git cherry-pick (两者都可以执行相同的工作)。最近的 Git 版本中的 git cherry-pick 甚至可以直接处理多个提交,而不需要外部循环。

为了解决您的具体问题:在命令行上指定多个提交引用时,这些引用需要用 shell IFS(输入字段分隔符)分隔,通常是空格,很少是逗号( , )。

可能的解决方案:

  • 将 map 值更改为 204a3e81712000d09a2794cc4ef1d090c4280f4e 9c5242d6a15b14032e9fc1f408be3c91026b1e1f(注意脚本中的引用)
  • 将脚本中的 IFS 设置为 ','
<小时/>

git cherry-pick 已经可以一次选择多个提交(请参阅 documentation )。您仍然需要将映射中的值从逗号修复为空白,但随后您可以简化 shell 脚本。

这也解决了使用没有范围但只有 2 个起点的 rev-list 的问题( abc123 def456 而不是 abc123..def456 )。它将遍历你所有的历史记录,而不仅仅是你的两个裁判之间的提交。删除 rev-list 并直接使用 cherry-pick:

#!/bin/sh

if [ -z "$1" ]; then
    echo "Equivalent to running git-cherry-pick on each of the commits in the range specified.";
    echo "";
    echo "Usage: $0 start^..end";
    echo "";
    exit 1;
fi


# do not quote parameter, we need potential whitespace preserved
git cherry-pick $1

(并且您不需要 bashsh 完全足以满足这样的脚本)

关于java - Git 多樱桃选择与 Bash 抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61046342/

相关文章:

bash - 删除 csv 文件的第一列

linux - scp 多个远程文件,同时输入一次密码

php - 如何将html转换成一行字符串?

git - 如何授予用户级别访问私有(private) GitLab 存储库的权限?

git - 如何使用 ssh 将 repo 克隆到远程服务器

java - 一个好的 TAPI 2 Java 包装器?

java - 异常 + 迭代器结束信号 : why is it bad in Java and normal in Python?

java - 查找 1 到 9999 之间的完美数字。 《Java 的艺术与科学》中的练习

java - 如何访问 JSON 元素(数组)

git - 无法将Jenkins插件发布到jenkins-ci.org