如何在每个git分支上运行makefile

时间:2011-10-24 05:25:38

标签: git bash

我有一个包含多个分支的git存储库。存储库有一个makefile,它在分支之间是相同的。我想创建一个可以定期运行的bash脚本,该脚本从远程存储库中提取所有分支,然后为已更改或已添加的每个分支运行make。然后将创建的可执行文件移动到服务器上的另一个位置,并在开始下一个要处理的分支之前运行make clean。

我正在运行的命令的顺序是

make
cp executable /some/other/directory/branch_name
make clean

这是否可能与shell脚本有关,如果是我怎么能实现这个。如果shell脚本不适合这个任务,我还能怎样实现相同的结果呢?

2 个答案:

答案 0 :(得分:3)

我会做这样的事情:

# fetch updates, but don't merge yet
git fetch    # origin is default

# list all branches
git for-each-ref --format='%(refname:short)' refs/heads |
while read branch; do
    # if the branch is not the same as the remote branch...
    if [ "$(git rev-parse $branch)" != "$(git rev-parse origin/$branch)" ]; then
         # only continue to the next step on successful results
         git checkout $branch &&
         git pull &&
         (make &&
         cp executable /somewhere/else;
         make clean)
         # except always make clean as long as we tried to make
         #
         # you might also consider a hard reset and clean, to guarantee things
         # are safe for the next checkout
    fi
done

首先获取的好处是你不必不必要地检查没有变化的分支;如果您的回购很重要,这可以节省时间。

显然,可以选择处理错误;我只是选择了仍然有意义的最简单的事情。对于更复杂的处理,您可能希望执行if make; then ...; else ...; fi形式的事情,例如:

# die hard on unexpected checkout/pull failures
if ! (git checkout $branch && git pull); then
    exit 1
fi
if make; then
    cp executable /somewhere/else
else
    # report a build failure?
fi
# clean up no matter what
git clean -xdf
git reset --hard

答案 1 :(得分:0)

好吧,git pull确实会生成可能grep来确定更新内容的输出。之后,使用grep循环循环for ... in ...返回的匹配就很简单了。