您可以使用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
一些必要的错误检查被省略了,为了清晰起见,代码被复制了。
说明
使用git ls-remote --tags --heads 列出所有远程提示会生成如下输出:
从 /home/user/tmp/repo2
777201715768a4d82f374f7224e68164a916ac1f 裁判/头/酒吧
78981922613b2afb6025042ff6bd878ac1994e85 裁判/负责人/大师
...
反过来,我们通过git hash-object --stdin 将远程repo 的上述图片散列为单个散列,并通过在git 中使用git cat-file -e 查询散列来检查我们之前是否见过它。如果我们还没有看到它,那么远程图片一定已经改变了,我们首先在 git 中使用git hash-object -w 记录它,以适应远程拉取和提交之间的竞争,然后继续获取远程。
可以将此与 git 预取功能集成:pre-fetch hook functionality in git,但这超出了此答案的范围。
附录
请注意,以上内容会在 git 中生成松散的对象,偶尔需要使用 git gc 进行垃圾收集,并且可能会显式使用 --prune。
此外,只要提交不是故意重新排列以使分支提示保持不变,上述内容就应该有效。这将是 / 非常罕见 / 并且违反了 git 更改推送状态的准则,但是,嘿,可能发生的最糟糕的事情是你跳过了一次获取。
另请注意,ls-remote 在单个遥控器上工作。要使用多个遥控器,您必须通过生成带有git remote show 的遥控器列表来扩展脚本并依次使用每个遥控器。