我有一个包含多个分支的git存储库。存储库有一个makefile,它在分支之间是相同的。我想创建一个可以定期运行的bash脚本,该脚本从远程存储库中提取所有分支,然后为已更改或已添加的每个分支运行make。然后将创建的可执行文件移动到服务器上的另一个位置,并在开始下一个要处理的分支之前运行make clean。
我正在运行的命令的顺序是
make
cp executable /some/other/directory/branch_name
make clean
这是否可能与shell脚本有关,如果是我怎么能实现这个。如果shell脚本不适合这个任务,我还能怎样实现相同的结果呢?
答案 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 ...
返回的匹配就很简单了。