デフォルトでは、ローカルブランチを確認し、git pull && git submodule update && make clean
必要な場合にのみリモートアップデートをインポートする自動ビルドスクリプトがあります。それ以外の場合は、ビルド時に多くの時間を無駄にします。
ローカル変更が行われ、リモートアップデートがある場合、またはリモートアップデートのみがある場合、どちらの場合も、git checkoutの出力に「your Branch」という部分文字列が含まれることがわかりました(早送りなどが可能です)。これを私の条件にしました。
私はこれについて不安を感じます。
リモコンにインポートするアップデートがあり、マージの競合なしにインポートできるかどうかを確認する安定した方法はありますか?
編集:現在私が持っているより大きなスクリプトは次のとおりです。
OUTPUT=$( { git checkout "$NAME" ; } 2>&1 ) || { echo "Failed checking out branch" >&2; exit 1; }
[[ "$OUTPUT" == *"Your branch "* ]] && { git pull && git submodule update && make clean || { echo "Failed pulling, updating or cleaning branch" >&2; exit 1; }; }
答え1
一部の手順では、リモートストアから情報を取得する必要があります。現在、ダウンロード情報を使用しgit pull
てマージしています。これを2つのステップに分けて、まずリモートリポジトリのステータス情報をダウンロードする必要があります。 2番目のステップは最新の状態であることを確認し、そうでない場合はデータをマージし、make cleanとmakeを実行することです。
言ったように、git pull --help
または。git fetch
git rebase
git merge
ローカルブランチの名前と追跡中のブランチを知っている場合は、下位レベルのコマンドを使用してgit show-ref
ハッシュを取得するのと同じであることを確認できます。これはアップストリームブランチを正確に追跡する場合にのみ機能しますが、非常に安価です。
same_commit(){
set -- $(git show-ref --hash --verify "$@")
[ "$1" = "$2" ]
}
# get the changes if any, but don't merge them yet
git fetch origin
# See if there are any changes
if same_commit mainline origin/mainline
then
echo "Everything up to date"
exit 0
fi
# Now merge the remote changes
git pull origin
make clean
make
ローカル変更もある場合は、ローカルブランチにすべてのアップストリームコンテンツがあることを確認する必要があります。
contains(){
# return true if the first name has the second as an ancestor
git merge-base --is-ancestor "$2" "$1"
}
if contains master origin/master
then
echo nothing to do
return 0
fi