我正在编写一个 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 重试。但这也有点难看。有更清洁的解决方案吗?