スタッフブログ

gitの弱点をMicrosoftが克服?


SCD所属、新入社員の新宅です。
今回もWindows 10のネタを…と思ったのですが、それは次回以降に投稿することにしました。
(Windows 10の次回投稿ネタはもう決まっていたりします。)

今回のネタは?

今回はGVFSというもののお話です。
GVFSとはGit Virtual File Systemの略で、Microsoftがgitの弱点を克服するために作ったものです。

What’s GVFS?

通常のgitはCloneした時を含め、常に全ての履歴とデータを保持します。そのため、gitは小規模な開発ワークロードに最適化されています。
100GB単位の極端に大規模なものをgitで扱うと、clone(ローカルにコピー)した時に数時間かかったり、commit(履歴保存)をした時に数十分かかったり、statusを見るだけでも数分かかったりしてしまいます。
Microsoftには、Windowsなど大規模な開発ワークロードが多数存在しており、gitを導入した際の障壁となったようです。そこで、gitの時間が掛かりすぎるという弱点を埋めるための、差分Cloneの仕組みをgitに導入しました。それがGVFSです。

GVFSの利用条件と入手について

GVFSを利用するためには以下の条件が必要です。

  • gitを扱えるスキルがあること
  • Visual Studio 2017 Community以上をインストールし、ビルド出来る知識があること
  • 64bit版のWindows 10 Creators Update または 最新のInsider Buildを利用していること(執筆時点)
  • 管理者権限を利用できること
  • リモートリポジトリがVisual Studio Team Servicesであること

こちらから入手することが可能です。https://github.com/Microsoft/GVFS

GVFSを利用開始するまでの手順

大体のことは、上記入手リンクの下部のReadme.mdに記述されていますので、そちらも御覧ください。

Visual Studio 2017のインストール

Downloads | IDE, Code, & Team Foundation Server | Visual Studio

こちらなどから、Visual Studio 2017 Community以上をインストールしてください。Communityは個人向けです。法人向けに利用される場合はProfessional以上のライセンスが必要です。

インストールする際に、インストールするコンポーネントを選択する画面が表示されますので、[個別のコンポーネント]タブをクリックします。
以下のコンポーネントにチェックを入れ、インストールを完了させます。

  • .Net Framework 3.5 開発ツール
  • C++/CLI サポート
  • VC++ 2015.3 v140 ツールセット(x86,x64)
  • Windows 10 SDK(10.0.10240.0)

InnoSetupとgitのインストール

http://www.jrsoftware.org/isdl.php
innosetup-x.x.x.exe(執筆時点ではinnosetup-5.5.9.exe)の最新版のDownload Sitesのリンクから適当にDLし、通常設定のままインストールします。

https://github.com/Microsoft/git/releases
また、こちらからGit-x.xx.x.gvfs.x.preview.x-64-bit.exeの最新版をDLし、インストールします。

GVFSソースの取得

GVFSのソースをgithubからローカルにCloneします。
コマンドプロンプトを開き、以下のコマンドを順番に入力します。

  1. cd c:\
  2. mkdir Repos\GVFS\src
  3. cd Repos\GVFS\src
  4. git clone https://github.com/Microsoft/GVFS.git

取得出来ましたら、gvlib.hを内容を変更せずにUTF-16(BOM無し)で上書き保存します。英語以外のロケール設定のWindows上でビルド出来ない問題が報告されていますが、暫定的にこの解決策で対処可能です。

GVFSのビルド

c:\Repos\GVFS\src\GVFS.sinをVisual Studio 2017で開き、そのままビルドします。

ビルドがエラーになるときのチェックリスト

  • gvlib.hをUTF-16(BOM無し)で保存し直していますか?
  • Visual Studioの別バージョンが同時にインストールされている環境では正しくビルド出来ないことがあります。一度全てVisual Studioをアンインストールし、2017のみを再インストールしてテストしてください。

GVFSのインストール

C:\Repos\GVFS\src\BuildOutput\GVFS\bin\x64\Debug\Setup
またはC:\Repos\GVFS\src\BuildOutput\GVFS\bin\x64\Release\Setup
上記フォルダパスに存在するSetupGVFS.exeを起動し、GVFSをインストールします。

リポジトリの準備

Plan, Code Together, & Ship Faster | Visual Studio Team Services

もし既存のgitリポジトリをお持ちで、そのリポジトリでお試しする場合は、一度Visual Studio Team Services(MSアカウント認証で無料です)でリポジトリを作成し、そこにpushし直してください。GVFSのメリットを体感するためには、可能な限り大きいリポジトリでテストすることを推奨します。

  1. git remote add vs [repo URL]
  2. git push vs

次に、Visual Studio Team Services上で、pushしたリポジトリのルートに「.gitattributes」ファイルを作成し、「* -text」と記述してcommit(保存)します。

GVFSによるClone

管理者権限のコマンドプロンプトで実行する必要があります。

通常は「git clone [repo URL]」ですが、GVFSの場合は[gvfs clone [repo URL]]です。
また、通常のgit cloneと違い、リポジトリの中身はカレントディレクトリではなく、その配下のsrcフォルダーにCloneされます。更に、一度にClone時にまとめて取得するのではなく、GVFSでは順次必要な時に取得される点も異なります。

2度目以降の利用開始と終了

管理者権限のコマンドプロンプトで実行する必要があります。

Cloneした時にGVFSによってマウントされています。利用終了後にはアンマウントすることが必要です。これを行わないと、使用状態がGVFSによってロックされ、そのリポジトリのフォルダの全体削除など、一部操作が行えなくなります。

  • gvfs unmount

また、一度アンマウントしたリポジトリをもう一度利用したいときには、再度マウントする必要があります。

  • gvfs mount

GVFSの使用感など

正直、GVFSのメリットを見出すレベルの開発ワークロードとなると、極端に長い歴史を持ち、更にコードが膨大な場合くらいです。初めにも記述した通り、100GB単位のリポジトリで初めて恩恵を受けるシステムです。
Railsの簡単な100MB程度のリポジトリで試行したところ、通常gitのほうが却って高速でした。
また、Lineage OSという有志によるAndroidのカスタムROMに含まれる「設定」アプリのリポジトリは800MB程度で、このくらいになると数分程度CloneがGVFSのほうが高速でしたが、その他のcommitなどはどちらもあまり変わりませんでした。
リポジトリ全体のフォルダーのサイズはGVFSのほうがずっと小さく、エクスプローラーなどが初めてファイルを参照した時に、順次ダウンロードされるようです。
毎回管理者権限でマウント・アンマウントをする手間も煩わしく、まだ実際の開発に使えるものではないと私は判断しました。

GVFSはとある新機能の土台となる?

GVFSはgitのための技術ではありますが、Microsoftの技術者向け発表会「Build 2017」で発表されたとある新機能と共通点があるのです。
それは、次期Windows 10でのOneDriveのプレースホルダー機能の復活です。元々Windows 8.xの頃にもあった機能ですが、こちらは動作がいまいちで、Windows 10の初期バージョンで削除されてしまいました。しかし、タブレット等容量が少ないPCで使いたいという要望も多く、ついに先日Insider向けに復活を遂げました。
この技術の根底にはGVFSが潜んでいそうだと私は思っています。

一応、GVFSはまだ開発プレビュー中のため、今後更に使いやすくなる改善があるかもしれません。