2011-10-24 12 views
2

私は複数のブランチを持つgitリポジトリを持っています。リポジトリには、ブランチ間で同一のメークファイルがあります。私は、リモートリポジトリからすべてのブランチを取り出し、変更された、または追加されたすべてのブランチに対してmakeを実行する定期的に実行できるbashスクリプトを作成したいと思います。作成された実行可能ファイルは、サーバー上の別の場所に移動され、処理される次のブランチから開始する前にmake cleanが実行されます。それは私がこれを実装するに取り掛かることができる方法であればすべてのgitブランチでmakefileを実行するにはどうすればいいですか?

私は

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

だろう実行していることと思いますコマンドの順序は、シェルスクリプトで行うことがこれでも可能です。シェルスクリプトがこのタスクに適していない場合、他にどのように同じ結果を得ることができますか?

+0

サイドノート:より複雑な処理のために、あなたの代わりにフォームif make; then ...; else ...; fi、例えばの事をやりたいかもしれませんあなたは '作るclean'ルール、' Gitのclean'の完全性をテストしようとしていない場合(おそらく、オプション '-x -d -f';マンページを参照してください)を使用して、未追跡のものすべてを消去して、ビルドが本当にクリーンな状態にあるかどうかを確認することができます。 – Cascabel

+0

おかげさまで、私はgit cleanがここで多くの意味を持つかもしれないと思います。 –

答えて

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 

最初のフェッチのいいところは、あなたが不必要に変更せずに枝をチェックアウトする必要がないことです。レポが大きければ、これは時間を節約することができます。

明らかにエラーを処理する選択肢があります。私はちょうど理にかなったもっとも単純なものに行きました。

# 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

まあ、git pullは、grep 'の出力を生成して、どのrefが更新されたかを判断します。その後、grepによって返された一致をループして、for ... in ...ループの単純な問題です。

関連する問題