我正在寻找一个Linux脚本,贡献者可以运行这个脚本来自动压缩和重新定位他们自己的分支/ Pull请求。作为维护者,我目前执行PR的手动压缩合并,因此在master
中有一个干净的历史记录树,但是丢失了太多关于谁提交了什么的信息(例如git blame
)。
其他类似问题已经接受了仍然允许过多人为错误的解决方案,例如
git rebase -i HEAD~3
要求人们每次都计算他们的提交。
git fetch origin && git rebase -i origin/master
需要手动更改挑选壁球。
如果我们可以根据另一个git命令的输出可靠地知道提交计数,那么上面的第一个解决方案似乎很有可能适应。
您现在可以假设每个PR有一位作者,我们希望将其压缩到同一位作者的一次提交。解决方案还应该能够在合并之前在PR中多次工作。例如作者可能希望在提升第一个PR之前运行它,然后在审核之后运行它,并在合并之前进行更多提交。您还可以假设“重写历史”与rebase的含义不是一个问题。
答案 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
的正确提交,而不必使用标记当然。