24

で git リポジトリの増分バックアップを行う最も簡単な方法は何git bundleですか?

1 つのブランチだけをバックアップしたい場合は、次のようなことができます。

git bundle create foo last-backup..master
git tag -f last-backup master

しかし、すべて (すべてのブランチを含む) をバックアップしたい場合はどうすればよいでしょうか?


コメントの質問に答えるには:

厳密に言えば、ソリューションが次の特性を満たしている限り、通常の Git バンドルを使用する必要はありません。

  • 各増分バックアップは 1 つのファイルです。どこかに保存でき、その後の増分バックアップでこのファイルを変更する必要はありません。

  • ファイルのサイズは、前回のバックアップ以降の Git コミットの合計サイズとほぼ同じです。バイナリ ファイルの変更も効率的に保存されます。

  • それ以降の完全バックアップとすべての増分バックアップには、すべてのブランチを含む、リポジトリを自動的に再構築するために必要なすべてが含まれています。

(単純な例として、自動ガベージ コレクションが発生した場合など、git リポジトリ内の最近変更されたファイルを含む tar アーカイブを単純に構築するだけでは、2 番目の要件を満たすことができません。)

そして理想的には、私はばかではないシステムを持ちたいと思っています:

  • Git リポジトリのほぼすべての完全バックアップと、最近のすべての増分バックアップを取得できます。バックアップからすべてを「プル」するだけで、リポジトリが最新になります。特に、完全バックアップと増分バックアップの間に部分的な重複があっても問題ありません。

ブランチを 1 つだけ処理する必要がある場合、Git バンドルはこれらすべてをうまく満たしてくれます。

4

4 に答える 4

14

(この問題について Jukka と話し合いました。これが結果です。)

予選:

  1. 最後のバックアップを次のように利用できるようにするbackup.bundle
  2. backup指し示すリモコンを用意するbackup.bundle

バックアップの作成:

  1. git fetch backup– 最新の状態であることを確認するため
  2. git bundle create newbackup.bundle ^backup/A ^backup/B A B C
    • これは、すでにバンドルに含まれていたものをすべて除外するバンドルを作成することを意味します
    • ^backup/Aから必要な -style 引数を生成するのは簡単ですrefs/remotes/backup/
    • 同様に、A-style 引数はrefs/heads
  3. newbackup.bundleバックアップを保存している場所にコピー
  4. に置き換えbackup.bundlenewbackup.bundle、次の増分バックアップを開始する場所がわかるようにします

回復:

  1. 空であるか、リポジトリの古いバージョンを表すリポジトリを持っている
  2. すべてのバックアップ ファイルについて、順番に:
    1. git remote rm recovery
    2. git remote add recovery <name-of-bundle>
    3. git fetch recovery– これを機能させるには、リモートに名前を付ける必要があります
  3. これで、すべてのブランチが利用可能になるはずですrefs/remotes/backup
于 2012-08-31T13:58:33.967 に答える
6

--sinceと--allを使用してみてください。

最初のバックアップを作成します。

git bundle create mybundle-all --all

増分バックアップを実行します。

git bundle create mybundle-inc --since=10.days --all

インクリメンタルには、過去10日間に発生したすべてのブランチのすべてのコミットが含まれている必要があります。--sinceパラメーターが十分に戻っていることを確認してください。そうしないと、コミットを見逃す可能性があります。また、その時間枠内にコミットが発生しなかった場合、Gitはバンドルの作成を拒否するため、そのための計画を立ててください。

于 2012-08-31T09:50:51.220 に答える
1

あなたができる

git clone --mirror <your_repo> my-backup.git

すべての参照を含む裸のレポが作成されます。

その後、定期的に行うことができますgit push --mirror <my-backup>

于 2012-08-26T20:45:00.773 に答える
-1

opqdonutソリューションは機能しないようです。^backup/A ^backup/B は最後の増分バックアップのみを指すためです。実際には、以前のすべての増分バックアップから参照を除外する必要があります。

以前のバンドルごとにリモートを作成する必要があります。

UPD: いいえ、動作するはずです。以下の Jukka のコメントを参照してください。

于 2013-03-01T20:40:17.950 に答える