如何在不使用 fetch 的情况下知道本地仓库与远程仓库不同?

2023-12-04

我有数十个存储库,如果发生任何差异,我的脚本应该更新它们,新提交,新标签,新分支。在我的情况下,对于数十个存储库来说,获取有点慢,我想知道是否有任何快速命令可以满足我的要求。


您可以使用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并依次与每个人一起工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不使用 fetch 的情况下知道本地仓库与远程仓库不同? 的相关文章

  • Git守护进程克隆错误

    All 我正在按照以下指示进行操作this SO https stackoverflow com a 377293 724357答案 快速提供回购 当我跑步时git clone git ipAddr git project我得到这个输出 r
  • Eventmachine start_tcp_server 无接受器 - 端口正在使用或需要 root 权限(运行时错误)

    我已经 3 天无法运行本地服务器了 重新启动我的计算机没有帮助 有几次 在反复尝试大约 40 50 次之后 它随机地起作用了 我不明白为什么 我尝试过一次不同的端口并且有效 但从那以后 没有端口有效 每次我尝试运行我的 Rails 服务器时
  • 使用 TortoiseGit 创建 git 克隆时出现 SSL 证书问题

    我想在 TortoiseGit 的帮助下克隆 git 存储库 但出现错误 错误 SSL 证书有问题 请验证 CA 证书是否正常 细节 错误 14090086 SSL 例程 SSL3 GET SERVER CERTIFICATE 访问时证书验
  • 如何使用“gem install”命令从私有 GitHub 存储库安装 gem

    如何在本地安装托管在 GitHub 上的私人存储库中的 gem 特别是 我们通过gem install命令而不是在 Bundler 中使用 因为它是一个命令行工具 我尝试这样做 gem install githubname repo s h
  • 如何在本地快速拉取拉取请求

    在合并拉取请求之前 我想在本地快速拉取请求并运行测试并测试一些内容 我还不想点击 gihub 合并拉取请求 我以为滑轮会有帮助http ejohn org blog pulley http ejohn org blog pulley 但我收
  • hg 或 git 中的两个完整目录/项目之间存在差异?

    我继承了一个最初存储在 CVS 中的项目以及所有修订 我做了相当多的编辑 并且我试图比较我在原始目录中所做的所有更改 关于添加的新文件与旧文件 hg git 是否有某种实用程序可以让我进行树差异或类似性质的操作 也就是说 新添加的文件 删除
  • 返回到存储库中的特定修订后提交并推送更改?

    我们需要及时返回到某个特定的提交 一些意外的改变是为了掌握 尝试恢复它挖得太深 所以 master 的状态很糟糕 现在我们希望master回到66ada4cc61d62afc 根据git 恢复到某个提交 https stackoverflo
  • 如何通过哈希显示提交的日期和时间

    I used git reflog识别我创建特定分支时的哈希值 我得到了哈希值fe1ddcdef 我还没有将此分支推送到远程 我现在正在尝试查找日期和时间fe1ddcdef发生 git reflog只告诉我 fe1ddcdef HEAD 1
  • 如何查看 github 的 SSH 密钥?

    我最近收到一封来自 Github 的电子邮件 要求我检查我的 SSH 密钥 请检查您的钥匙并确保您 认出他们 如果您有任何疑问 请拒绝钥匙并 上传新密钥 如何在 ubuntu 11 10 上使用 git 检查我的密钥 您可以按照 GitHu
  • 无法从我的电脑上使用 traefik 后面的 gitlab 进行 git 克隆

    这是我的 gitlab 和 traefik 配置 version 3 7 services gitlab web image gitlab gitlab ce latest restart always hostname gitlab ro
  • 从 github 中删除子项目提交

    我有两个存储库A and B 我错误地在我的机器上将仓库 B 克隆到了 A 内 我从存储库 B 中删除了所有代码 但是当我在源上从 A 推送并合并代码时 它还显示了子项目提交B在 Github 仓库上 我想从我的 master 上删除子项目
  • 如何升级 Windows 中 git svn 使用的 SVN 版本?

    我的公司正在将SVN升级到1 7 检查git svn version显示正在使用的SVN版本是1 4 6 我想获得 git svn 使用的 SVN 版本接近 1 7 但是 我没有看到有关更新 git svn 使用的 SVN 版本 在 Win
  • Visual Studio Code 内置故事,用于查看 git 提交历史记录并对其内容进行比较

    In this https stackoverflow com questions 37899765 how can i view the git history in visual studio code 60013101 noredir
  • 如何解决 VS Code 中变基拉取的合并冲突?

    当我做一个git pull rebase 并且我的提交中存在合并冲突 我得到冲突差异视图 解决所有冲突并暂存文件 然后呢 我可以打开终端并运行git rebase continue但是 VS Code 中不应该有一个按钮来完成变基吗 只需使
  • 自动生成/删除詹金斯工作

    我正在寻找一种自动创建一组詹金斯作业的方法 通常在创建新的 git 分支之后 我已经为maven尝试过这个插件 http evgeny goldin com wiki Maven jenkins plugin http evgeny gol
  • 致命:无法将 HEAD 解析为有效引用

    我正进入 状态fatal Failed to resolve HEAD as a valid ref 每当我尝试承诺时 我努力了 echo ref refs heads master gt git HEAD 但它不起作用 也尝试过 git
  • 如何禁用 GitHub 中的拉取请求?

    我试图了解如何禁用 github 中的 拉取请求 问题一 我们正在尝试使用变基工作流程 这意味着如果不是快速推进 那么使用拉取请求可能会有害 一种解决方案 为我想要禁用拉取请求的分支设置分支权限 或者将我添加为任何进入 master 的内容
  • 如何生成类似github的影响图?

    是否有一些程序 或者我错过的一些神奇的 git 插件 可以从 git 存储库获取影响图或类似的东西 而无需通过 github 就数据收集而言 我可以生成图表 我不确定从哪里开始编写自己的代码 我假设有一些标志我可以传递给 git log 来
  • 如何关闭分支而不将其从 git 的历史记录中删除?

    我想提交并关闭其分支 而不将其从历史中删除 有了水银我会commit close branch then update转到上一个 然后继续工作 有了 git 我很困惑 没有与 Git 中关闭分支完全相同的方法 因为 Git 分支比 Merc
  • 自动同步两个 git 存储库

    是否可以保持同步两个 Github 存储库 远程 的特定文件夹 有两个 github 存储库 repoA 和 repoB 这两个存储库都有名为 ABC 的文件夹以及其他独特的文件夹 如果repoA的文件夹ABC中的任何文件有更新 我想自动更

随机推荐

  • 如何实现独立克隆TADODataSet?

    场景是这样的 我们有一些 SQL 表 我们正在该表上执行 SQL 查询 并且我们在 TADOQuery 对象中得到结果 var qryOryginal qryClone TADOQuery begin setup all the thing
  • 如何针对需要身份验证令牌的 API 验证协议?

    我正在使用Pact我的合同测试套件的宝石 并且喜欢它 我正在测试的 API 服务需要所有请求的授权令牌 我知道如何为我的用户生成 API 令牌 但我不知道将该令牌放置在 Pact 工作流程中的何处 我搜索了 Pact 文档和存储库中的示例
  • UNIX Case 语句中的模式匹配

    我正在使用一个 shell 脚本 我需要在其中区分tar gz gz bz etc 我首先提取文件的扩展名 然后尝试使用它来匹配它case我的第一个案例是 tar 应该将文件与tar在它们的扩展中 因为可以使用相同的命令提取它们 问题是我试
  • EnumChildWindows 中的 MoveWindow 对对话框内的 listview 的影响:为什么 ListView 标题未正确滚动

    我有一个listview控制 lvc 它在一个DialogBox dbx 并且 dbx 也有一个垂直滚动条 每当滚动条滚动时EnumChildWindows调用以枚举 dbx 的所有子窗口 回调函数包含一个MoveWindow可以移动该 l
  • 无法安装 xkcd 字体

    我正在按照小插图中给出的说明尝试 xkcd 字体 vignette xkcd intro 但是执行以下步骤时出现错误 gt system cp xkcd tff t fonts cp xkcd tff No such file or dir
  • 使用sql查询将图像大小从150 * 150更改为70 * 70?

    我将图像存储在 SQL Server 2008 R2 数据库中名为 image1 的 varBinary max 列中 其大小为 150 150 我添加了另一列名为 image2 varBinary max 的列 我需要使用 image1
  • Firefox 文本区域大小调整错误?

    我正在尝试仅使用 CSS 创建一个固定的文本区域来填充浏览器窗口的整个宽度和高度 并且以下内容在 Chrome 中完美运行 textarea border 2px solid 3D6AA2 padding 5px position fixe
  • 从 MSBuild 发布中排除“.js”文件,但不排除“.min.js”文件

    使用 Visual Studio 和 MSBuild 我希望能够排除所有 js文件并包含所有 min js我的部署中的文件 我知道这可以使用 Visual Studio 中的文件属性来实现 但这不是一个选项 因为文件太多了 我有以下内容Pu
  • 数组初始化函数

    我在玩 C 时偶然发现了这个问题 我正在尝试初始化堆上的数组指针 它在initialize 它输出的地方69 但在main 它因错误而崩溃EXC BAD ACCESS include
  • 在 Java 中将 MP3 转换为 PCM

    我想用Java将MP3文件转换为PCM 怎么做 Get the mp3plugin jarJMF 的 将其添加到应用程序的运行时类路径中 为MP3提供解码器SPI Get an AudioInputStream对于 MP3 从AudioSy
  • Chrome 扩展程序弹出窗口关闭时是否有事件?

    我已经尝试过 window unload window beforeunload 等 我正在寻找一种在弹出窗口关闭后通知我的后台页面的方法 你可以试试这个 连接到您的后台页面chrome runtime connect or chrome
  • InnoSetup,展开环境变量(使用 {reg:...} 从注册表值获取)

    我尝试从注册表设置默认安装路径 DefaultDirName reg HKCU Software Microsoft VisualStudio 14 0 VisualStudioLocation userdocs Visual Studio
  • 如何将大写字母更改为小写字母,将空格更改为下划线

    我想将变量中的大写字符串字符更改为小写 并将空格替换为 我知道我可以对所有实例使用 if 语句 但这会花费太长时间 它将用户的输入保存到文件名中 即 user selection Barracuda Limited what I have
  • 如何将包含图像的跨度置于 div 中居中

    我有一个主 div homeGallery 其中有一个 span imgClass 用于加载图像列表之一 我需要图像在 div 中不仅垂直居中而且水平居中 到目前为止我有这段代码 homeGallery gt imgClass margin
  • 将 base64 字符串转换为 ArrayBuffer

    我需要将 Base64 编码字符串转换为 ArrayBuffer Base64 字符串是用户输入 它们将从电子邮件中复制并粘贴 因此在加载页面时它们不存在 如果可能的话 我想在 javascript 中执行此操作 而不对服务器进行 ajax
  • 如何在 Go 中向子路由器添加中间件?

    我有以下代码 apiRouter mux NewRoute PathPrefix Subrouter Bucket router bucket apiRouter PathPrefix bucket Subrouter bucket Met
  • 通过 PayPal 和信用卡接收付款

    我正在开发一个网站 我需要从 PayPal 和信用卡接收付款 问题是我对此一无所知 我的问题是我在哪里可以找到一些很好的资源来帮助我 或者如果您有一些示例代码 一切可以帮助我的东西 多谢 如果您计划集成 Paypal 您会发现 Paypal
  • 如何向单个sql命令添加超过10000个参数

    我想向单个 sql 命令添加超过 10000 个参数 怎么可能呢 据我所知 一个sql命令有2100个参数 我认为你应该回到 为什么 而不是直接跳到 如何 听起来也许您正在执行一些巨大的插入 更新 在这种情况下 更合适的解决方案是表值参数
  • Android:使多行编辑文本可滚动,在垂直滚动视图中禁用

    我正在开发一个应用程序 其中我在某个点上进行了结构 根据我的应用程序要求 我在 xml 中创建了水平滚动视图 然后在 java 中创建了垂直滚动视图 如下所示 Vertical Scroll view in Linear layout Sc
  • 如何在不使用 fetch 的情况下知道本地仓库与远程仓库不同?

    我有数十个存储库 如果发生任何差异 我的脚本应该更新它们 新提交 新标签 新分支 在我的情况下 对于数十个存储库来说 获取有点慢 我想知道是否有任何快速命令可以满足我的要求 您可以使用git ls remote管道命令无需获取即可获取遥控器