次のシナリオがあります。2つのリモートベアリポジトリrepo1とrepo2。それらはブランチを共有する必要があります。つまり、実際には、特定のブランチに関してrepo1への定期的なプッシュがあります。これらの変更は、repo2に同期する必要があります。
同期とは、フックやsthに基づく自動プルのようなものだと思います。このような。
上記の要件を満たす方法について、アイデアはありますか?
どうもありがとう!
次のシナリオがあります。2つのリモートベアリポジトリrepo1とrepo2。それらはブランチを共有する必要があります。つまり、実際には、特定のブランチに関してrepo1への定期的なプッシュがあります。これらの変更は、repo2に同期する必要があります。
同期とは、フックやsthに基づく自動プルのようなものだと思います。このような。
上記の要件を満たす方法について、アイデアはありますか?
どうもありがとう!
変更を転送するフックを設定します。、、、の4つpre-receiveのフックから選択して使用できます。updatepost-receivepost-update
最初の2つはプッシュ中に実行されるため、速度は低下しますが、中止することができます。後の2つはプッシュ後に実行されるため、ユーザーはそれらを待つ必要はありませんが、中止することはできず、エラーについて通知する別の方法が必要になります。
コードはほとんど同じで、非常に簡単です。単純なpost-update(ファイルhooks/post-update内のrepo1)バリアントは次のようになります。
#!/bin/sh
for ref; do
if [ refs/heads/branch-to-mirror = "$ref" ]; then
git push repo2 "$ref"
fi
done
ローカルブランチはまだ更新されていないため、/pre-receiveはupdate言う必要があります。git push repo2 $newsha:branch-to-mirrorもちろん、条件は異なる場合があります。ブランチをミラーリングする必要があることを示すものrepo2。
転送に失敗した場合にプッシュを中止するupdateフックは次のようになります。repo1repo2
#!/bin/sh
set -e
if [ refs/heads/branch-to-mirror = "$1" ]; then
git push repo2 "$3:$1"
fi
はset -e、スクリプトからエラーを伝播するために使用されます。または|| exit 1、コマンドの失敗を伝播するコマンドに追加することもできます。このフックは、更新された参照ごとに1回呼び出されるため、ループはありません。引数はrefname、古いSHA1、新しいSHA1であり、ローカルrefはまだ更新されていないため、プッシュでは新しいSHA1を使用する必要があります。