プロジェクトに最適な`.gitignore`をコマンドラインから簡単に生成するためのツール「gibo」

2019-03-30Bash, Git

プロジェクトに最適な.gitignore をどうやって作ろうかなと思っていたところ、 gibo という便利ツールを発見したのでメモ。

gibo は、プロジェクトに最適な .gitignore ファイルを作成してくれるツールです。
様々な言語、フレームワーク、ツールに対応していて、大抵のメジャーなものについては、簡単に .gitignore を生成できます。

ソースコードを読んでみましたが、簡潔で見やすく、シェルスクリプトの勉強に良いと感じました。

検証環境

$ uname -moi
x86_64 MacBookPro11,4 Darwin

$ bash -version
GNU bash, バージョン 5.0.3(1)-release (x86_64-apple-darwin18.2.0)

インストール

プラットフォームことに最適なインストール方法が異なりますが、実際1ファイルのシェルスクリプトなのでダウンロードしてきて $PATH 環境変数の通っているディレクトリに配置すれば動作します。

MacOS

Homebrewで一発でインストールできます。

$ brew install gibo \
    && gibo update

Unix系OS

$ curl -L https://raw.github.com/simonwhitaker/gibo/master/gibo \
    -so ~/bin/gibo && chmod +x ~/bin/gibo && gibo update

動作確認

インストールができたか確認してみましょう。

$ gibo --version
gibo 2.1.2 by Simon Whitaker <sw@netcetera.org>
https://github.com/simonwhitaker/gibo

Fetches gitignore boilerplates from https://github.com/github/gitignore

Usage:
    gibo [command]

Example:
    gibo dump Swift Xcode >> .gitignore

Commands:
    dump BOILERPLATE...   Write boilerplate(s) to STDOUT
    help                  Display this help text
    list                  List available boilerplates
    search STR            Search for boilerplates with STR in the name
    update                Update list of available boilerplates
    version               Display current script version

使い方

それではツールにふれていきましょう。

.gitignore の生成

ここではPHPのプロジェクトを例に取り上げていきます。

最近のPHPプロジェクトでは Composer を使用することが多いですね。
Composer は依存ライブラリをプロジェクト直下の vendor/ ディレクトリに配置します。
このディレクトリは多くの場合、Gitの管理対象から除外しておきたいです。

そこで毎回同じような内容を .gitignore 書くことになりますが、 そこで gibo を使います。
gibo の引数に dump composer を指定し実行すれば、最適な .gitignore ファイルを作成できます。

$ gibo dump composer
### https://raw.github.com/github/gitignore/e32de69dc7a71f84b1da648a5d893dd8bcc87d8a/Composer.gitignore

composer.phar
/vendor/

# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control
# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
# composer.lock

Laravel を使ったプロジェクトも多くなってきましたね。
同様にLaravelに最適化された .gitignore を生成できます。

( 最近のLaravelは npm も使うのでそのあたりの考慮も入ってますね。 .vagrant も付与されています。 )

$ gibo dump laravel
### https://raw.github.com/github/gitignore/e32de69dc7a71f84b1da648a5d893dd8bcc87d8a/Laravel.gitignore

/vendor/
node_modules/
npm-debug.log
yarn-error.log

# Laravel 4 specific
bootstrap/compiled.php
app/storage/

# Laravel 5 & Lumen specific
public/storage
public/hot
storage/*.key
.env
Homestead.yaml
Homestead.json
/.vagrant

複数の .gitignore テンプレートをまとめて出力させることもできます。

$ gibo dump Python TextMate

結果は標準出力に出力されるので、 .gitignore にリダイレクトして保存しておきましょう。

# 上書きする場合
$ gibo laravel > .gitignore

# 既存のファイルに追記する場合
$ gibo laravel >> .gitignore

提供されている「ボイラープレート」を一覧表示する

先程見た git dump コマンドですが、引数で指定したテンプレート名を ボイラープレート とよんでいます。
(僕の時代には「テンプレート」とか「スケルトン」とか呼んでいましたが、最近ではテンプレートのようなものを「ボイラープレート」と呼ぶようですね。)

gibo で利用できるボイラープレートを知りたい場合は、 gibo list コマンドを使います。

$ gibo list
=== Languages ===

Actionscript            CommonLisp              Erlang                  Idris                   Lua                     Phalcon                 Scala                   TurboGears2
Ada                     Composer                ExpressionEngine        IGORPro                 Magento                 PlayFramework           Scheme                  Typo3
Agda                    Concrete5               ExtJs                   Java                    Maven                   Plone                   SCons                   Umbraco
Android                 Coq                     Fancy                   JBoss                   Mercury                 Prestashop              Scrivener               Unity
AppceleratorTitanium    CraftCMS                Finale                  Jekyll                  MetaProgrammingSystem   Processing              Sdcc                    UnrealEngine
AppEngine               CUDA                    ForceDotCom             Joomla                  Nanoc                   PureScript              SeamGen                 VisualStudio
ArchLinuxPackages       D                       Fortran                 Julia                   Nim                     Python                  SketchUp                VVVV
Autotools               Dart                    FuelPHP                 KiCad                   Node                    Qooxdoo                 Smalltalk               Waf
C++                     Delphi                  Gcov                    Kohana                  Objective-C             Qt                      Stella                  WordPress
C                       DM                      GitBook                 Kotlin                  OCaml                   R                       SugarCRM                Xojo
CakePHP                 Drupal                  Go                      LabVIEW                 Opa                     Rails                   Swift                   Yeoman
CFWheels                Eagle                   Godot                   Laravel                 OpenCart                RhodesRhomobile         Symfony                 Yii
ChefCookbook            Elisp                   Gradle                  Leiningen               OracleForms             ROS                     SymphonyCMS             ZendFramework
Clojure                 Elixir                  Grails                  LemonStand              Packer                  Ruby                    Terraform               Zephir
CMake                   Elm                     GWT                     Lilypond                Perl                    Rust                    TeX
CodeIgniter             EPiServer               Haskell                 Lithium                 Perl6                   Sass                    Textpattern

=== Global ===

Anjuta                  CVS                     Espresso                Lazarus                 Momentics               PuTTY                   Tags                    Windows
Ansible                 DartEditor              FlexBuilder             LibreOffice             MonoDevelop             Redcar                  TextMate                Xcode
Archives                Diff                    GPG                     Linux                   NetBeans                Redis                   TortoiseGit             XilinxISE
Backup                  Dreamweaver             Images                  LyX                     Ninja                   SBT                     Vagrant
Bazaar                  Dropbox                 JDeveloper              macOS                   NotepadPP               SlickEdit               Vim
BricxCC                 Eclipse                 JEnv                    MATLAB                  Octave                  Stata                   VirtualEnv
Calabash                EiffelStudio            JetBrains               Mercurial               Otto                    SublimeText             Virtuoso
Cloud9                  Emacs                   Kate                    MicrosoftOffice         Patch                   SVN                     VisualStudioCode
CodeKit                 Ensime                  KDevelop4               ModelSim                PSoCCreator             SynopsysVCS             WebMethods

提供されている「ボイラープレート」を検索する

流石に git list では見にくいので部分一致、大文字小文字を無視して検索したい場合。
方法は2つあります。

  1. grep コマンドにパイプでつなぐ
  2. gibo search コマンドを使う

上記2つで若干動作が異なります。(バグではないかと思っている。)

こちらでは2つの「ボイラープレート名」が見つかります。パイプでつないだ場合にはgrepしやすいように一行ごとにボイラープレート名が出力されています。賢い!

# (1)
$ gibo list | grep -i php
CakePHP
FuelPHP

ところが、こちらでは3つの「ボイラープレート名」が見つかります。

# (2)
$ gibo search php
CakePHP
FuelPHP
ThinkPHP

ThinkPHP という「ボイラープレート名」が使えるか試してみました。

$ gibo dump ThinkPHP
Unknown argument: ThinkPHP

gibo dump で指定可能なボイラープレートは git list で見つかったもののみとなっているようです。

なぜ挙動が異なるか?ソースコードを見てみます。

「ボイラープレート」ごとの .gitignore ファイルはどこから取得している?

Githubから取得していた

gitbo のソースコードを見てみました。

先のインストール方法で実行していた gibo update コマンドですが、こちらを実行するとホームディレクトリ配下に、 .gitignore-boilerplates というディレクトリが作成されるようになっています。

ボイラープレート別の .gitignore ファイルはここに格納されます。

これらのファイルは gibo update したタイミングで GitHub - .gitignore templates から git clone し、以降はこのファイルを参照します。

.gitignore-boilerplates ディレクトリの配置場所を変更したい場合は?

GIBO_BOILERPLATES という環境変数に任意のディレクトリパスを指定することで、デフォルトのボイラープレート格納ディレクトリを変更することができます。

export GIBO_BOILERPLATES="/usr/local/src/gitignore"

Github上のボイラープレートファイルを更新するには

gibo では、テンプレートのアップデートは自動では行われないので、必要な場合は手動で行いましょう。

$ gibo update

gibo list | grep xxxgibo search xxx はなぜ挙動が違う?

上記2つのコマンドの挙動がなぜ異なるのか?

やはりこれも gitbo のソースコードを見てみました。

git list はボイラープレートテンプレートディレクトリ直下の .gitignore という拡張子のファイルを検索し出力しています。

一方 git search はボイラープレートテンプレートディレクトリ直下だけでなく、 再帰的.gitignore という拡張子のファイルを検索し出力しています。

このような動きの違いで gibo search のほうが見つかる .gitignore ファイルが多いようです。
(本当は gibo dump がこれに対応していないとおかしい気がしました。時間を見つけて作成者に聞いてみます。)

2019-03-30Bash, Git