2

私は2つの裸のリポジトリを持っています。それらは次のように作成されます。

ssh git@primary.com
git init --bare repo1
ssh git@backup.com
git clone --bare git@primary.com:repo1

1 つは開発に使用され (これをprimaryと呼びましょう)、もう 1 つはバックアップに使用されます (first にアクセスできない場合)。それらを自動的に同期することは可能ですか -git pullバックアップで行うようなものです。

裸のリポジトリをマージまたはプルすることはできないと思います。これではなく、バックアップリポジトリを最新の状態にする別の方法はありますか:

ssh git@backup.com
rm repo1 -fr
git clone -- bare git@primary.com:repo1

もちろん、プライマリにしばらくアクセスできず、バックアップを使用していた場合は、プライマリを更新したいと思います。

また、作業リポジトリに 2 つのリモートを追加することも解決策ですが、常に両方にプッシュする必要があり、一方にアクセスできない場合は起こりません。

すべての競合は非裸のリポジトリで解決されます

編集なぜバックアップリポジトリが必要なのですか:

リモートリポジトリを使用してコードを交換していますが、これは毎日必要です。通常、人々は他の開発者が作成したコードを必要としませんが、常にそうであるとは限りません。プライマリーとの連絡が 3 日間途絶え、開発は容易ではありませんでした。別のサーバーに 2 番目のリポジトリを作成し、ローカルにクローンを作成しましたが、多くのプロジェクトでそれを行う必要があり、時間がかかります。2 番目のリポジトリを自動的に更新することを好みます。

4

2 に答える 2

3

を使用git push --mirror other-remoteして、あるリポジトリ内のすべての参照を別のリポジトリにミラーリングできます。ただし、これはリポジトリ構成またはスタッシュをミラーリングしません。この質問の回答も参照してください。


更新:以下の明確な質問とコメントに応えて、強制的に refs を更新し、削除された refs を削除するgit push --mirrorため、両方向で安全ではないと言わざるを得ません。たとえば、あなたのonがその on よりも先にあり、まだミラーリングされていない新しいブランチが on にあるとします。その場合、a はon のブランチを古い状態にリセットし、新しく作成されたブランチを削除します。git push --mirrormasterprimarybackupprimarygit push --mirrormasterprimary

さらに、 からprimaryへのミラーリングのみを行っている場合でもbackup、 へのプッシュを許可するのは安全ではありませんbackup

それで、あなたは何ができますか?プライマリ リポジトリが利用できない場合、そのマシン全体が利用できないと想定しています。したがって、バックアップサーバーでは、あなたが提案するように、プライマリのcronジョブがリポジトリをミラーリングするベアリポジトリを1つ作成します。ただし、そのミラー化されたリポジトリへのプッシュを許可しないでください。プライマリ サーバーがダウンした場合は、ミラーをクローンして、その間にプッシュできるベア リポジトリを作成します。プライマリ サーバーがバックアップされたら、人々がバックアップの新しいリポジトリにプッシュできないようにし、そこからの変更をローカルでマージして、新しい作業をプライマリ サーバーにプッシュします。

于 2011-04-05T13:58:38.333 に答える
0

crontab スクリプトなどを使用して、バックアップに対して git push --mirror remote を定期的に実行します。また、コミット フックを追加して、更新時に別のリモートへのプッシュを自動的に強制することもできます。この方法では、「失敗ウィンドウ」がありません。独自の新しいコンテンツや更新されたコンテンツはおそらくないため、バックアップから更新する必要はありません。

于 2011-04-05T17:43:58.600 に答える