git checkoutが更新を取得する必要があることを確認する文字列出力ハックよりも良い方法はありますか?

git checkoutが更新を取得する必要があることを確認する文字列出力ハックよりも良い方法はありますか?

デフォルトでは、ローカルブランチを確認し、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 fetchgit rebasegit 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

関連情報