gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:35:42 25 4
gpt4 key购买 nike

我正在尝试同时为多个提交 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/

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