gpt4 book ai didi

git-remote - 如何知道本地 repo 与远程 repo 不同,没有获取?

转载 作者:太空狗 更新时间:2023-10-29 13:20:12 25 4
gpt4 key购买 nike

我有数十个 repo 协议(protocol),如果发生任何差异、新提交、新标签、新分支,我的脚本应该更新它们。在我的情况下,获取数十个 repos 有点慢,我想知道是否有任何快速命令可以满足我的要求。

最佳答案

您可以使用 git ls-remote 管道命令来获取 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 列出所有远程提示会生成如下输出:

From /home/user/tmp/repo2777201715768a4d82f374f7224e68164a916ac1f        refs/heads/bar78981922613b2afb6025042ff6bd878ac1994e85        refs/heads/master...

反过来,我们通过 git hash-object --stdin 将上面的远程仓库图片散列为单个散列,并通过在 git 中查询散列来检查我们之前是否见过它git cat-file -e。如果我们没有看到它,远程图片一定已经改变了,我们首先用 git hash-object -w 在 git 中记录它,以适应远程上 pull 和提交之间的竞争,然后继续获取 Remote 。

可以将其与 git 预取功能集成:pre-fetch hook functionality in git ,但这超出了本答案的范围。

附录

请注意,上面的代码会在 git 中生成松散的对象,偶尔需要使用 git gc 进行垃圾收集,并且可能需要明确地使用 --prune

此外,只要不以分支提示保持不变的方式故意重新排列提交,上述方法就应该有效。这将是/相当不常见/并且违反了更改推送状态的 git 准则,但是,嘿,可能发生的最糟糕的事情是您跳过了获取。

另请注意,ls-remote 在单个 Remote 上工作。要使用多个 Remote ,您必须通过使用 git remote show 生成一个 Remote 列表来扩展脚本,然后依次使用每个 Remote 。

关于git-remote - 如何知道本地 repo 与远程 repo 不同,没有获取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21362160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com