脚本拉取请求/分支rebase和压缩

时间:2014-08-11 09:08:58

标签: git git-merge git-rebase pull-request

我正在寻找一个Linux脚本,贡献者可以运行这个脚本来自动压缩和重新定位他们自己的分支/ Pull请求。作为维护者,我目前执行PR的手动压缩合并,因此在master中有一个干净的历史记录树,但是丢失了太多关于谁提交了什么的信息(例如git blame)。

其他类似问题已经接受了仍然允许过多人为错误的解决方案,例如

git rebase -i HEAD~3要求人们每次都计算他们的提交。

git fetch origin && git rebase -i origin/master需要手动更改挑选壁球。

如果我们可以根据另一个git命令的输出可靠地知道提交计数,那么上面的第一个解决方案似乎很有可能适应。

您现在可以假设每个PR有一位作者,我们希望将其压缩到同一位作者的一次提交。解决方案还应该能够在合并之前在PR中多次工作。例如作者可能希望在提升第一个PR之前运行它,然后在审核之后运行它,并在合并之前进行更多提交。您还可以假设“重写历史”与rebase的含义不是一个问题。

1 个答案:

答案 0 :(得分:1)

首先,如果你想让提交的作者与你自己不同,那么简单的git命令前加GIT_AUTHOR_NAME="author name" GIT_AUTHOR_EMAIL="author@email",或者一些自动将其余部分包含在

中。
(
  eval $(git log HEAD^.. --pretty=format:'export GIT_AUTHOR_NAME="%an" GIT_AUTHOR_EMAIL="%ae"')
  git stuff
)

接下来,在重新定位时,制作备份标记总是明智的(尽管HEAD@{1}如果很快就能识别出错误就应该有用了。)

现在回答实际问题。正如this post建议的那样,对于自动" rebase squash",您实际上可以简单地使用git reset --soft SOMEHEAD; git commit。现在,让我们达到你想要的压缩多个PR的能力。我建议,您的作者应该使用本地标记,例如branchname/PRed重新附加到最新的PR提交(通过git tag -f)。然后将SOMEHEAD软复位为简单的标记。

总而言之,作者的工作流程将是

git tag -f tmp        # just in case we screw up,
                      # so git reset --hard tmp hopefully fixes things
git reset --soft PRed # or e.g. master/PRed etc.
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"
                      # to start with a concatenation of the squashed
                      # commit messages
git tag -f PRed       # same tag name as in git reset --soft

要自动执行更多操作,您可以使用PR的提交消息前缀和grep git log的输出来获取git reset --soft的正确提交,而不必使用标记当然。