Git - 远程:致命:你在一个尚未诞生的分支上

2024-04-24

我正在尝试设置一个钩子来从我的桌面推送到我的服务器。这在过去已经工作了无数次,但现在我在设置新网站时遇到错误:

remote: fatal: You are on a branch yet to be born

我一如既往地完成了与命令相同的系列,按照本指南 https://github.com/vdecree/a2-hosting-git.

所以在我的服务器上我创建了一个 git 目录。例如示例.git

然后我跑git init --bare。之后我就开始了:

cd hooks/
cat > post-receive

在我的邮件接收中我放置:

#!/bin/sh
git --work-tree=/home/username/public_html/example.com --git-dir=/home/username/example.git checkout -f

我Ctrl+D出来保存。然后运行chmod +x post-receive

然后我在本地运行:git remote add live ssh://[email protected] /cdn-cgi/l/email-protection:x/home/username/example.git

然后我可以运行:git push -u live master_prefix

我做的唯一不同的是我在一个名为 master_something 的分支中,而不是 master 中。这会导致问题吗?如果是,我需要做什么?


2020 年 9 月编辑:这变得越来越普遍,因为人们正在重命名现有的master分支到main或各种服务器端裸存储库中的类似内容。对于 TL;DR,如果您已在服务器端裸存储库中完成此操作,或者使用git init --bare也无需更新初始值master部分 - 您将需要调整HEAD在这个裸存储库中进行设置。跳下来到那么该怎么办?部分的说明。


正如您所怀疑的那样,因为您正在推送一个名为master_prefix而不是大师。至于要做什么,那取决于你想要发生什么。如果您想查看多个选项,请跳到最后。

不过,首先让我们稍微分解一下。

任何以以下内容开头的消息:

remote: ...

实际上是来自“另一个人”。当您执行推送(或提取)时,您的 Git 通过网络电话或类似设备调用另一个 Git。他们使用一种协议来交换信息,该协议可以帮助他们识别何时彼此直接对话,以及何时您的 Git 从他们的一端获取并非来自他们的内容。Git,而是来自他们的 Git 正在使用的东西。

在这种情况下,他们的 Git(在服务器上)正在运行他们的 Git 挂钩。只有一个钩子——你创建了它,所以我们可以称它为“你的”钩子,但是运行 Git 的计算机不知道服务器上的内容是由你编写的:它不知道,也不需要知道,却不在乎;它只是传递消息。所以我们称之为“他们的”钩子。

他们的钩子说:

fatal: You are on a branch yet to be born

你会看到它在你的末端带有前缀remote:让你知道这不是yourGit 正在说一些事情,这是他们最后的事情。


此时,最好的办法就是改变观点,假装“你”现在是服务器。在“你的”端,你的 Git 启动并接收东西(成功,并放入请求的分支,master_prefix),然后运行一个钩子。那个钩子点燃了另一个,单独的,git checkout命令:

git --work-tree=/home/username/public_html/example.com --git-dir=/home/username/example.git checkout -f

这相当长,所以让我们暂时忽略这些选项来缩短它。除了设置工作和git目录之外,它只是git checkout -f.

如果您运行此命令通过它自己在其他地方,它将检查哪个分支?这不是一个反问句,答案就在文档 https://www.kernel.org/pub/software/scm/git/docs/git-checkout.html,尽管它可能不清楚甚至具有误导性:

你可以省略branch,在这种情况下,该命令退化为“检查当前分支”,这是一个美化的无操作,具有相当昂贵的副作用,仅显示当前分支的跟踪信息(如果存在)。

因为--work-dir and --git-dir选项以及(裸)存储库可能会更改的事实,它毕竟不是“美化的无操作”,但它does use:

当前分支

这就是关键,就在那里:当前分支。这个裸存储库的“当前分支”是什么?

答案与任何存储库(无论是否裸露)相同:当前分支是在HEAD文件。如果您在这个裸露的存储库中浏览,您会找到该文件;检查它,它会说:

$ cat HEAD
ref: refs/heads/master
$ 

换句话说,HEAD命名当前分支,因为git init就这样设定,从那以后没有任何改变——是master.

So your git checkout -f命令正在尝试签出分支master.

实际存在哪些分支?您可以通过进入裸存储库并运行来找到答案git branch:

$ git branch
  master_prefix
$ 

我得到了这个git version 2.3.0: 请注意,没有* master输出。其他(实际上是未来)版本的 Git 可能会向您展示* master因为那是您所在的分支 - 尽管它还不存在!

这是怎么回事?答案是,任何时候您创建一个未连接到任何现有修订版的新分支时,这对于master新创建的存储库中的分支 - Git 通过将分支名称写入到中来处理此问题HEAD,但不将任何修订 ID 写入该分支的相应文件中。这就是 Git 如何记录指定分支尚未创建,但一旦您为该分支提供第一个提交就会创建的想法。

(如果您使用git checkout -b newbranch --orphan对于新分支,您将处于同样的“尚未诞生”状态。最常见的是master当然,因为这就是任何全新的空存储库的开始方式。)


那么该怎么办?

正如我之前指出的,这实际上取决于您want发生。

您有一个新的(最初是空的)裸存储库,没有master分支(但是尝试导出当前分支的后接收挂钩,该分支仍然是master)。然后你从另一个系统提供一个新分支,但它不是master。我看到两个明显可能的“想要”,尽管也许您想要比其中任何一个更奇特的东西:

  1. 你不想导出任何东西,因为没有master导出:修改您的钩子以检查当前分支是否存在:

    current_branch=$(git symbolic-ref HEAD) || exit 1
    sha1=$(git rev-parse -q --verify $current_branch) || exit 0
    # ok, the current branch exists; deploy it as usual
    git --work-tree=... --git-dir=... checkout -f
    
  2. 您想要导出当前 (master) 分支。决定这是否意味着“永远”或“直到master出现”或其他什么;如果需要或需要,修改您的部署脚本,或者只是更改 Git 对当前分支的想法。

假设你想要master_prefix现在和永远部署。通常,您会将裸存储库切换到master_prefix用一个简单的git checkout,但你不能,因为 (1) 这是一个--bare回购协议和(2)没有master_prefix但是(除非您将这个推送后作为修复步骤进行)。

在服务器上,有两种简单的方法可以更新当前分支的想法,即使新分支尚不存在:

    $ echo ref: refs/heads/master_prefix > HEAD

通过 (c) 完全绕过 Git 来达到目的,或者:

    $ git symbolic-ref HEAD refs/heads/master_prefix

使用 Git 做同样的事情。

或者,您可以指定接收后脚本应检查的精确分支:

    $ git --work-tree=... --git-dir=... checkout -f master_prefix

请注意,这将导致 Git 将当前分支(在裸存储库中)更改为master_prefix每次推动时。

由于您的钩子不会查看哪个分支已更新(如果有),因此除了使用默认值(在HEAD)或显式部署特定分支(添加参数)。

还值得注意的是一个微妙的棘手之处:index裸存储库中的文件将记录已签出到指定工作树的内容。只要您部署了一个部署位置和/或部署了一个分支,就可以了。如果您开始变得喜欢(例如,部署master到常规服务器,但是test到同一服务器上的测试服务),您可能需要修改部署脚本,以清理并重建目标或使用多个索引文件。

在您开始喜欢之前,上述大部分内容并不重要。最重要的是,您必须决定要部署什么,也许还可以创建一个master branch.

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

Git - 远程:致命:你在一个尚未诞生的分支上 的相关文章

  • GitHub v3 API - 如何在存储库中创建初始提交?

    我正在使用 v3 API 并设法列出存储库 树 分支 访问文件内容并创建 blob 树 提交 我现在正在尝试创建一个新的存储库 并设法使用 POST user repos 来完成它 但是当我尝试在这个新存储库中创建 blob trees c
  • GIT Rebase 对多个 0.5GB 二进制文件致命

    这个问题本质上是重新开rebase 期间 git 崩溃 https stackoverflow com q 7692944 1286639从来没有答案 我正在尝试从我的 secc 分支进行变基 git rebase main First r
  • 仅使用特定提交消息触发 travis CI 构建

    我希望 travis 仅在我有特定的提交消息时才启动 我怎样才能做到这一点 我的 travis yml 文件是here https github com mosaadm mooltipass blob master travis yml 我
  • git 交互式变基:停止而不提交

    长话短说 有办法进去吗git rebase i停止编辑 没有提交 ID TLDR 更长的版本 背景 With git rebase i 我得到一个文本编辑器 我可以在其中定义命令列表 从pick COMMIT ID在每一行上 其中一个选项是
  • 安全地记住 bash 脚本中的 ssh 凭据[重复]

    这个问题在这里已经有答案了 假设我有一个 bash 脚本 它通过 ssh 在远程计算机上执行命令 Do something here ssh otheruser host command1 Do something else ssh oth
  • 即使在签出到另一个分支后也无法删除本地分支

    我正在尝试删除我的本地分支并尝试了我在这里找到的大多数解决方案 即签出到另一个分支然后运行git branch D or d
  • 如何使用java与防火墙(路由器)建立ssh连接?

    由于某种原因 我需要连接到防火墙 基于Linux 并使用Java添加一些规则 用google搜索了一段时间后 我发现jsch是我最好的选择 但是当我 用它来执行命令 显示主机名 例如 返回错误 如果我 执行类似命令 ls l and who
  • 如何配置 Ansible 跳过两个堡垒主机?

    我想编写一个 Ansible 剧本 使用 Ansible 2 7 5 它将在到达目标服务器之前跳过两个主机来执行诸如安装 docker 和 python 等操作 我能够让 Ansible 通过一台主机跳转到server1通过将其添加到我的h
  • 自动更改 github 文件

    我制作了一个带有白名单的应用程序 withelist 位于 github 存储库上 只有一个文件 即 withelist 每次下载我的应用程序的用户想要被允许使用该应用程序时 都必须向我发送一个消息插入白名单 现在这个过程真的很慢 我想加快
  • GitHub Actions 中的嵌套模板(从另一个 yaml 文件调用一个 yaml 文件)

    GitHub Action 是否支持嵌套模板 例如 以下是 Azure Pipeline yaml 的示例 其中调用另一个 yaml 文件 job BuildFunctions steps each func in parameters f
  • 变基后无法推送到分支

    我们使用 git 并有一个 master 分支和开发人员分支 我需要添加一个新功能 然后将提交重新设置为 master 然后将 master 推送到 CI 服务器 问题是 如果我在变基期间发生冲突 我无法在变基完成后推送到我的远程开发人员分
  • 不同GIT版本的GIT合并结果不同

    在不同的 GIT 版本上运行 merge 命令我们得到不同的结果 命令是 git merge no ff origin master codeline Results 版本2 1 4 gt 合并成功 版本1 7 1 gt 同一提交上的同一合
  • 获取引用而不下载对象[重复]

    这个问题在这里已经有答案了 我想检查 origin master 是否与我的 HEAD 不同 I do not想要git fetch 因为它可能非常昂贵 我滥用 git 的方式使得成本高得令人望而却步 任何允许我从远程获取提交列表或顶部提交
  • 如何解决 npm install 中的身份验证错误?

    在我的 package json 中 我有一个名为 somerepo git 的私人存储库 现在我通过 maven 在 buildserver bamboo 上运行 npm install 并收到此错误 ERROR npm ERR Comm
  • 如何仅对暂存内容运行 git 预提交检查?

    Suppose git status给出这个 On branch X Changes to be committed use git reset HEAD
  • Git 二进制文件与 .gitattributes 中的 -diff

    在 gitattributes 中有以下等价内容 chm binary chm diff 我努力了 chm二进制文件 但恐怕它仍然可能尝试合并这些文件 是 diff更适合我打算做什么 另外 在提交给定类型的文件后 此设置是否适用 Thank
  • GitHub Web UI 中的“base”和“head”存储库是什么?

    GitHub 的 UI 相当不直观且考虑不周 所以这里有一个问题 什么是 头 回购 什么是 基础 回购 不知道是从哪一个抄来的 基础 和 头部 这两个词的意思是相同的 链表的 头 类似于树的 基 GitHub 有叉树和文件树 Head 和
  • 从历史记录中删除不需要的文件,包括带有过滤分支的所有引用

    我最近克隆了一个 SVN 存储库 其中曾经有一些二进制文件 但不再需要了 不幸的是 我已经将它和包含的二进制文件推送到了 Github 我现在想使用 git filter branch 删除它们 但在标签和分支方面我遇到了一些问题 基本上
  • Jupyter (iPython) 笔记本中的 Latex 宏未由 github 渲染

    我的 Jupyter 笔记本 ipynb 中有一个 Markdown 单元 其中包含以下内容 newcommand paren 1 left 1 right paren beta 2 该文件位于 Github 存储库中 LaTex 宏应用程
  • 如何在gitlab存储库中下载单个文件夹或文件

    我有一个存储库 在此存储库中 有多个文件夹可用 我只需要此存储库中的一个文件夹 我已经尝试遵循命令 但它不起作用 克隆 有没有办法只克隆 git 存储库子目录 https stackoverflow com questions 600079

随机推荐

  • 使用带有百分比的 CSS Clip

    我试图在 2 个单独的 div 中仅显示图像的上半部分和同一图像的下半部分 我尝试过使用 CSS 属性clip 但似乎不支持 作为单位 只有我吗 您有只显示一半图像的解决方案吗 更新 5年以上后 CSS Clip 属性现已弃用 考虑使用cl
  • 在远程机器上执行多个命令

    在下面的命令中 我尝试 ssh 命令并执行多个命令 如果任何命令失败 即如果 command1 退出 那么如果 command1 和 commnd 2 退出 否则在远程计算机上执行命令 3 我如何退出 我怎样才能做到这一点 ssh logi
  • 如何使用 Laravel 将二进制数据插入数据库?

    我正在尝试使用 Laravel 4 及其 Eloquent ORM 将二进制数据插入到 PostgreSQL 数据库中 我在迁移中有以下内容 Schema create DataBlobs function table table gt i
  • 如何获取驱动器号和名称(卷标)

    我有一个程序可以告诉我所有硬盘 USB 但它只告诉我驱动器号而不是名称 这是我所拥有的 DriveInfo drives DriveInfo GetDrives Console WriteLine Detected Drives for i
  • 计算一个月的工作日数[重复]

    这个问题在这里已经有答案了 可能的重复 获取给定月份的工作日数 https stackoverflow com questions 8396507 get number of weekdays in a given month 如何计算每个
  • 如何在Android中从url获取字节图像

    我是 android 新手 图像存储在服务器中Base64格式 那么我怎样才能得到它server to 我的项目并使用 Json 对象设置为我的 ImageView 请帮我 任何帮助将不胜感激 尝试这个 首先将 Url 转换为 byte b
  • Django:如何在ajax中返回模型表单集并在模板中使用

    我需要在运行时使用ajax动态地将表单添加到我的表单集中 我指的是使用 Ajax 将表单动态添加到 Django 表单集 https stackoverflow com questions 501719 dynamically adding
  • 为什么 Android webview 仅当 type="number" 而不是 type="text" 时才在键盘中显示“下一步”?

    我有一个带有几个输入字段的表单 因此 我想使用下一个按钮在字段之间导航 但这仅在输入字段类型为 数字 时有效 使用 type text 则不会 这是 Android 3 2 1 中的错误吗 我的输入字段是这样的
  • WPF Datagrid - 如何验证多行并标记所有无效行?

    我有一个包含行的数据网格 其中验证取决于他的兄弟姐妹 到目前为止 我正在使用 BindingGroups 和自定义 ValidationRule 同时验证多行 但我不知道如何更改无效行条目的外观 我返回一个 ValidationResult
  • NSView mouseEntered/mouseMoved 在拖动操作期间未调用(反之亦然)

    我有一个带有透明边框的无边框窗口NSView 当鼠标光标进入透明视图时 应该会出现第二个视图 放置目标 允许用户放置文件 问题是draggingEntered 将文件拖到上方时不会被调用透明视图 因此放置目标视图永远不会出现 透明视图具有正
  • 如何使图像在轮播中居中

    如何使图像在轮播中居中 我使用 bootstrap 教程中的代码尝试了 bootstrap 3 carousel a href Webconte Details 124 img src Webconte Image 124 a div cl
  • R 中函数多态性的建议做法是什么?

    假设我想写一个函数R这是对某些数据进行充分统计的函数 例如 假设函数 调用它foo func仅取决于数据样本的样本均值 为了方便起见 我认为用户可能喜欢传递到foo func随机变量的样本 在这种情况下foo func计算样本平均值 or样
  • ZeroMQ,我们可以使用 inproc: 传输以及 pub/sub 消息传递模式吗

    设想 我们正在评估ZeroMQ 具体来说jeroMq 用于事件驱动机制 应用程序是分布式的 其中多个服务 发布者和订阅者都是服务 可以存在于同一个 jvm 中或不同的节点中 这取决于部署架构 观察 为了玩玩我创建了一个pub sub图案与i
  • 当将位图加载为 Windows 资源时,是否有办法保留 BITMAPFILEHEADER?

    我一直在使用测试一些东西SFML 1 4 http sfml dev org 简单快速的多媒体库 采用 C 和 Visual C 2008 Express Edition 为了避免我的图形程序出现外部图像 我正在测试sf Image Loa
  • 二和 Leetcode 解释、Hashmap、Javascript

    我只是想知道谁能一步一步解释这个解决方案的算法 我不知道哈希图是如何工作的 您能否还提供一个使用哈希图的基本示例 以便我理解该算法 谢谢你 var twoSum function nums target let hash for let i
  • 使用 Bash 将 KB 转换为 MB

    我使用命令来获取远程文件夹的大小 运行后它会返回 120928312 http blah com 数字大小为bytes 我想做的就是让它输出MB 以及http部分被移除 我猜想 grep 到一个文件 但不知道如何去做 您可以使用 shell
  • 如何在 Matplotlib 中在图框之外绘制矩形

    我想按照下图的样式生成子图的标题 标题下方应有一个灰色框 位于散点的顶部 这是我尝试过的代码 x random sample range 50 50 y random sample range 50 50 fig pyplot figure
  • 浮点计算根据编译器的不同而变化

    当我运行在 Windows 和 Solaris 上编译的完全相同的代码执行完全相同的浮点计算 使用双精度 时 我得到的结果略有不同 我知道由于舍入误差 结果并不准确 然而 我本以为舍入误差是与平台无关的 从而在两个平台上给出相同的 稍微不正
  • 使用 SDK 的 iPhone 应用程序上的 reCaptcha

    有人在 iPhone 应用程序上使用过 reCaptcha 吗 我正在尝试弄清楚如何将其嵌入到我的应用程序中 在 iPhone 应用程序中使用 reCaptcha 的唯一方法是在应用程序中渲染 WebView reCaptcha 有一个很好
  • Git - 远程:致命:你在一个尚未诞生的分支上

    我正在尝试设置一个钩子来从我的桌面推送到我的服务器 这在过去已经工作了无数次 但现在我在设置新网站时遇到错误 remote fatal You are on a branch yet to be born 我一如既往地完成了与命令相同的系列