繁体   English   中英

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

[英]Git run shell command for each commit

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

我的具体问题是我创建了一堆提交,我想确保每个提交都是可构建的。 我想做的事情如下:

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

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

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

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

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

重新排序和编辑提交通常会创建未经测试的中间步骤。 您可能希望通过运行测试来检查历史编辑没有破坏任何内容,或者至少使用“exec”命令(快捷键“x”)在历史记录的中间点重新编译。

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

你可能想要转发列表

#!/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

这是一个使用xargs的酷炫单行。

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

您可能还希望将--reverse选项传递给rev-list,以便最后一次检出是HEAD。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM