如何通过编程预测git push何时会导致';分支当前已签出';错误?

如何通过编程预测git push何时会导致';分支当前已签出';错误?,git,sync,Git,Sync,我正在工作。它通过以下方式做到这一点: 首先检查本地没有未提交的更改,然后 从上游获取任何丢失的提交 进行合并(或重设基础),最后 问题是,如果上游是非裸的,推送很有可能会失败,并出现臭名昭著的错误,这是由于默认值receive.denyCurrentBranch。因此,我希望通过编程提前预测推送是否会以这种方式失败,以便我可以使用不同的refspec(例如,$branch:refs/remotes/$src/$branch)进行推送。这至少可以保证远程包含最新的提交,即使它们不在远程的工

我正在工作。它通过以下方式做到这一点:

  • 首先检查本地没有未提交的更改,然后
  • 从上游获取任何丢失的提交
  • 进行合并(或重设基础),最后
问题是,如果上游是非裸的,推送很有可能会失败,并出现臭名昭著的错误,这是由于默认值
receive.denyCurrentBranch
。因此,我希望通过编程提前预测推送是否会以这种方式失败,以便我可以使用不同的refspec(例如,
$branch:refs/remotes/$src/$branch
)进行推送。这至少可以保证远程包含最新的提交,即使它们不在远程的工作树中

这可以通过以下方式实现:

  • 连接到远程服务器
  • 跳过一些环来计算远程回购的绝对路径,然后
    chdir
  • 执行
    git config core.bare
  • 如果返回
    true
    ,则我们知道推送时不会出现
    [远程拒绝]
    错误
  • 如果返回
    false
    ,请在遥控器上执行另一个命令,以查看它是否与正在推送的命令匹配
但这就假设
ssh
(或其他一些远程机制)可用于在远程端执行任意命令,并且还需要计算远程端上的repo的绝对路径,因此这不是一个干净的、普遍适用的解决方案


另一个选项是尝试推送,以这种方式发现失败,然后使用修改后的refspec重试。但这也有点难看。有更干净的解决方案吗?

你就不能一直使用备用的refspec(
$branch:refs/remotes/$src/$branch
)吗?是的,我在最初的问题中已经提到了这一点:),但我也希望在可能的情况下更新远程的本地分支。经过一番思考,我想我将从上面的方法“推送到远程未签出的分支”切换到“始终推送到
refs/remotes/$src/$branch
,并尝试推送到
$branch
,但不要担心由于
$branch
已签出而失败”。也许这就是你的意思?但这需要检查其他错误,并计算
$src
。我仍然想知道原始问题的一个好答案:)