我正在尝试同时为多个提交 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
(并且您不需要 bash
, sh
完全足以满足这样的脚本)
关于java - Git 多樱桃选择与 Bash 抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61046342/