0

私は、スクリプト化された方法でバックアップ サーバーに変更をプッシュする方法を検討していました。最初の試みは、冗長チェックを目的としていました。ソース サーバーはその変更をリモート サーバーにプッシュしました。バックアップ チェックとして、リモート サーバー上に存在するすべてのリポジトリに対して 24 時間間隔で git リモート アップデートが実行されました。目標は、失敗した/見逃した、または中断されたプッシュが更新によって確実にキャッチされるようにすることです。ローカル ブランチとリモート ブランチの両方が表示されることに気付きました。ユーザーはリポジトリを使用していなかったので、指定されたコミットは同じ SHA 値に関連付けられており、管理者はそれに対処するための文書化された復元ポリシーを持っていたので、追加されたブランチを喜んで処理しました。私が驚いたのは、git branch -a を実行したときにブランチが 2 倍になっただけではなく、リポジトリのサイズが 2 倍になりました。以下は、すべてのブランチのバックアップ プッシュ後に git remote update を実行する前後の影響です。

$ du -sk test.git.old/

2419504 test.git.old/

$ du -sk test.git

5120684 test.git

私はこれを回避しようとしていますが、疑問は残ります。SHA 値は同じなのに、既存の SHA 値を参照するだけでなく、コードが 2 回保存されているのはなぜですか?

4

2 に答える 2

4

毎日の自動更新を使用すると、多くのルーズ オブジェクトによって、git オブジェクト データベースが肥大化する可能性があります。

を使用して git objectstore を再パックしてみてください

git gc

また

git gc --aggressive

アグレッシブは定期的に実行することはお勧めしませんが、ブルー ムーンに 1 回実行することは問題ありません (ただし非常に遅い)。

両方のリポジトリでこれを実行すると、サイズはほぼ同じになります。

于 2013-01-08T10:00:51.197 に答える
0

git は sha-1 ハッシュごとに 1 つのオブジェクトのみを保存するという点で正しいです。ただし、git は、パックされているかどうかに応じて、オブジェクトを別の方法で (および別のサイズで) 格納します。「git gc」は、ガベージ コレクションを強制してリポジトリ サイズを縮小する通常の方法です。1 つのリポジトリが大きいからといって、オブジェクトが複製されているわけではありません。「ベア」レポは、作業レポよりも小さくなります。

リモート サーバー リポジトリとバックアップ リポジトリを持つというより広い目標のために、他の開発者と同じようにバックアップ "git pull" を持つことができます。複製されたリポジトリ (最新のもの) には、「サーバー」リポジトリを複製するためのすべての情報が含まれることを忘れないでください。

私があなたのために思いついた(直接使用していない)1つのアイデアは、次のようにセットアップを構成することでした:

developer 1 repo ----->  repo.server  (bare)   <---  repo.backup (bare mirror)
                            ^
developer 2 repo -----------|  

このように設定すると、「サーバー」リポジトリのミラーを簡単に作成できます。これは、後で「サーバー」リポジトリが失われた場合に直接使用できます。

ミラーテクニックを試すのはこれが初めてなので、ランスルー(以下)を行いました。私の場合、リポジトリの「膨張」はありませんでした。ただし、異なる git コマンドを使用している可能性があるため、比較すると便利です。

$ mkdir repo.local
$ mkdir repo.server
$ mkdir repo.backup
$ git init repo.local/      # initial repo
Initialized empty Git repository in /home/username/code/gittest/repo.local/.git/
$ cd repo.local/
repo.local$ dd if=/dev/urandom of=garbage.dat bs=1M count=2   # 2MB random file
2+0 records in
2+0 records out
2097152 bytes (2.1 MB) copied, 0.486459 s, 4.3 MB/s
repo.local$ git add garbage.dat
repo.local$ git commit -m "+ added 2MB file"
[master (root-commit) 0664e21] + added 2MB file
 1 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 garbage.dat
repo.local$ cd ..
$ git init --bare repo.server/      # bare server repo
Initialized empty Git repository in /home/username/code/gittest/repo.server/
$ cd repo.local/
repo.local$ git push ../repo.server/ master  # push to bare repo
Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 2.00 MiB, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To ../repo.server/
 * [new branch]      master -> master
repo.local$ # add repo.server as origin remote, just as if repo.local was a clone of repo.server
repo.local$ git remote add origin /home/username/code/gittest/repo.server/
repo.local$ git pull origin master
From /home/username/code/gittest/repo.server
 * branch            master     -> FETCH_HEAD
Already up-to-date.
repo.local$ cd ..
$ git push --mirror repo.backup/
fatal: Not a git repository (or any of the parent directories): .git
$ git init --bare repo.backup/   # bare server repo
Initialized empty Git repository in /home/username/code/gittest/repo.backup/
$ git push --mirror repo.backup/
fatal: Not a git repository (or any of the parent directories): .git
$ cd repo.server/
repo.server$ git push --mirror ../repo.backup/
Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 2.00 MiB, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To ../repo.backup/
 * [new branch]      master -> master
repo.server$ cd ..
$ du -sk repo.*
2180    repo.backup
4272    repo.local
2180    repo.server
$ cd repo.local/
repo.local$ git checkout -b topic1
Switched to a new branch 'topic1'
repo.local$ dd if=/dev/urandom of=garbage.dat bs=1M count=3   # 3MB random file
3+0 records in
3+0 records out
3145728 bytes (3.1 MB) copied, 0.729684 s, 4.3 MB/s
repo.local$ git add .
repo.local$ git commit -m "+ revision 2"
[topic1 d9d12d6] + revision 2
 1 files changed, 12161 insertions(+), 8105 deletions(-)
 rewrite garbage.dat (67%)
repo.local$ git branch -a
  master
* topic1
repo.local$ git push origin topic1
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 3.00 MiB, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /home/username/code/gittest/repo.server/
 * [new branch]      topic1 -> topic1
repo.local$ git pull origin topic1
From /home/username/code/gittest/repo.server
 * branch            topic1     -> FETCH_HEAD
Already up-to-date.
repo.local$ git branch -a
  master
* topic1
  remotes/origin/master
  remotes/origin/topic1
repo.local$ cd ..
$ du -sk repo.*
2180    repo.backup
8436    repo.local
5284    repo.server
$ cd repo.server/                                       
repo.server$ git push --mirror ../repo.backup/         
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 3.00 MiB, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To ../repo.backup/
 * [new branch]      topic1 -> topic1
repo.server$ cd ..
$ du -sk repo.*
5284    repo.backup
8436    repo.local
5284    repo.server
$ cd repo.server/
repo.server$ git branch -a
* master
  topic1
repo.server$ cd ../repo.backup/
repo.backup$ git branch -a
* master
  topic1
repo.backup$
于 2013-01-08T15:05:52.660 に答える