有没有比字符串输出 hack 更好的方法来检查 git checkout 是否需要拉取更新?

有没有比字符串输出 hack 更好的方法来检查 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; }; }

答案1

您将需要在某个阶段从远程存储库获取信息。目前您正在使用git pull下载信息并合并它。您应该将其分为两个步骤,首先下载远程存储库的状态信息。第二步查看您是否是最新的,如果不是,则合并数据,进行 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

相关内容