git - remote: fatal: 你在一个尚未诞生的分支上,使用 post-receive hook

git - remote: fatal: you are on a branch yet to be born, using post-receive hook

所以我正在尝试将 github 分支同步到我网站的两个部分,理论上是我 github should be synced with my website tinyweatherstation.com and the beta branch should sync with beta.tinyweatherstation.com 中的 master 分支,并且我已成功获得 post-receive钩子与 master 分支一起工作,但是当这个用于 beta 分支时:

git remote add live_beta ssh://wesley@tinyweatherstation.com/var/www/tinyweatherstation.com.git
git push live_beta +beta:refs/heads/beta

我收到错误:

    Enter passphrase for key '/c/Users/WesleyN/.ssh/id_rsa':
Counting objects: 999, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (967/967), done.
Writing objects: 100% (999/999), 5.04 MiB | 529.00 KiB/s, done.
Total 999 (delta 360), reused 0 (delta 0)
remote: Resolving deltas: 100% (360/360), done.
remote: fatal: You are on a branch yet to be born
To ssh://tinyweatherstation.com/var/www/beta.tinyweatherstation.com.git
 * [new branch]      beta -> beta

post 接收钩子看起来像这样...

#!/bin/sh GIT_WORK_TREE=/var/www/beta.tinyweatherstation.com/html git checkout -f

我已经提交到这个分支(测试版)所以我知道它在那里,所以请帮助...

  • 获取所有存储库:

    $ git remote add live_beta ssh://wesley@tinyweatherstation.com/var/www/tinyweatherstation.com.git
    $ git fetch --all
    
  • 使用远程的 beta 分支历史创建并检出到 beta 分支(确保不存在本地 beta 分支):

    $ git checkout beta
    
  • 推送到 live_beta 回购的 beta 分支:

    $ git push live_beta beta
    

错误消息来自推送目标(那里的Git)。鉴于您的 post-receive 挂钩是简单的一行表达式:

GIT_WORK_TREE=/var/www/beta.tinyweatherstation.com/html git checkout -f

这意味着 Git 住在:

ssh://tinyweatherstation.com/var/www/beta.tinyweatherstation.com.git

正如错误消息所说,"on a branch yet to be born"。也就是说,该(大概是裸)存储库的 current 分支有一些名称,例如 master,但该分支名称尚不存在。

有多种解决方案。一种是选择一个明确的分支来检查:

GIT_WORK_TREE=/var/www/beta.tinyweatherstation.com/html git checkout -f beta

这样,这个特定的 Git 就知道要通过名称 beta 而不是其当前分支(同样,可能 master — 从这里开始,我假设它 master) 实际上还不存在。

另一种方法是 在该 Git 存储库(在 tinyweatherstation.com/var/www/beta.tinyweatherstation.com.git 的服务器上)中 创建 分支名称 master。有多种方法可以做到这一点:例如,您可以登录那台机器,导航到裸存储库,然后使用 git branch 使名称 master 指向任何现有的提交,现在存储库中有一些提交。或者,从您的客户端计算机,您可以执行另一个 git push,但这次,执行一个推送到名称 master:

client$ git push live_beta master

(假设您希望服务器的 master 指向与您的客户端 master 指向相同的提交)。

还有一种方法是登录服务器,更改其HEAD象征性指向的名称,即更改当前分支的名称tinyweatherstation.com 服务器上:

server$ git symbolic-ref HEAD refs/heads/beta

现在没有分支名称的 git checkout -f 可以工作,因为名称 beta 指的是您之前推送的分支。

请注意,作为副作用,使用 git checkout -f beta 设置 当前分支 beta .