4

git のバージョンが古すぎgit push --mirrorて gitolite サーバーからサポートできない場合、最初にgit clone --bare新しいリポジトリをgit fetch refs/*:refs/*作成してからバックアップ サーバーで使用することで機能をシミュレートできますか? *:*refspecとしても指定できますか? gitolite サーバー上のリポジトリはベア リポジトリであるため、作業ディレクトリがある場合にのみ使用されるオブジェクトをフェッチ コマンドでフェッチできなくても問題ありません。

私の回復戦略は、現在のサーバーが爆発した場合に、バックアップ サーバーの $BACKUPDIR の内容を新しい gitolite サーバーにコピーすることです。このシナリオでも期待どおりに機能しますか?

4

1 に答える 1

3

この質問は、古いバージョンの git をインストールして、このバージョンでソリューションが実際に機能するかどうかを確認しないと、答えるのが少し難しいです。(とにかく、どのバージョンに興味があるかはわかりません。) とはいえ、何を試すかについていくつかのヒントを提供しようとします。それが機能するかどうかは、自分で確認できます。

  1. 実際にシミュレートしたい場合以外に使用する理由はありませgit fetchん。git pushgit push --mirror

  2. refspecとして使用でき*:*ます(少なくとも最近のバージョンの git では)。これは とは異なります:。後者は両方のリポジトリに存在するブランチのみを選択するのに対し、前者は送信側サイトのすべてのブランチを選択して受信側サイトに送信し、必要に応じてそこで新しいブランチを作成します (これは と の両方に当てはまりますfetch) push。 .

  3. git push --mirror $REMOTE単一のコマンドでの最も近い概算は、次のようになります。

    git push -f $REMOTE *:*
    

    「本物」との違いは、リモート エンドのブランチを削除しないことです。これを無視することもできます -- とにかくバックアップとしてはかなり合理的かもしれません -- または、いくつかのコードをハックしてそれらを手動で削除することもできます。これが私の(本当に悪い)試みです:

    git ls-remote $REMOTE refs/* | カット -f 2 > リモートブランチ
    git show-ref | カット -d " " -f 2 > ローカルブランチ
    git push --delete $(join -v 1 remote-branches local-branches)
    

    この試みには根本的な欠陥があると思います。自己責任で使用してください。いずれにせよ、古いバージョンの git では機能しない可能性があります。(同じ種類の出力にタブを使用しているのにgit show-ref、スペースをフィールド区切り文字として使用していることに驚きました。)git ls-remote

于 2010-11-25T17:06:20.247 に答える