次のシナリオがあります。2つのリモートベアリポジトリrepo1とrepo2。それらはブランチを共有する必要があります。つまり、実際には、特定のブランチに関してrepo1への定期的なプッシュがあります。これらの変更は、repo2に同期する必要があります。
同期とは、フックやsthに基づく自動プルのようなものだと思います。このような。
上記の要件を満たす方法について、アイデアはありますか?
どうもありがとう!
次のシナリオがあります。2つのリモートベアリポジトリrepo1とrepo2。それらはブランチを共有する必要があります。つまり、実際には、特定のブランチに関してrepo1への定期的なプッシュがあります。これらの変更は、repo2に同期する必要があります。
同期とは、フックやsthに基づく自動プルのようなものだと思います。このような。
上記の要件を満たす方法について、アイデアはありますか?
どうもありがとう!
変更を転送するフックを設定します。、、、の4つpre-receive
のフックから選択して使用できます。update
post-receive
post-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
フックは次のようになります。repo1
repo2
#!/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を使用する必要があります。