HimaJyunGitはソースコードを扱うための物であり、通常、バイナリファイルをバージョン管理する事は不得意です。そこで、ファイルをポインタとして扱い、別途それ用のサーバに転送する事で良しなにしようと言うgit-lfsと言う物があります。比較的最近に出来た物なので、「それ用のサーバ」として良い感じの物がありません。今回はGitoliteにそれ用のサーバ機能を載せられるものを作ってみました。終わりにgit-lfsgit-lfsはGitHub社が開発したgit用の拡張機能です。拡張機能と言う位置付けではありますが、サーバ側だとGitHubはもちろんの事、BitBucketやGitLab、VisualStudioTeamServices(長い......)などが対応、クライアント側であればSourceTreeやVisualStudioが対応しており、ある種の標準に近いものになるのではないかと(個人的には)思います。(VisualStudioは対応と言っておきながらcloneしか出来ません、pushのやり方をご存知でしたら教えてください)今回はこのgit-lfsのサーバ側の方としての機能をGitoliteにぶち込んでやろうと思います。ここを訪れる方の多くはgit-lfsについてはご存じで、先進的な物に敏感で、優秀な才能を持つ方達だと思いますので、詳しい説明は不要かと思いますが......git-lfsはリモートレポジトリに対してファイルのポインタだけを送信し、バイナリファイルそのものは「それ用のサーバ」に転送します。「それ用のサーバ」はHTTPでの通信となっており、ややこしめです。そこで、今回はSmartHTTPに対応させたGitoliteを応用して、「それ用のサーバ」機能を作成してみました。gitolite-lfsその名も「gitolite-lfs(ネーミングセンスの欠片もない」です、これはPerlCGIを用いて作成されており、Gitoliteのアクセス制御をそのまま利用しています。Perlは使った事ありませんでしたが、Gitoliteの機能を利用するために必要だったのでググりながら頑張ってみました。(比較的枯れているので「その書き方はもう古い!!今はこれだ!!」的なのはなくて楽でしたが)機能メモリセーフ(GB単位のファイルをアップロードしたとしても、それをメモリにため込んでOOM爆死したりするアホな事はしません)X-Sendfile、X-Accel-Redirectに対応(使わなくても十分使える速度だと思いますが......)Webサーバ側のタイムアウトさえきちんと設定すれば、10Gでも100Gでもアップロード出来ると思われます。addにおぞましい時間が掛かるようになりますけどね。設定例を説明するために前提条件を設定しましょう、お好みに合わせて読み替えてください。「/var/git」にGitoliteがインストール済み(Gitoliteのインストールは別の記事をご覧ください。「gitolite-shell」は「/var/git/bin」に存在gitolite-lfsは「/var/www/git」にインストールインストールGitoliteとWebサーバの双方と連携する必要があるので、少々インストールがややこしめです。説明していきましょう。配置と設定とりあえずファイルを配置して少しの設定を行いましょう。cloneして、ファイルを移動させます。/var/www/git/の部分はお好きに調整してください。/var/www/git/これそのものの設定項目は少な目です。/var/www/git/gitolite-lfs.shを開きましょう。以下の項目の設定が必要です。Gitoliteのホーム(前提条件の通りであればこのまま動作します。Gitoliteのlibの場所(bin/libです。git-lfsのアップ/ダウンロード時のバッファサイズ、X-Sendfileを利用する場合、ダウンロードは無視されます。NginxでX-Accel-Redirectを使用する場合に設定が必要です。&quot;lfsdownload&quot;,);SSHのコマンドを追加するgit-lfsのイミワカンネー所はHTTPでの通信にしか対応していないせいでSSH経由でのアクセスの際に別途HTTPのURLを教えてやる必要がある事です、正直めんどくさい仕様ですが、Gitoliteは独自のコマンドも簡単に追加出来るので対応が楽です。/var/git/.gitolite.rcを開いて設定を変更します。&quot;$rc{GL_ADMIN_BASE}/local&quot;,「ENABLE」に「'git-lfs-authenticate',」を追加します。'git-lfs-authenticate',]ここから普段使いのPC(gitolite-adminレポをclone出来るアカウント)で作業します。gitolite-adminレポジトリをcloneしていない場合はcloneします。gitolite-admin「local/commands」ディレクトリを作成します。local/commandsコマンド用のスクリプトをDLします。masterApacheの設定このgitolite-lfsを利用できるようにすると言う事は、同時にGitoliteをSmartHTTPに対応させると言う事でもあります。Gitoliteは権限がややこしいのでsuEXECを使うのが一般的な手法です、少しずつ解説していきましょう。何はともあれ、suEXECがなければ始まりません、インストールしましょう。apache2-suexec-customsuEXECはパーミッションの設定がややこしいのですが、ここはfindでまとめて調整してしまいます。以下はApacheが.htpasswdを読み取れるようにするために必要です、LDAP認証とかを利用しているのであれば不要です。/var/www/git/.htpasswdついでにモジュールを有効にしておきましょう。suexecバーチャルホストの設定GitoliteをSmartHTTPに対応させる時、/git/hoge.gitなどでアクセス出来る様にする設定を見かけた事がありますが、今のGitoliteでは不可能です。(スラッシュ区切りでレポジトリをサブディレクトリに入れられるようになったため)ですので、ここはバーチャルホストで行きます。Gitoliteはユーザの識別にBasic認証を通過したユーザ名を利用しているため、Basic認証は必須です。git-credential-cacheを使わなくてもユーザ名、パスワードをやたらめったら要求されなくなります。X-Sendfileを使用する場合は/var/www/git/lfs/config.plのX_SENDFILEを&quot;X-Sendfile&quot;に設定してください。combined&lt;/VirtualHost&gt;X-Sendfileを利用する場合X-Sendfileを利用する場合、git-lfsのデータがWebサーバの実行ユーザから読み取れる必要があります。最初にmod_xsendfileをインストールしておきます。libapache2-mod-xsendfileまずは.gitolite.rcを開きましょう。/var/git/.gitolite.rc上の方に「UMASK」という項目があります、デフォルトだと0077になっているはずなので、これを0027に変更してください。以下のコマンドで権限を調整します。レポジトリが/var/git/lfs以外の場合、Gitoliteの実行ユーザがgit以外の場合は読み替えてください。/var/git/lfs/あとはWebサーバの実行ユーザ(www-data)をGitoliteの実行ユーザのグループ(git)に追加します。git先ほどの設定例のコメントにも書いてありますが、X-Sendfileを有効にする必要があります。/var/git/lfsまた、/var/www/git/lfs/config.plのX_SENDFILEを"X-Sendfile"に設定してください。上記のApacheでの設定と同じことをnginxでやりたい場合の設定例です。nginxはその仕様から、この様な用途には不向きで、苦手です。あなたが可能であるならば、nginxではなくApacheを使う事を検討して下さい。CGIの設定nginxは単体でCGIスクリプトを実行したりする機能がありません。(そして、FsatCGIスクリプトを起動する機能もありません)そのため、fcgiwrapでこのCGIをFastCGIにラッピングして、spawn-fcgiで起動させる必要があります。fcgiwrapとspawn-fcgiをインストールしておきましょう。fcgiwrapそれらを起動させるためのinitスクリプトも(一応)用意しましたのでご利用下さい。gitolite-lfsinitスクリプト内に設定項目があるので設定を行いましょう。==============サービスを追加します。gitolite-lfsデーモンを起動しましょう。gitolite-lfsバーチャルホストの設定ここいらはApacheとそう変わりません。巨大なファイルのアップロードを許可します。Gitoliteはユーザの識別にBasic認証を通過したユーザ名を利用しているため、Basic認証は必須です。gitolite-lfs.shを指定します。/var/www/git/lfs/config.plのX_SENDFILEに&quot;X-Accel-Redirect&quot;を設定してください。/var/www/git/config.plのNGX_ACCEL_PATHに&quot;lfsdownload&quot;を設定してください。/var/log/nginx/error.log;}X-Accel-Redirectを利用する場合Apacheと同じように、実行ユーザがgit-lfsのデータを読み取れる必要があります。.gitolite.rcを開きましょう。/var/git/.gitolite.rc「UMASK」の値を「0027」に変更します。ファイルの権限を調整します。レポジトリが/var/git/lfs以外の場合、Gitoliteの実行ユーザがgit以外の場合は読み替えてください。/var/git/lfs/あとはWebサーバの実行ユーザ(www-data)をGitoliteの実行ユーザのグループ(git)に追加します。gitやはりApacheと同じようにX-Accel-Redirectを有効にする必要があります。先ほどの設定例の中でコメントアウトされていた設定をアンコメントしてください。/var/www/git/lfs/config.plのX_SENDFILEを"X-Accel-Redirect"に、NGX_ACCEL_PATHを"lfsdownload"に設定してください。終わりにこれはどちらかと言うと自分向けに用意した様な物なので、少々扱い辛くなってしまっていますが、もし「Gitoliteでもgit-lfsが使いたい、でも良いサーバがない!!」みたいな場合は使ってみてください。ちなみにですが、GitLabはgit-lfsをサポートしているので、性能面の問題(GitLabは少々重め)と、英語onlyな問題がクリア出来るのであればそちらの方がオススメかも知れません。Piの性能でGitLabは厳しいでしょうからこの様にして解決しています。1.9がリリースされてしまいました。圧縮、素早く送信、mod_deflateの設定方法このWeb鯖では、帯域の削減とページ表示を高速化する目的でgzip圧縮して転送し......続きを読む→[Bash]screenが終了するまで待機する僕の運営するマイクラ鯖はscreenで動かしています。前回の「......続きを読む→PREVJavaをアップデートしたらMinecraftが起動しなくなった時の対処法NEXTgit-lfsの仕様(サーバ側)を個人的に解説してみるナカのヒト:HimaJyun​散って美しいのは桜だけです、情報はまとまっていた方が美しいのです。