如何以编程方式预测git push何时会导致'branch is current out out'错误?

时间:2012-10-22 15:53:23

标签: git sync

我正在研究a shell script I wrote to automatically sync a local branch with its upstream branch。它通过以下方式实现:

  • 首先检查本地没有未提交的更改,然后
  • 从上游获取任何遗漏的提交,
  • 进行合并(或rebase),最后
  • pushing the result back upstream

问题在于,如果上游是非裸的,由于默认值receive.denyCurrentBranch,推送很可能会因臭名昭着的! [remote rejected] master -> master (branch is currently checked out)错误而失败。因此,我想以编程方式预先预测推送是否会以这种方式失败,以便我可以推送使用不同的refspec(例如$branch:refs/remotes/$src/$branch)。这至少可以保证远程包含最新的提交,即使它们不在远程工作树中。

这可以按如下方式完成:

  • 连接到远程服务器
  • 跳过一些箍来计算遥控器上回购的绝对路径,chdir到它
  • 执行git config core.bare
  • 如果它返回true,那么我们知道推送时不会出现[remote rejected]错误
  • 如果它返回false,则对遥控器上的determine which branch is currently checked out执行另一个命令,看它是否与被推送的命令匹配

但这假设ssh(或其他一些远程机制)可用于在远程端执行任意命令,并且它还需要计算远程控制台上的repo的绝对路径,所以它是不是一个干净的,普遍适用的解决方案。

另一种选择就是尝试推送,以这种方式失败时发现,并使用修改后的refspec重试。但那也有点难看。有更清洁的解决方案吗?

0 个答案:

没有答案