Git LFS が GitHub で使えることは前回確認したので、ほかのサービスではどうかを試してみました。ここではオンプレミスで使えることを前提として以下のもので試してみます。
- GitBlit 1.7.1
- GitLab Community Edition 8.5.1
これらの設置方法に関しての詳細は割愛します。
GitBlit
サーバー側で空リポジトリを作っておきます。
クライアント側で以下のようにリポジトリを作って、バイナリファイルを準備しておきます。
バイナリファイルとして適当な iso ファイルを入れてみました。
$ mkdir sample; cd sample $ git init $ git lfs track "*.iso" $ git add .gitattributes $ git add test.iso
これをコミットして、作成したリモートリポジトリに Push してみます。
$ git commit [master (root-commit) 4d47fc2] initial commit 2 files changed, 4 insertions(+) create mode 100644 .gitattributes create mode 100644 test.iso $ git remote add origin http://gitblit-server/sample.git $ git push origin master Git LFS: (1 of 1 files) 17.46 MB / 17.46 MB Counting objects: 4, done. Delta compression using up to 8 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (4/4), 401 bytes | 0 bytes/s, done. Total 4 (delta 0), reused 0 (delta 0) remote: Updating references: 100% (1/1) To http://gitblit-server/gitblit/r/sample.git * [new branch] master -> master
上記のような結果になりました。
正常に LFS のこともわかっている状態でリモートに上がったようです。
この状態を Web から確認してみると以下のようになってました。
バイナリファイルがそのまま格納されず、ハッシュ情報を持った小さなテキストファイルになっていることが確認できます。
一方でこのリポジトリをクローンして取得してみます。
$ git clone http://gitblit-server/sample.git sample-recv Cloning into 'sample-recv'... remote: Counting objects: 4, done remote: Finding sources: 100% (4/4) remote: Getting sizes: 100% (3/3) remote: Total 4 (delta 0), reused 4 (delta 0) Unpacking objects: 100% (4/4), done. Checking connectivity... done. Downloading test.iso (17.46 MB)
このような感じになりました。最後の行が示しているようにバイナリファイルも復元されているようです。
以上の点から GitHub と同じように特別な処置なしで LFS が扱えることがわかりました。
省略してしまいましたが、GitBlitでリポジトリの作成においても特別な設定は不要でした。
GitLab
同じようにローカルのリポジトリで iso ファイルを LFS 管轄にするところをまで整えておきます。また GitLab のほうでもリポジトリ(プロジェクト)を用意しておきます。
$ git init $ git lfs track *.iso $ git add test $ git commit
リモートを登録して Push してみます。
$ git push origin master Git LFS: (0 of 1 files) 0 B / 17.46 MB Git LFS is not enabled on this GitLab server, contact your admin. Docs: http://gitlab.example.com/help error: failed to push some refs to 'http://gitlab.example.com/root/test-lfs.git'
まさか失敗してしまいました。きちんとメッセージが表示されていますが、GitLab側での LFS が有効となっていないようです。
というわけで GitLab の設定をおこないます。
今回パッケージでインストールしたので /etc/gitlab/gitlab.rb を開いて、
以下のように編集します。とは言っても先頭の#を外して有効化しただけです。
gitlab_rails['lfs_enabled'] = true gitlab_rails['lfs_storage_path'] = "/mnt/storage/lfs-objects"
設定ファイルを変更したので、以下のようにして反映します。
$ sudo gitlab-ctl reconfigure
再び git push を試みてみます。
$ git push origin master Git LFS: (1 of 1 files) 17.46 MB / 17.46 MB Counting objects: 4, done. Delta compression using up to 8 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (4/4), 403 bytes | 0 bytes/s, done. Total 4 (delta 0), reused 0 (delta 0) To http://192.168.243.133/root/test-lfs.git * [new branch] master -> master
GitLab 側の設定に問題がなければこのように正常に Push できました。LFSの有効化についてはプロジェクトごとではなく、全体の設定となります。
ちなみにGitLab の設定が適当だとうまくいきません。サーバー名が正しくない場合以下のようにエラーとなります。
$ git push origin master Git LFS: (2 of 1 files) 0 B / 17.46 MB Put http://gitlab.example.com/root/test-lfs.git/gitlab-lfs/objects/5a68e7703871393fe392ed7d7786e5330ac3b0a34281d3c14ecc91547970c66b/18307072: dial tcp: lookup gitlab.example.com: getaddrinfow: No such host is known.
おまけ: ブランチに存在するLFS管轄ファイルについて
ブランチでLFS管轄になるファイルをコミット&プッシュした場合について確認しました。
登録&プッシュそのものに問題はないとして、取得する側ではどうなるかを見てみました。
$ git fetch origin remote: Counting objects: 4, done remote: Finding sources: 100% (3/3) remote: Getting sizes: 100% (3/3) remote: Total 3 (delta 0), reused 3 (delta 0) Unpacking objects: 100% (3/3), done. From http://gitblit-server/gitblit/r/sample * [new branch] work1 -> origin/work1
work1 というブランチに別のファイルを登録しましたが、この時点ではまだそのファイルは取得されていないようです。
そこでブランチを切り替えてみました。
$ git checkout work1 Downloading test2.iso (29.05 MB) Branch work1 set up to track remote branch work1 from origin. Switched to a new branch 'work1'
ようやくここでダウンロードが実行されるようです。
ちなみにこの後、master, work1 を切り替えてもバイナリデータは取得済みのため再ダウンロードは発生しません。