Как использовать интерактивную переадресацию git для завершения серии коммитов

Я бы хотел, чтобы подписал все коммиты на ветке, которую я закончил и хочу отправить в восходящий проект (например, с помощью запроса на перенос на GitHub).

Рекомендуемым способом, который я нашел, является использование

git rebase -i [base-commit]
# Set all commits to "edit"
git commit --amend --signoff  # do this for all commits

Как это сделать автоматически, в одной неинтерактивной команде?

Ответ 1

С Git 2.13 (Q2 2017) не требуется больше "git commit --amend --signoff":
См. commit 9f79524 (18 апреля 2017 г.) и commit 0fb3c4f, совершить b7cc705 (15 апреля 2017 г.) Джузеппе Билотта ( Oblomov).
(Слияние Junio ​​C Hamano - gitster - в совершить 768c7cb, 26 апреля 2017 г.)

rebase: передать --[no-]signoff вариант git am

Это упрощает подписание целого набора патчей перед отправкой.

git rebase справочная страница теперь включает в себя:

--signoff:

Этот флаг передается 'git am', чтобы отменить все перебитые коммиты.
Несовместим с опцией --interactive.

Ответ 2

Похоже, что алиасы git могут сделать это довольно красиво. Поместите в свой ~/.gitconfig:

[alias]
  # Usage: git signoff-rebase [base-commit]
  signoff-rebase = "!GIT_SEQUENCE_EDITOR='sed -i -re s/^pick/e/' sh -c 'git rebase -i $1 && while git rebase --continue; do git commit --amend --signoff --no-edit; done' -"

Здесь также Gist.

Вы используете его точно так же, как git rebase; pick автоматически перевернуты на edit, используя sed и --no-edit, чтобы не открывать редактор для каждой отдельной фиксации.