概要
リポジトリサイズがギガ単位のSubverion(SVN)リポジトリが運用されている環境に身を置きながら、git-svnを介して、gitでバージョン管理をしたときのメモ。
実験環境構築
clone(init&fetch)
いきなりgit svn clone
するよりはgit svn init
した後に.git/config
を編集して、git svn fetch
した方がよい。
git svn clone
やgit svn fetch
が途中で失敗した場合は、git svn fetch
で再開できる。単に再開するだけで成功することが多い。
git svn init -s --prefix=svn/ --preserve-empty-dirs https://www.example.com/repos/project
不要なファイル・ディレクトリの除外
ignorepaths
を指定することで、正規表現にマッチするパスをgit svn fetch
時に無視する。
git svn fetch
やgit svn clone
コマンドのオプションとして指定するか、configに設定する。
git svn fetch --ignore-paths="^branches/old"
[svn-remote "svn"]
ignore-paths="\\.sdf$|\\.ipch$|^branches/bakcup|/rawdata/"
上の設定では以下のパスを無視している。
正規表現上で.
を意味する\.
は\
をエスケープする必要があるので\\.
と入力する。
- 拡張子が
.sdf
- 拡張子が
.ipch
- backupブランチ
- rawdataディレクトリ
すでにfetch
してしまったデータをignore-paths
指定によって消去することはできない。clone(init&fetch)からやり直すしかない。
負の遺産
今は削除されているが過去にコミットされてしまった巨大なファイルも、履歴上には残っている。すなわち、除外しなければgit-svnのローカルリポジトリに取り込まれてしまうので注意。
特定リビジョン範囲のみ取得(clone/fetch)
リビジョン数の大きいリポジトリに関しては、全リビジョンを取得すると膨大な時間が掛かる。ローカルリポジトリのサイズも大きくなりがち。
一部のみ取得することで軽量化できる。ただし、取得しなかった範囲の履歴は利用できない。
git svn clone -r HEAD https://www.example.com/repos/project
git svn fetch -r HEAD
git svn fetch -r 100:HEAD
git gc --autoとの戦い
git操作時に一定条件を満たすとGCが走る。
GC実行中は操作不能になる。
GCの実行頻度が低い場合は手動でGCを実行することで、嫌なタイミングで操作不能になることを防ぐことができる。週に一度、作業終了時にGCを走らせておくなど。
git gc --prune=now
--prune=now
はブランチの削除等で到達不可能になったオブジェクトをすべて削除する。
git gc --autoの無効化
以下の設定で自動GCが無効になる。
git config gc.auto 0
完全に無効化するのではなく、頻度の調整がしたい場合は下記を参照。
git gcが頻発
gitの操作をする際に、以下のメッセージが表示されて処理が終わらなくなることがある。
このときgit gcが走っている。
Auto packing the repository in background for optimum performance.
リポジトリの大きさに比例して発生頻度が高くなり、所要時間は長くなる。
git gc 頻度調整
(可能ならgit gc
の後に)git count-object -v
を実行する。下のような情報が表示される。
> git count-objects -v
count: 11
size: 4904
in-pack: 15
packs: 1
size-pack: 8
prune-packable: 0
garbage: 0
size-garbage: 0
- auto gc開始条件
- count > gc.auto
- gc.autoの既定値: 6700
- packs > gc.autopacklimit
- gc.autopacklimitの既定値: 50
- count > gc.auto
一つのpackファイルのサイズ上限が1GB程度なので、巨大なリポジトリにおいては常にpacks > gc.autopacklimit
となっていることがあり得る。
頻繁な変更が発生するリポジトリにおいてはcountの値がすぐにgc.autoの値を超えるかもしれない。
下のコマンドで設定値が確認できる。
未設定の場合には何も表示されない。既定値を参照する。
git config gc.auto
git config gc.autopacklimit
必要に応じて値を調整する。
git config gc.autopacklimit 200
参考
count-objectsの詳細は公式情報参照。
最新または利用バージョンのconfignの既定値は公式情報参照。