Git выполнить команду оболочки для каждой фиксации
Я хотел бы пройти через ряд коммитов и выполнить команду оболочки для каждого. Если команда не удалась, я бы хотел, чтобы прогулка остановилась, иначе продолжайте движение. Я посмотрел на filter-branch
, но я не хочу переписывать коммиты, просто проверьте их. for-each-ref
, похоже, не позволяет указать диапазон действий.
Моя особая проблема заключается в том, что я создал кучу коммитов, и я хотел бы обеспечить, чтобы каждая фиксация была работоспособной. Я хотел бы сделать что-то вроде:
git foreach origin/master..master 'git submodule update && make clean && make'
Я мог бы, конечно, написать оболочку script, но это похоже на то, что git может иметь хороший способ сделать.
Ответы
Ответ 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'