每次提交都运行git run shell命令

时间:2014-11-17 23:10:17

标签: git shell

我想介绍一系列提交并对每个提交执行shell命令。如果命令失败,我希望步行停止,否则继续前进。我查看了filter-branch,但我不想重新编写提交,只需检查它们即可。 for-each-ref似乎不允许您指定要操作的范围。

我的具体问题是我创建了一堆提交,我想确保每个提交都是可构建的。我想做点什么:

git foreach origin/master..master 'git submodule update && make clean && make'

我当然可以编写一个shell脚本来执行此操作,但似乎git可能有一个很好的方法。

3 个答案:

答案 0 :(得分:46)

您可以将交互式rebase与exec选项一起使用。

git rebase -i --exec <build command> <first sha you want to test>~
  

- exec在每行创建最终历史记录中的提交后附加“exec”。将被解释为一个或多个shell   命令。

     

重新排序和编辑提交通常会创建未经测试的中间件   脚步。您可能想要检查您的历史编辑没有中断   任何通过运行测试,或至少在中间重新编译   使用“exec”命令(快捷键“x”)指向历史记录。

     

当命令失败时,交互式rebase将停止(即退出时)   非0状态)让您有机会解决问题。

答案 1 :(得分:22)

您可能需要rev-list

#!/usr/bin/env bash
# test_commits.sh

while read -r rev; do
    git checkout "$rev"
    if ! git submodule update && make clean && make; then
        >&2 echo "Commit $rev failed"
        exit 1
    fi
done < <(git rev-list "$1")

然后您可以将其与

一起使用
./test_commits.sh origin/master..master

答案 2 :(得分:2)

这是一个很酷的单行使用xargs

git rev-list @{upstream}..HEAD | xargs -n1 -I{} sh -c 'git checkout {} && git submodule update && make clean && make'

您可能还想将--reverse选项传递给rev-list,以便最后一次结帐是HEAD。