Git мульти вишня с Bash ошибка броска - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь реализовать Git cherry pick для нескольких идентификаторов коммитов одновременно. Но он терпит неудачу, или это не то, как его следует использовать.

Я пытаюсь использовать команду bash отсюда: { ссылка }

  #!/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

Я создал цель для муравья, как это:

<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>

И я использую AntExecutor из Java для вызова вышеуказанной цели. AntExecutor code can be found here - 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);

Но с этой ошибкой ничего не получается:

The ' characters around the executable and arguments are not part of the command., 204a3e81712000d09a2794cc4ef1d090c4280f4e,9c5242d6a15b14032e9fc1f408be3c91026b1e1f, git-multi-cherry-pick.sh, fatal: ambiguous argument '204a3e81712000d09a2794cc4ef1d090c4280f4e,9c5242d6a15b14032e9fc1f408be3c91026b1e1f':

Я думаю, что это не то, как мы передаем commitIds. Кто-нибудь раньше использовал вышеописанный bash скрипт?

1 Ответ

0 голосов
/ 05 апреля 2020

Я думаю, что вы на самом деле ищете git rebase, а не git cherry-pick (оба из которых могут выполнять одну и ту же работу). git cherry-pick в недавнем выпуске Git может даже обрабатывать несколько коммитов напрямую, без необходимости внешнего l oop.

Чтобы ответить на заданный вами c вопрос: при указании нескольких ссылок на коммиты в командной строке они должны быть разделены вашими оболочками IFS (разделитель поля ввода), который обычно является пробелом и редко запятой (,).

Возможные решения:

  • Измените значение вашей карты на 204a3e81712000d09a2794cc4ef1d090c4280f4e 9c5242d6a15b14032e9fc1f408be3c91026b1e1f (обратите внимание на цитирование в вашем скрипте)
  • Установите IFS в вашем скрипте на ','

git cherry-pick уже может выбирать несколько коммитов одновременно (см. документацию ). Вам все еще нужно исправить значение на карте от запятой до пустого значения, но тогда вы можете упростить сценарий оболочки.

Это также устраняет проблему использования rev-list без диапазона, но только с 2 начальными точками ( 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 будет вполне достаточно для такого сценария)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...