检查 Git 中是否需要 pull

2024-06-19

如何检查远程存储库是否已更改并且需要拉取?

现在我使用这个简单的脚本:

git pull --dry-run | grep -q -v 'Already up-to-date.' && changed=1

但它比较重。

有没有更好的办法?理想的解决方案是检查所有远程分支,并返回已更改分支的名称以及每个分支中新提交的数量。


首次使用git remote update https://git-scm.com/docs/git-remote,使您的远程参考保持最新。然后您可以执行以下操作之一,例如:

  1. git status -uno会告诉您正在跟踪的分支是否领先、落后或已经偏离。如果什么也没说,本地和远程是一样的。

  2. git show-branch *master将向您显示名称以“master”结尾的所有分支中的提交(例如master and 起源/主人).

如果你使用-v with git remote update (git remote -v update)您可以看到哪些分支已更新,因此您实际上不需要任何进一步的命令。

但是,您似乎想在脚本或程序中执行此操作并最终得到 true/false 值。如果是这样,有一些方法可以检查您当前的关系HEAD提交和您正在跟踪的分支的负责人,尽管由于有四种可能的结果,您不能将其简化为是/否答案。但是,如果您准备做pull --rebase那么你可以将“本地落后”和“本地已发散”视为“需要拉动”,将另外两个(“本地领先”和“相同”)视为“不需要拉动”。

您可以使用以下命令获取任何引用的提交 IDgit rev-parse <ref>,所以你可以这样做master and 起源/主人并比较它们。如果它们相等,则分支是相同的。如果它们不相等,您想知道哪个领先于另一个。使用git merge-base master origin/master会告诉你两个分支的共同祖先,如果它们没有分歧,那么这将与其中一个分支相同。如果你得到三个不同的 id,则分支已经分叉。

为了正确地执行此操作,例如在脚本中,您需要能够引用当前分支及其正在跟踪的远程分支。 bash提示符设置功能在/etc/bash_completion.d有一些用于获取分支名称的有用代码。但是,您实际上可能不需要获取名称。 Git 有一些简洁的简写来引用分支和提交(如git rev-parse --help)。特别是,您可以使用@对于当前分支(假设您不处于分离头状态)并且@{u}为其上游分支(例如origin/master). So git merge-base @ @{u}将返回当前分支及其上游分歧的提交(哈希值)git rev-parse @ and git rev-parse @{u}会给你两个提示的哈希值。这可以总结为以下脚本:

#!/bin/sh

UPSTREAM=${1:-'@{u}'}
LOCAL=$(git rev-parse @)
REMOTE=$(git rev-parse "$UPSTREAM")
BASE=$(git merge-base @ "$UPSTREAM")

if [ $LOCAL = $REMOTE ]; then
    echo "Up-to-date"
elif [ $LOCAL = $BASE ]; then
    echo "Need to pull"
elif [ $REMOTE = $BASE ]; then
    echo "Need to push"
else
    echo "Diverged"
fi

Note:旧版本的 git 不允许@单独使用,所以你可能需要使用@{0}反而。

线路UPSTREAM=${1:-'@{u}'}允许您选择显式传递上游分支,以防您想要检查与当前分支配置的远程分支不同的远程分支。这通常是以下形式远程名称/分支名称。如果没有给出参数,则该值默认为@{u}.

该脚本假设您已经完成了git fetch or git remote update首先,使跟踪分支保持最新状态。我没有将其构建到脚本中,因为能够将获取和比较作为单独的操作进行更加灵活,例如,如果您想在不获取的情况下进行比较,因为您最近已经获取了。

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

检查 Git 中是否需要 pull 的相关文章

  • 如何配置“git diff”以使用 emacs diff [重复]

    这个问题在这里已经有答案了 是否可以配置 git diff 以使用 emacs diff 如果是的话 你能告诉我怎么做吗 谢谢 看这个问题 如何使用视觉差异程序查看 git diff 输出 https stackoverflow com q
  • 可以使用 git 项目并在 VS2013 中查看 TFS 工作项吗?

    所以我升级到了VS2013 希望能顺利进行所有开发 不过有一件事确实让我很恼火 我的团队使用 TFS 而我更喜欢 git 因此我使用 git tfs 来桥接两者以进行源代码控制 我们使用 TFS 工作项来跟踪错误和故事等 如果重要的话 我也
  • 如何判断输入来自哪个键盘

    设想 我有一个 USB RFID 读取器 将其连接到笔记本电脑后 它可以用作新连接的 USB 键盘 例如无需安装任何驱动程序 当接触带有 RFID 标签的阅读器时 它进入我当前的窗口 例如终端 外壳 RFID 号码 例如0009339384
  • git pull:无法快进,

    你能帮我解决我的问题吗 当我尝试从 dev 分支拉取时发生错误 我浏览了解决方案 它说我需要 rebase 但它对我来说没有成功 CT aohc MP1GYWQA MINGW64 c TCO source RAPMD Web Fronten
  • 如何给 Git 控制台着色?

    我最近看到gitWindows 中的控制台是彩色的 例如绿色表示添加 红色表示删除等 我如何为我的颜色上色git这样的控制台 为了安装它 我使用了以下命令 sudo apt get install git core As noted htt
  • 如何恢复已删除的文件[重复]

    这个问题在这里已经有答案了 可能的重复 在 Git 存储库中恢复已删除的文件 https stackoverflow com questions 953481 restore a deleted file in a git repo 如何恢
  • 如何在shell脚本中扩展相对路径

    我正在编写一个脚本来使用 bash 在 linux 2 6 上设置环境变量 因此该脚本包含如下命令 export SRC DIR export LIBPATH SRC DIR lib 问题是 当我尝试 echo LIBPATH 时 它显示
  • Git 从不同的存储库中提取分支

    我当前的存储库中只有几个文件 我想合并来自不同存储库的远程分支 从中拉出并合并一个分支github com username code git 分支装载机 然后从中拉出并合并一个分支github com username code git
  • Bash 脚本在 for 循环中使用 sed 和变量?

    我正在尝试编写一个 bash 脚本 该脚本需要一些变量 然后使用 grep 对给定文件搜索进行查找 替换 以获取包含该字符串的文件列表 我认为我遇到的问题是在 sed 中看到变量我不确定它可能是什么 if searchFiles a old
  • 比较 2 次提交

    我没有找到任何关于获取两个文件之间差异的文档 我使用下面的代码使用坚固的方式提交文件 repo Rugged Repository new reponame email protected cdn cgi l email protectio
  • git 中的 web.config 和 app.config 机器特定设置

    我们在不同的办公室有多个开发团队 他们需要为我们项目中的许多配置设置使用不同的值web config and app config files 我们希望使用一组合理的默认值来检查这些配置文件 这样通过检查 trunk master 分支 您
  • 是否可以在 Git 项目的所有分支中执行“grep 搜索”?

    是否可以运行git grep在 Git 控件源项目的所有分支中 或者还有其他命令要运行吗 问题 如何在 Git 历史记录中 grep 搜索 提交的代码 https stackoverflow com q 2928584 6309 建议 gi
  • git checkout 裸露,并在接收后包含子模块

    如何在包含子模块的接收后挂钩中检出服务器上的裸存储库 我目前将其作为接收后挂钩 bin bash http blog ekynoxe com 2011 10 22 git post receive for multiple remote b
  • Emacs shell:保存提交消息

    我几天前开始使用 emacs 在 emacs shell M x shell 中使用 git 时遇到问题 当我 git commit 或 git commit amend 时 它会打开 vim 来编辑并保存提交消息 我对此表示同意 但我找不
  • Git:从远程获取特定对象

    在工作中我们必须应对一个非常庞大的 git 存储库 90Go 在尝试调整本地副本上的一些内容后 我的包文件出现错误 尝试解压它 我可能删除了一些目标文件 例如 gt git GC 错误 无法读取 af9ed8 snip 致命 坏树对象 af
  • git:推送单个提交

    假设我进行了多次提交 并希望挑选哪些提交到远程存储库 我该怎么做 在ascii中 C1 gt C2 gt C3 gt C4 我想推C2和C4 通过变基 重置 推送然后重置进行重新排序是否有效 C1 gt C2 gt C3 gt C4 gt
  • python中的多服务器监控/自动重启

    我有 2 个服务器程序 必须使用 GNU Screen 启动 我想使用基于 Python 的程序来强化这些服务器 防止崩溃 该程序启动每个屏幕会话 然后监视服务器进程 如果服务器进程崩溃 我需要 python 代码来终止无关的屏幕会话并再次
  • 在 $git push -u origin main 命令之后,Git bash 不请求任何身份验证,实际上什么也不做

    当我尝试将代码上传到 github 时 以下是我在 Git Bash 终端中执行的步骤 当我尝试使用将代码推送到 github 时 git push u origin main光标移动到下一行并持续闪烁 但不执行任何操作 git remot
  • dulwich - 从远程仓库身份验证克隆

    我找不到有关此主题的任何资源 我需要通过提供用户名和密码从私有存储库进行克隆 然而 当它们作为关键字参数提供给 dulwich get client from path 时 会出现错误 提示 未知参数 用户名 这似乎是一件简单的事情 但我找
  • 有没有办法显示 Visual Studio 执行的 Git 命令? [复制]

    这个问题在这里已经有答案了 在 Visual Studio Code 中 有一个 显示 Git 输出 菜单项 显示最近运行的 Git 命令 有关其外观的示例 请参阅3 35 在这个视频中 https code visualstudio co

随机推荐

  • 如何在自托管 WCF 中获取多部分表单数据?

    我已经搜索了很长一段时间 但没有找到我要找的东西 我在 Windows 应用程序中自行托管了一个 http WCF 现在 在我的服务方法之一中 我需要接收一个文件和一些表单数据字段 在类似的问题中 情况要么发送一个文件 这是通过流数据然后转
  • ES6模块导入是否执行导入文件内的代码?

    js 文件中的代码在导入期间是否运行 如果是 那么一次还是每次 例如 a js console log A const a a export default a b js import a from a gt console logs c
  • 获取自动热键中的可用屏幕区域

    我正在尝试编写一些简单的 AutoHotkey 脚本来移动窗口 但在获取正确的屏幕尺寸值时遇到问题 我试图获取屏幕上可用区域的大小 通常是全屏分辨率减去任务栏 也许还有任何其他停靠窗口 如 Vista 中的侧边栏 我发现的获取屏幕宽度的方法
  • C# 中隐式/显式转换方法是否继承?

    我不确定我在这里做错了什么 我有一个通用类 它基本上是一个美化的整数 具有一些用于某些字符串格式设置的方法 以及字符串和 int 之间的转换 public class Base protected int m value From int
  • 如何使用 vb.net 将数据插入 Access 表?

    我想在 Access 数据库中插入一个新行 我正在考虑做类似的事情 oConnection new Connection connectionstring oTable oCennection table Orders oRow oTabl
  • Windows 10 上的 LibPNG 构建问题

    我试图在 Windows 10 上构建 libpng 以获取 win32 二进制文件 但我认为有一个与 awk 解析带有 CRLF 行结尾的文件相关的问题 我尝试使用 dos2unix 命令转换文件 但没有成功 结果相同 在 make 命令
  • 局部变量在栈中的顺序是怎样的?

    我目前正在尝试对缓冲区溢出漏洞进行一些测试 这是易受攻击的代码 void win printf code flow successfully changed n int main int argc char argv volatile in
  • Polly 速率限制过早[重复]

    这个问题在这里已经有答案了 我正在尝试了解 Polly 的速率限制政策 public class RateLimiter private readonly AsyncRateLimitPolicy throttlingPolicy priv
  • 如何使用waf构建共享库?

    我想使用构建一个共享库waf http code google com p waf 因为它看起来比 GNU 自动工具更容易 更简洁 到目前为止 我实际上有几个与我开始编写的 wscript 有关的问题 VERSION 0 0 1 APPNA
  • 如何从Apollo客户端的useQuery获取响应头

    我根本无法找到一种方法来做到这一点 有谁知道这是否支持 谢谢 ApolloClient 发出请求的方法以及使用它们的 React Hooks 充当数据实际获取方式的抽象 它可能来自 HTTP 上的远程服务器 来自缓存 来自直接针对模式执行请
  • Javascript:“new Array(4)”与 Array.apply(null, {length: 4}) 有何不同?

    我想生成一个给定长度的空数组并用一些数字填充它 生成具有四个连续数字元素的数组的一种方法是 var x Array apply null length 4 map function item index return index 但当我看到
  • 多线程环境下如何更好的使用ExecutorService?

    我需要创建一个库 其中包含同步和异步方法 executeSynchronous 等待直到有结果 返回结果 executeAsynchronous 立即返回一个 Future 如果需要 可以在其他事情完成后进行处理 我的图书馆的核心逻辑 客户
  • 数字之和 C++

    我应该编写一个程序 要求用户提供正整数值 该程序应该使用循环来获取总和 从 1 到输入数字的所有整数 例如 如果用户输入 50 循环将求出 1 2 3 4 50 但由于某种原因它不起作用 我的 for 循环遇到了麻烦 但这就是我到目前为止所
  • 使用 EditableText 进行 Flutter

    我正在尝试弄清楚如何在 Flutter 中使用 TextEditor 我有 卡片编辑器 基本上我希望能够处理相当于一段文本的内容 new EditableText autofocus true maxLines null backgroun
  • 动态二维数组非连续内存C++

    假设我将二维数组的地址及其二维数组的行和列传递给函数 该函数会将二维数组的地址视为一维数组 例如 int Matrix 如果我执行下面的代码 int arr arr new int row for int i 0 i lt row i ar
  • 如何访问 Scala XML 中的父元素

    The scala xml包表示带有标记树节点的 XML 但是这棵树在 Scala 2 7 中是单向的吗 因为似乎没有办法访问Elem给定的父级Elem 这似乎同样适用于父母Document 例如 在 XOM 中你有getParent an
  • HTTP POST 操作出现错误代码 302

    我有一个 perl 脚本 它将数据发送到我用 php 编写的 Web 服务 这是代码 use LWP UserAgent my ua LWP UserAgent gt new my server endpoint http example
  • 如何使用 jQuery 拖放文本

    我需要创建一个消息模板 如下所示 你好 Stackoverflow Text A 感谢您的支持 Text B 在这种情况下 我需要使用拖放字段来Textarea 我进行了初步研发 寻找一些库来实现我的要求 并发现了这个通过拖放插入文本 ht
  • 无法运行gradlew

    我已经设置了一个build gradle文件与apply plugin java 我尝试使用说明设置 gradle 包装器here http spring io guides gs gradle 但是当我输入时sudo gradlew bu
  • 检查 Git 中是否需要 pull

    如何检查远程存储库是否已更改并且需要拉取 现在我使用这个简单的脚本 git pull dry run grep q v Already up to date changed 1 但它比较重 有没有更好的办法 理想的解决方案是检查所有远程分支