您可以使用git ls-remote
管道命令无需获取即可获取遥控器的状态。
在这里,让我们使用 git 本身作为一个轻量级数据库,来跟踪远程的状态。
将以下内容放入脚本中;为了方便起见,您可以稍后将其作为 git 别名 shell 函数启用。在您的存储库中运行。
REMOTE_SUM=$(git ls-remote --tags --heads 2>/dev/null | git hash-object --stdin)
if git cat-file -e $REMOTE_SUM
then
echo Remote check-summed up-to-date.
else
echo Remote changed, fetching...
git ls-remote --tags --heads 2>/dev/null | \
git hash-object -w --stdin &>/dev/null
git fetch
fi
Some of the necessary error checking was omitted, and code was duplicated for sake of clarity.
解释
列出所有远程提示git ls-remote --tags --heads
生成输出,例如:
From /home/user/tmp/repo2
777201715768a4d82f374f7224e68164a916ac1f refs/heads/bar
78981922613b2afb6025042ff6bd878ac1994e85 refs/heads/master
...
反过来,我们将上面的远程存储库图片散列为单个散列git hash-object --stdin
并通过在 git 中查询哈希来检查我们之前是否见过它git cat-file -e
。如果我们还没有看到,那么远程图片肯定已经改变了,我们先在 git 中记录下来git hash-object -w
,以适应远程拉取和提交之间的竞争,然后继续获取远程。
人们可以将其与 git 预取功能集成:git 中的预取钩子功能,但这超出了本答案的范围。
Addendum
请注意,上述内容将在 git 中生成松散对象,有时需要使用以下命令进行垃圾收集git gc
,并且可能--prune
明确地。
此外,只要提交没有故意重新排列以使分支提示保持不变,上述内容就应该有效。这将是/相当不常见/并且违反了改变推送状态的 git 指南,但是,嘿,可能发生的最糟糕的事情是你跳过了一次获取。
另请注意ls-remote
在单个遥控器上工作。要使用多个遥控器,您必须通过生成遥控器列表来扩展脚本git remote show
并依次与每个人一起工作。