如何使用Git交互式变基来签署一系列提交

18

我想要给一个我完成的分支上的所有提交签名,并将这些提交发送到上游项目(如通过GitHub上的拉取请求)。

我发现一种建议的方法是使用

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

我该如何自动完成这个操作,只使用一个非交互式的命令?


1
不再需要交互式变基:Git 2.13(2017年第二季度)已经提供了 git rebase --signoff 命令。请参见下面的答案 - VonC
2个回答

15
自Git 2.13(2017年第二季度)起,不再需要"git commit --amend --signoff":参见提交9f79524(2017年4月18日)和提交0fb3c4f提交b7cc705,作者是Giuseppe Bilotta (Oblomov)(由Junio C Hamano -- gitster --合并于提交768c7cb, 2017年4月26日)

rebase: 将--[no-]signoff选项传递给git am

这使得在提交之前容易为整个补丁集签名。

git rebase手册页现在包括:

--signoff:
该标志传递给 'git am' 以签署所有经过变基的提交。
--interactive 选项不兼容。
更新(一年后,2018年5月)"git rebase" 已经学会尊重使用除 "am" 之外的后端时的 "--signoff" 选项 (但不支持 "--preserve-merges")。 rebase: 扩展 --signoff 支持
允许在使用 --interactive--merge 时使用 --signoff
仅在交互模式下标记为挑选、编辑或改写的提交才会被签署。
这个补丁的主要动机是允许人们运行 'git rebase --exec "make check" --signoff' 来为发布准备一个补丁系列,比使用另一个 --exec 命令更方便。
此更改还允许在不带 --onto 的情况下使用 --root 来与 --signoff 一起工作 (--onto 已经支持 --root)。
它也更加健壮: rebase -p: 如果给出 --signoff,则出错 rebase --preserve-merges 不支持 --signoff,因此报错而不是静默忽略它,以便用户知道提交不会被签署。

6

事实证明,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一样使用它;使用sed自动将pick翻转为edit,并且--no-edit确保不会为每个提交打开编辑器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接