1

我正在编写一个 shell 脚本,以自动将本地分支与其上游分支同步。它通过以下方式做到这一点:

  • 首先检查本地没有未提交的更改,然后
  • 从上游获取任何丢失的提交,
  • 进行合并(或变基),最后
  • 将结果推回上游​​。

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

这可以按如下方式完成:

  • 连接到远程服务器
  • 跳过一些箍来计算远程仓库的绝对路径,然后chdir到它
  • 执行git config core.bare
  • 如果它返回,true那么我们知道我们不会[remote rejected]在推送时收到错误
  • 如果返回false,则执行另一个命令以确定当前在远程上签出的分支,以查看它是否与正在推送的分支匹配

但这假设ssh(或其他一些远程机制)可用于在远程端执行任意命令,并且它也需要计算远程存储库的绝对路径,因此它不是一个干净的、普遍适用的解决方案。

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

4

0 回答 0