LoginSignup
0
1

More than 1 year has passed since last update.

巨大Subverionリポジトリをgit-svnで利用したときのメモ

Last updated at Posted at 2021-05-27

概要

リポジトリサイズがギガ単位のSubverion(SVN)リポジトリが運用されている環境に身を置きながら、git-svnを介して、gitでバージョン管理をしたときのメモ。

実験環境構築

clone(init&fetch)

いきなりgit svn cloneするよりはgit svn initした後に.git/configを編集して、git svn fetchした方がよい。
git svn clonegit svn fetchが途中で失敗した場合は、git svn fetchで再開できる。単に再開するだけで成功することが多い。

init
git svn init -s --prefix=svn/ --preserve-empty-dirs https://www.example.com/repos/project

不要なファイル・ディレクトリの除外

ignorepathsを指定することで、正規表現にマッチするパスをgit svn fetch時に無視する。
git svn fetchgit svn cloneコマンドのオプションとして指定するか、configに設定する。

git svn fetch --ignore-paths="^branches/old"
.git/config
[svn-remote "svn"]
    ignore-paths="\\.sdf$|\\.ipch$|^branches/bakcup|/rawdata/"

上の設定では以下のパスを無視している。
正規表現上で.を意味する\.\をエスケープする必要があるので\\.と入力する。

  • 拡張子が.sdf
  • 拡張子が.ipch
  • backupブランチ
  • rawdataディレクトリ

すでにfetchしてしまったデータをignore-paths指定によって消去することはできない。clone(init&fetch)からやり直すしかない。

負の遺産

今は削除されているが過去にコミットされてしまった巨大なファイルも、履歴上には残っている。すなわち、除外しなければgit-svnのローカルリポジトリに取り込まれてしまうので注意。

特定リビジョン範囲のみ取得(clone/fetch)

リビジョン数の大きいリポジトリに関しては、全リビジョンを取得すると膨大な時間が掛かる。ローカルリポジトリのサイズも大きくなりがち。
一部のみ取得することで軽量化できる。ただし、取得しなかった範囲の履歴は利用できない。

最新のみclone
git svn clone -r HEAD https://www.example.com/repos/project
最新のみfetch
git svn fetch -r HEAD
リビジョン100から最新までfetch
git svn fetch -r 100:HEAD

git gc --autoとの戦い

git操作時に一定条件を満たすとGCが走る。
GC実行中は操作不能になる。
GCの実行頻度が低い場合は手動でGCを実行することで、嫌なタイミングで操作不能になることを防ぐことができる。週に一度、作業終了時にGCを走らせておくなど。

git-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

一つのpackファイルのサイズ上限が1GB程度なので、巨大なリポジトリにおいては常にpacks > gc.autopacklimitとなっていることがあり得る。
頻繁な変更が発生するリポジトリにおいてはcountの値がすぐにgc.autoの値を超えるかもしれない。

下のコマンドで設定値が確認できる。
未設定の場合には何も表示されない。既定値を参照する。

config値確認
git config gc.auto
git config gc.autopacklimit

必要に応じて値を調整する。

git config gc.autopacklimit 200

参考

count-objectsの詳細は公式情報参照。

最新または利用バージョンのconfignの既定値は公式情報参照。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1