Git
有沒有比字元串輸出黑客更好的方法來檢查 git checkout 是否需要更新?
基本上我有一個自動建構腳本,我在其中檢查本地分支,並且希望
git pull && git submodule update && make clean
僅在必要時才逐步拉取遠端更新,因為否則我會在建構時浪費大量時間。我注意到,如果正在進行本地更改並且有遠端更新,或者只是遠端更新,那麼兩種情況下 git checkout 的輸出都會有一個子字元串“你的分支”(可以快速轉發,或者類似的東西),所以我將其作為我的條件。
我對此感到不安。
有沒有一種可靠的方法來檢查遠端是否有更新要拉,並且可以在沒有合併衝突的情況下拉?
編輯:我目前擁有的,在一個更大的腳本中是這樣的:
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; }; }
您將需要在某個階段從遠端倉庫獲取資訊。目前您正在使用
git pull
下載資訊並將其合併。你應該把它分成兩個步驟,首先下載遠端倉庫的狀態資訊。作為第二步,看看你是否是最新的,如果不是,那麼合併數據,做你的 make clean 和 make。正如
git pull --help
告訴你的那樣,它執行git fetch
,然後是git rebase
orgit 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