Git

有沒有比字元串輸出黑客更好的方法來檢查 git checkout 是否需要更新?

  • November 23, 2021

基本上我有一個自動建構腳本,我在其中檢查本地分支,並且希望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 rebaseor 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

引用自:https://unix.stackexchange.com/questions/678795