Подтвердить что ты не робот

Git выполнить команду оболочки для каждой фиксации

Я хотел бы пройти через ряд коммитов и выполнить команду оболочки для каждого. Если команда не удалась, я бы хотел, чтобы прогулка остановилась, иначе продолжайте движение. Я посмотрел на filter-branch, но я не хочу переписывать коммиты, просто проверьте их. for-each-ref, похоже, не позволяет указать диапазон действий.

Моя особая проблема заключается в том, что я создал кучу коммитов, и я хотел бы обеспечить, чтобы каждая фиксация была работоспособной. Я хотел бы сделать что-то вроде:

git foreach origin/master..master 'git submodule update && make clean && make'

Я мог бы, конечно, написать оболочку script, но это похоже на то, что git может иметь хороший способ сделать.

4b9b3361

Ответ 1

Вы можете использовать интерактивную rebase с опцией exec.

git rebase -i --exec <build command> <first sha you want to test>~

- exec Применить "exec" после каждой строки, создающей фиксацию в последней истории. будет интерпретироваться как одна или несколько оболочек команды.

Переупорядочение и редактирование коммитов обычно создает непроверенные промежуточные шаги. Вы можете проверить, не изменилось ли редактирование истории что-либо путем запуска теста или, по крайней мере, перекомпиляции на промежуточном точек в истории, используя команду "exec" (ярлык "x" ).

Интерактивная перебаза остановится, когда команда завершится с ошибкой (т.е. выйдет с не-0), чтобы дать вам возможность исправить проблему.

Ответ 2

Вероятно, вы хотите rev-list.

#!/usr/bin/env bash
# test_commits.sh

while read -r rev; do
    git checkout "$rev"
    if ! git submodule update && make clean && make; then
        >&2 echo "Commit $rev failed"
        exit 1
    fi
done < <(git rev-list "$1")

Затем вы можете использовать его с помощью

./test_commits.sh origin/master..master

Ответ 3

Здесь крутой однострочный с использованием xargs.

git rev-list @{upstream}..HEAD | xargs -n1 -I{} sh -c 'git checkout {} && git submodule update && make clean && make'