私は、ローカル ブランチをそのアップストリーム ブランチと自動的に同期するために作成したシェル スクリプトに取り組んでいます。これは、次の方法で行います。
- 最初にローカルでコミットされていない変更がないことを確認し、次に
- アップストリームから不足しているコミットを取得し、
- マージ(またはリベース)を行い、最後に
- 結果を上流にプッシュします。
問題は、アップストリームが裸ではない場合! [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
、リモート エンドでの任意のコマンドの実行に (またはその他のリモート メカニズム) が利用可能であると仮定し、リモートのリポジトリへの絶対パスも計算する必要があるため、クリーンで一般的に適用可能なソリューションではありません。
もう 1 つのオプションは、プッシュを試行し、この方法で失敗したときにそれを特定し、変更された refspec で再試行することです。しかし、それも少し醜いです。よりクリーンなソリューションはありますか?