2017-08-17 17 views
2

私は私のGitプロジェクトを再帰的に行ってそれらを引き出すBASHスクリプトを持っています。我々は、マスターと開発の2つの支店を使用します。私は&& git checkout developmentが含まれるようにスクリプトを変更すると、私のスクリプトが実行に失敗し、私はこのエラーを取得する:追加引数を追加するとBASHスクリプトが失敗するのはなぜですか?

find: missing argument to `-exec' 

私は再び&& git checkout development一部を削除すると、エラーは、スクリプトが初期状態に戻っているにもかかわらず、同じまま。ここで

はスクリプトです:

#!/bin/bash 
find . -type d -name .git -exec sh -c "cd \"{}\"/../ && pwd && git pull && git status" \; 

そして、ここでは、Gitチェックアウトコール(および削除git status)である:

#!/bin/bash 
find . -type d -name .git -exec sh -c "cd \"{}\"/../ && pwd && git checkout development && git pull" \; 

はここで何が起こっていますか?スクリプトを変更した後にのみ問題が発生する可能性がありますか?

+0

はこれを試してみてください: '見つけます。 $ 1 "/../ && pwd && git checkout開発&& git pull '_' {} '\;' – anubhava

+1

これはうまくいきました。ありがとう!あなたはなぜその変更によって答えがうまくいくのか説明できますか? '' $ 1 ''の部分がコマンドライン引数を引っ張っているのですか、それとも何か違うことをしていますか? – Donglecow

+0

cd: 'findを使う必要はありません。 "$ 1" /../&git -C "$ 1" /../ checkoutを開発します。&& git -C "$ 1" /../ pull '_ '{}' \; ' – user2394284

答えて

3

sh -cの後にコマンド文字列内にプレースホルダー{}を使用しないでください。ここでは、$1位置引数を埋めるために渡されるコマンドラインと{}$0を移入するためにダミー_を渡している

find . -type d -name .git -exec sh -c \ 
'cd "$1"/../ && pwd && git checkout develop && git pull' _ '{}' \; 

: あなたはこのfindを使用することができます。コメントをもとに

編集: スクリプトに引数を渡すためにいじった後、私はそれが最初のサブシェルのためにそれらをエクスポートすることが最も簡単です見つけた:

#!/bin/bash 
BRANCH=$2 
export BRANCH 
echo "Checking out branch $BRANCH" 
find . -type d -name .git -exec sh -c 'cd "$1"/../ && pwd && git checkout "$BRANCH" && git pull; echo "Branch being checked out: $BRANCH"' _ '{}' "$BRANCH" \; 
+0

ありがとうございました。ですから、チェックアウトするブランチを伝えるためにコマンドライン引数を渡したいのであれば、 '' $ 1 ''は干渉するか、何らかの方法で変更する必要がありますか? – Donglecow

+2

追加パラメータなどを渡すことができます: '-exec sh -c 'cd" $ 1 "/../ && pwd && git checkout開発&& git pull; echo "第2の値:$ 2" '_' {} '"値" \; ' – anubhava

関連する問題