如何在rebase期间为所有提交运行测试

时间:2014-02-04 18:51:13

标签: git rebase

我有一个功能分支,有很多提交。

A---B---C     master
 \
  \-B'---C'---D'...---Z'  feature

我正在feature工作,但另一位开发人员创建了提交BC。现在我想在提交feature上重新定义C,但我和/或automerge在rebase期间引入了错误。我的项目具有非常好的测试覆盖率,我可以使用ant rebuild test从控制台运行测试,现在我希望git告诉我哪个提交是第一次破坏我的测试的提交,所以我可以修复该提交。我怎么能这样做?

3 个答案:

答案 0 :(得分:17)

当你在分支feature时执行:

git rebase --interactive --exec "ant rebuild test" C

这将导致git在提交C上重新开始,在顶部重放你的工作,它将在重放阶段每次提交后运行你的测试。

如果您的测试失败,希望您的ant任务将具有非零退出代码。在这种情况下,一旦测试失败,git就会停止。您立即处于正确的位置以修改您的提交,以便测试将再次开心。修改后,只需像往常一样执行git rebase --continue,git将继续检查您提交的所有内容。

答案 1 :(得分:4)

Git 2.9中引入,您现在可以使用-x选项为每个提交执行命令,而无需添加--interactive

现在可以运行git rebase -i --exec "cmd1 && cmd2 && ..."

,而不是运行git rebase -x "cmd1 && cmd2 && ..."

答案 2 :(得分:3)

要添加到OP yankee excellent answer,Git 2.5+将提供更强大的git rebase --interactive --exec体验,尤其是在失败的情况下 exec。
实际上,请参阅此答案最后部分的新的--reschedule-failed-exec Git 2.21

commit b12d3e9 [2015年5月22日]和commit 1d968ca [2015年5月22日] Matthieu Moy (moy)。   (由Junio C Hamano -- gitster --合并于commit a6be52e,2015年6月1日)

  

' exec'命令是将当前提交发送到stopped-sha,它应该包含原始提交(在rebase之前)   因此,如果exec'命令失败,下一个' git rebase --continue'将发送当前提交作为post-rewrite hook。

完整文档:

  

rebase -i:使用失败的post-rewrite命令修复exec挂钩

     

通常,当' git rebase'在完成rebase之前停止,它是为用户提供编辑提交的机会(例如使用' edit'   命令)。
  在这种情况下,&#39; git rebase&#39;保留在"$state_dir"/stopped-sha中重写的提交的sha1,以及随后的git rebase --continue&#39;将使用此sha1调用post-rewrite挂钩作为<old-sha1>挂钩的post-rewrite参数。

     

&#39; git rebase&#39;由于失败而被停止&#39; exec&#39;命令不同:它为用户提供了检查或修复的机会   失败,但并没有停止说&#34;这是一个提交编辑,使用   --continue当你完成时#34;   所以,没有理由为{exe}&#39; exec&#39;拨打post-rewrite钩子。命令。
  如果用户确实重写了提交,则会使用&#39; git commit --amend&#39;已经调用了post-rewrite钩子。

     

将行为修复为:

     
      
  • stopped-sha命令失败的情况下不留exec个文件,
  •   
  • 并教导&#39; git rebase --continue&#39;如果,请跳过record_in_rewritten   找不到stopped-sha个文件。
  •   

为了便于管理与rebase相关联的失败的exec指令,Git 2.21(2019年第一季度)引入了--reschedule-failed-exec,其中包含&#34; git rebase -i&#34;,它学会了重新执行命令用&#39; exec&#39;在最后一次失败后运行。

commit 81ef8eecommit 969de3fcommit d421afaJohannes Schindelin (dscho)(2018年12月10日)。{
(由Junio C Hamano -- gitster --合并于commit d9d9ab0,2019年1月29日)

  

rebase:介绍--reschedule-failed-exec

     

--exec选项的常见用例是验证每次提交   在主题分支中通过git rebase -x make <base>干净地编译。

     

但是,当这样的rebase中的exec失败时,它不会被重新安排,在这种情况下不是特别有帮助。

     

让我们提供一个标志来重新安排失败的exec命令。

     

基于 Paul Morelle 的想法。

git rebase man page现在包括:

--reschedule-failed-exec::
--no-reschedule-failed-exec::
     

自动重新安排失败的exec命令   这只适用于交互模式(或提供--exec选项时)。

  

rebase:介绍--reschedule-failed-exec

的快捷方式      

--reschedule-failed-exec之前一直写出-x <cmd>选项有点麻烦;让我们同时介绍一个方便的选项:-y <cmd>

注意:第一次提交请参阅commit e11ff89(2019年2月6日)和commit 81ef8ee(2018年12月10日)Johannes Schindelin (dscho)Junio C Hamano -- gitster --合并于commit b966813,2019年2月9日)

  

还原&#34; rebase:为--reschedule-failed-exec&#34;

引入快捷方式      

这个补丁只是作为一个暂定的提供&#34;我们可以介绍一个   如果我们不想更改默认行为,则方便的短选项   从长远来看&#34;补丁,开启讨论是否其他人   同意弃用目前的行为,转而支持重新安排   行为。

     

但是Git邮件列表上的共识是,在不久的将来显示警告是有意义的,并且默认情况下将默认rebase.rescheduleFailedExec翻转为重新安排失败的exec命令。

     

所以,让我们退出那个添加-y短选项的补丁   同意是没有必要或不可取的。

同样在Git 2.21(2019年2月):&#34; git rebase -x $cmd&#34;没有拒绝多行命令,即使该命令无法处理这样的命令 它现在被拒绝了。

commit c762aadPhillip Wood (phillipwood)(2019年1月29日) (由Junio C Hamano -- gitster --合并于commit 96e6547,2019年2月7日)

  

rebase -x:完整性检查命令

     

如果用户向--exec提供一个空参数,那么git会创建一个待办事项   列表,它无法解析。在出错之前,rebase开始运行   用:

error: missing arguments for exec
error: invalid line 2: exec
You can fix this with 'git rebase --edit-todo' and then run 'git rebase --continue'.
Or you can abort the rebase with 'git rebase --abort'.
     

在启动rebase之前检查空命令。

     

同时检查该命令是否包含任何换行符,因为待办事项列表格式无法处理多行命令。
  请注意,在此更改之前,这会更改行为:

git rebase --exec='echo one
exec echo two'

它会在todo列表中插入两个exec行,现在它会出错。