中心Git仓库不可用时,如何同步仓库及恢复正常工作流?
嘿,这个问题我之前折腾过,咱们一步步拆解解决:
1. 如何跳过正常的BitBucket工作流推送变更?
你遇到的报错! [remote rejected] master -> master (branch is currently checked out),核心原因是:Git默认禁止推送到一个已经检出了工作目录的分支——因为如果远程机器正在编辑这个分支的文件,推送会直接覆盖掉未提交的内容,风险很高。而BitBucket上的仓库是「裸仓库(bare repository)」,它没有工作目录,专门用来接收推送,所以不需要切换分支。
解决这个问题有两个靠谱方案:
方案一:把另一台机器的仓库改成裸仓库(推荐)
裸仓库是Git专门用于远程协作的仓库类型,没有工作目录,不会有推送冲突。操作步骤:- 登录到另一台机器,进入目标仓库目录
- 先备份当前的工作目录(如果需要保留的话):
mv .git ../repo-backup.git,然后把原仓库的文件移到备份目录 - 把仓库转为裸仓库:
git config --bool core.bare true - 之后你就可以正常用
git push ssh://USERNAME@SSH_SERVER_NAME/path/to/remote/bare-repository推送了
方案二:允许推送到当前检出的分支(适合临时场景)
如果不想改成裸仓库,可以修改远程仓库的Git配置,让它允许更新当前检出的分支:- 登录到另一台机器,进入目标仓库目录
- 执行命令:
git config receive.denyCurrentBranch updateInstead
这个配置会让Git在你推送时,自动把当前检出分支的工作目录更新到推送的版本,但要注意:远程机器上不能有未提交的本地变更,否则会触发冲突。
2. BitBucket后续能否同步这些变更?
完全可以,只要把另一台机器上的变更同步到BitBucket即可,有两种方式:
- 登录到另一台机器,把BitBucket添加为远程仓库:
git remote add bitbucket ssh://bitbucket-username@bitbucket.org/your-repo.git,然后执行git push bitbucket master把变更推上去 - 在你的本地机器上,把另一台机器的仓库作为远程拉取:
git remote add backup-machine ssh://USERNAME@SSH_SERVER_NAME/path/to/repo,然后git pull backup-machine master,再推送到BitBucket:git push origin master
3. 从两台机器分别执行拉取/推送操作是否足以恢复“正常”工作流?
是的,但要注意同步顺序,避免出现分支分歧:
- 首先确保另一台机器上的所有变更都已经推送到BitBucket(参考上面的方法)
- 在你的本地机器上,拉取BitBucket的最新内容,确保和另一台机器的代码一致
- 之后恢复原来的工作流:你推送到BitBucket,触发webhook让另一台机器拉取
- 后续操作时,要避免同时直接推送到另一台机器和BitBucket,确保所有变更都先同步到BitBucket,再由另一台机器拉取,这样就能保持三者(本地、BitBucket、另一台机器)的代码一致
内容的提问来源于stack exchange,提问作者doekman
相关产品推荐
相关产品推荐

