0

次のシナリオがあります。2つのリモートベアリポジトリrepo1とrepo2。それらはブランチを共有する必要があります。つまり、実際には、特定のブランチに関してrepo1への定期的なプッシュがあります。これらの変更は、repo2に同期する必要があります。

同期とは、フックやsthに基づく自動プルのようなものだと思います。このような。

上記の要件を満たす方法について、アイデアはありますか?

どうもありがとう!

4

1 に答える 1

2

変更を転送するフックを設定します。、、、の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-receiveupdate言う必要があります。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を使用する必要があります。

于 2013-01-02T09:29:17.763 に答える