ゆろぐ

ゲームブログ

【Lhamiel】.gitignore の書き方で圧縮から外せるソフトを作った話【ラミエル】

ポイント3行

  • 自作の圧縮ソフト Lhamiel に、圧縮するときだけ特定のファイルを外す機能を付けて、その書き方を .gitignore とそっくり同じにした
  • *.log や node_modules/ のような書き方を1行ずつ並べるだけで、いらないファイルをまるごと荷物から外せる
  • 設定はボタン4つで管理でき、テキストエディタで直接書き換えても保存した瞬間にアプリへ反映される

圧縮ボタンを押した瞬間「うわ、デカっ」となったことありませんか

作りかけのプログラムのフォルダを丸ごと圧縮して人に送ろうとした時、圧縮ボタンを押した瞬間にファイルサイズがとんでもないことになっていて、思わず「うわ、デカっ」と声が出たことがあります。中身を見てみたら、自分が書いたコードはほんのちょっぴり。残りの大半は node_modules という外から借りてきた部品の置き場だったり、.git という変更の履歴を全部しまってある倉庫だったり、ビルド成果物という組み立て済みの完成品だったりしました。どれも相手には不要なのに、ふつうの圧縮ソフトは渡されたフォルダの中身を律儀に全部箱詰めしてしまうので、箱が無駄にパンパンになるわけです。私はこの「いらない物まで一緒に固まる」問題を、自作のソフトでなんとかしたいとずっと思っていました。

荷造りのときに「これは持っていかない」と決めるメモの話

引っ越しや旅行の荷造りをするとき、私はいつも「これは持っていかないリスト」を先に作ります。全部の箱に何でもかんでも詰め込むと、箱が重くなるし、数も増えるし、運ぶのも開けるのも大変になるからです。先に「置いていく物」を決めておくと、本当に必要な物だけが箱に入って、荷物がすっきり軽くなります。

ファイルを圧縮するという作業も、これとそっくりです。圧縮というのは、たくさんのファイルをひとつの箱にギュッと詰め込んで、サイズを小さくして持ち運びやすくすることです。でも、箱に詰める前に「これは詰めなくていいや」という物まで全部詰めてしまうと、箱が無駄に大きく重くなってしまいます。

私が作っている圧縮ソフト Lhamiel に、今回まさにその「持っていかない物リスト」を作る機能を入れました。しかもその書き方を、プログラマーがふだん使っている .gitignore という仕組みとまったく同じにしたんです。今回はこの「持っていかない物リスト」の書き方を、ひとつずつ短い例つきで丁寧に紹介していきます。

そもそも Lhamiel ってどんなソフト

先に主役のソフトを軽く紹介させてください。Lhamiel は Windows 10 と 11 で動く、ファイルを圧縮したり展開したりするための無料のアプリです。読み方は「ラミエル」。難しい操作はいりません。圧縮したいファイルやフォルダを、アプリのウィンドウにマウスでドラッグ&ドロップ、つまりつかんで放り込むだけで圧縮が始まります。

作れる箱の形式は ZIP・7z・TAR の3種類。展開、つまり箱を開ける方は RAR や LZH や CAB といったものにも対応しています。動作はとても軽く、別の追加ソフトを入れなくてもそのまま動きます。表示は17の言語に対応していて、画面の色も明るいテーマと暗いテーマを選べます。

この身軽な圧縮ソフトに、今回の主役である「圧縮するときにいらない物を外す機能」が加わった、というわけです。

昔は「名前そのまま」しか書けなかった

実は前の Lhamiel にも「除外」、つまり「このファイルは箱に入れない」という設定はありました。ただ、その頃は除外したいファイルやフォルダの名前を、そのまんま書き並べるだけでした。

たとえば secret.txt と書けば、その名前のファイルだけが外れる。これはこれで分かりやすいのですが、不便な点がありました。ログファイルを全部外したいとき、error.log と access.log と debug.log と、1個ずつ全部書かないといけなかったんです。名前が少し違うだけの仲間がたくさんあると、リストがどんどん長くなって面倒でした。cache1 や image_cache のような、ちょっと名前が違うだけの仲間も、いちいち別の行に書き足す必要がありました。

そこで今回、書き方を .gitignore というルールに合わせて作り直しました。.gitignore というのは、もともとプログラマーが「この種類のファイルはまとめて無視してね」と指定するための、昔からある書き方の決まりです。すでにこの書き方を知っている人なら、新しく覚えることはゼロ。知らない人も「外したい物を1行ずつ書くだけ」から気軽に始められます。

書き方ガイド:この7つだけ覚えれば全部使える

ここからが本題です。Lhamiel の除外リストは .lhaignore という名前のテキストファイルに書きます。読み方は「ラミエルイグノア」。書き方には基本のルールがいくつかあります。まずは全体像を表でまとめておきます。

書き方 意味 短い例 その例が外す物
# で始まる行 コメント。除外には使われない人間用のメモ # ログ類を外す 何も外さない
* 任意の文字列にマッチする合言葉 *.log 名前が .log で終わるファイル全部
? 任意の1文字だけにマッチ file?.txt file1.txt や fileA.txt など
** 階層をまたいでマッチ **/cache どの奥のフォルダにある cache でも
[abc] 候補のどれか1文字 [Tt]humbs.db Thumbs.db でも thumbs.db でも
末尾の / フォルダだけにマッチ node_modules/ node_modules という名前のフォルダ
先頭の / いちばん上の階層だけに限定 /build 真上にある build だけ
先頭の ! 否定。やっぱり入れる、に戻す !keep.log 一度外した keep.log を戻して入れる

文字だけだと分かりにくいので、ひとつずつ短い具体例で見ていきましょう。

アスタリスクは「名前の一部だけ言えば仲間をまとめて呼べる合言葉」

  • は、どんな文字の並びにも当てはまる魔法の記号です。さっきの「ログを1個ずつ書くのが面倒」という悩みは、これ一発で解決します。.log と1行書けば、error.log でも access.log でも、名前が .log で終わるファイルは全部まとめて外れます。 の部分が「ここは何が来てもいいよ」という意味になるからです。旅行で「青い服は全部持っていかない」と決めるのと同じ感覚ですね。名前の一部だけ言えば、仲間をまとめて呼べる合言葉、というわけです。

クエスチョンは「ちょうど1文字だけ何でもいい」

? は * の弟分で、こちらは「どんな文字でもいいけど、ちょうど1文字だけ」という意味です。log?.txt と書くと log1.txt や logA.txt は外れますが、log10.txt は外れません。10 は2文字あって、? の「1文字だけ」という約束からはみ出すからです。細かく狙いたいときに使います。

ダブルアスタリスクは「奥のフォルダまで全部探しに行く」

フォルダは入れ子になっていて、奥に奥にと続いていきます。 は、その階層の深さを気にせず探してくれる記号です。/cache と書けば、すぐ目の前の cache でも、3階層も奥にある cache でも、どこにあっても外せます。「家じゅうどこにあっても、cache という名前の箱は持っていかない」という指定です。

角カッコは「このどれか1文字ならOK」

[abc] は、カッコの中に並べた候補のうち、どれか1文字に当てはまればマッチします。よく使うのが大文字小文字の両対応です。[Tt]humbs.db と書くと、先頭が大文字 T の Thumbs.db でも、小文字 t の thumbs.db でも、両方つかまえられます。「赤か青か黄色、どれか1色のシャツ」みたいに候補を並べるイメージです。

末尾のスラッシュは「フォルダだけが対象」のしるし

名前の最後に / を付けると、「これはフォルダの話だよ、同じ名前のファイルは関係ないよ」という意味になります。node_modules/ と書けば、node_modules という名前のフォルダだけが外れます。中身がぎっしり詰まった重いフォルダを、まるごと1行で外せるのは気持ちいいです。

先頭のスラッシュは「いちばん上だけに限定」のしるし

逆に名前の先頭に / を付けると、「圧縮する物のいちばん上の階層にある物だけが対象」という意味に変わります。/build と書くと、真上にある build だけが外れて、奥のフォルダにある別の build はちゃんと残ります。同じ名前のフォルダがあちこちにあるとき、上の1個だけを狙い撃ちしたいときに便利です。

先頭のビックリマークは「やっぱり持っていく」の取り消しボタン

最後は否定の ! です。これは「一度外した物を、やっぱり戻して入れる」ための記号です。たとえば *.log で全部のログを外したあとに、!important.log と書き足すと、important.log だけは外れずに残ります。リストは上から順に読まれるので、「全部外す、でもこれだけは戻す」という流れを作れます。荷造りで「服は全部置いていく、あ、でもこのお気に入りの1枚だけは持っていこう」と思い直すのと同じです。

まずはこれをコピペすればOK、という実用サンプル

理屈はだいたい分かったので、すぐ使える実用サンプルを文章で書いておきます。プロジェクトのフォルダを人に渡すために圧縮するなら、まずは次のような中身を書いておけば困りません。

1行目に「# 開発の不要物を外す」とメモを書いておく。次の行に node_modules/ と書いて、巨大な部品の置き場をまるごと外す。続けて *.log でログ類を全部外す。さらに /build でいちばん上のビルド成果物フォルダを外す。最後に **/cache でどこにあろうとキャッシュを外す。これだけで、相手に渡したくない重たいゴミがごっそり消えて、圧縮ファイルがぐっと小さく軽くなります。

写真やドキュメントのフォルダを圧縮するときは、[Tt]humbs.db と .DS_Store の2行を書いておくのがおすすめです。これらは Windows や Mac が勝手に作る小さな管理ファイルで、人に渡すとき入っていると少し恥ずかしいやつです。1回書いておけば、もう毎回手で消す必要はありません。

ボタン4つで管理、テキスト直接編集でも即反映

この .lhaignore ファイルは、%LocalAppData%\Lhamiel.lhaignore という場所に保存されます。とはいえ、場所を覚えていなくても大丈夫。Lhamiel の圧縮設定タブに、管理用のボタンが4つ並んでいます。「追加」で新しい1行を足す、「削除」で選んだ行を消す、「既定に戻す」で最初の状態に戻す、「除外設定ファイルを開く」でテキストファイルそのものを開く、の4つです。マウスだけでひととおり管理できます。

最初から定番のゴミファイルがいくつか入っているのも地味に嬉しいところです。.DS_Store、Thumbs.db、node_modules、__MACOSX、desktop.ini といった「だいたい入れたくない物」が初期状態で登録ずみなので、何も書かなくてもある程度はきれいに圧縮できます。

そして私がいちばん気に入っているのが、テキストエディタで直接書き換えても、保存した瞬間にアプリの画面へすぐ反映されるところです。これは Lhamiel が設定ファイルの変化をいつも見張っていて、書き換わったのに気づいたら自動で読み直してくれる仕組みになっているからです。お気に入りのエディタで .lhaignore を開いてガリガリ書いて保存すれば、すぐにリストが更新されます。アプリを開き直す必要はありません。書いた、保存した、もう効いている。この手軽さは一度味わうとやみつきになります。

フォルダの中の .gitignore も読んでくれる便利オプション

さらにもう一歩進んだ機能もあります。「全般」設定の中に「サブフォルダの .gitignore も尊重する」というスイッチがあり、これをオンにすると、圧縮するフォルダの中にもともと置いてある .gitignore を自動で読み取って、除外の判断に使ってくれます。

これが何を意味するかというと、開発中のプロジェクトフォルダをそのまま圧縮するだけで、そのプロジェクトが普段から無視しているファイル、つまりビルド成果物やログや外から借りてきた部品が、まとめて箱から外れてくれるということです。自分で .lhaignore に書き足さなくても、プロジェクトのルールをそっくり借りてこられます。これは普段から .gitignore を使っている人にとって、本当に楽ちんな仕組みです。

どれだけ楽になるのか、前のやり方と並べてみます。

場面 これまでの手順 Lhamiel での手順
プロジェクトを人に渡す 別の場所にフォルダごとコピー、不要物を手で消す、それから圧縮 フォルダをドラッグして圧縮するだけ
不要物の判断 何を消すか毎回自分で考える フォルダ内の .gitignore がそのまま効く
仕上がり 巨大で重いファイルになりがち 不要物が抜けて小さく軽い

これまでは、プロジェクトを誰かに渡したいだけなのに、いったん別の場所にまるごとコピーして、そこから不要物を手で消して、ようやく圧縮する、という面倒な儀式が必要でした。コピーするだけでも時間がかかるし、消し忘れもあるし、本当にうんざりする作業です。それが、フォルダをそのままドラッグして圧縮するだけで済むようになりました。

どんな場面で役に立つのか

ここで、私が「これは効くな」と思っている使いどころを3つ挙げておきます。

ひとつめは、プロジェクトフォルダを人に渡すとき。node_modules や .git やビルド成果物といった「巨大で、相手には不要な物」を外せるので、圧縮ファイルそのものが小さく軽くなります。サイズが小さくなれば、圧縮にかかる時間も短くなるし、メールやチャットで送るのもラクです。受け取った相手も、ムダな物が入っていないきれいな状態を受け取れます。

ふたつめは、写真フォルダやドキュメントフォルダの整理。Windows が勝手に作る Thumbs.db や、Mac 由来の .DS_Store みたいな小さなゴミファイルって、気づかないうちにフォルダに紛れ込んでいるものです。これらを毎回手で消すのは地味につらい作業ですが、除外ルールに一度書いておけば、以降は自動でスルーしてくれます。

みっつめは、定期的なバックアップ。同じ種類のフォルダを繰り返し圧縮するなら、除外ルールを整えておくだけで、毎回「いらない物が入っていないか」を気にしなくてよくなります。荷造りのたびに同じ「持っていかない物リスト」を使い回せるので、考える手間がまるごと消えるわけです。

ちょっとした注意点:隠しフォルダの扱い

最後に、小さいけれど大事な話をひとつ。.git のような「隠し属性」や「システム属性」が付いたフォルダは、設定で「含める/含めない」を自分で選べるようにしました。

昔は、こうした隠しフォルダが圧縮のときに勝手に抜け落ちてしまい、あとで困ることがありました。たとえば設定一式を丸ごとバックアップしたかったのに、肝心の隠しフォルダが入っていなかった、というような場面です。今は自分の意思で「これは含める」「これは外す」を選べるので、想定外の抜け落ちで困ることがなくなりました。除外リストとあわせて使えば、「外したい物はしっかり外す、残したい物はちゃんと残す」を両方きれいにコントロールできます。

おまけに、ソフトそのものの中身も少しだけ。Lhamiel は最新の .NET 10 と Native AOT という仕組みで作っているので、別途ランタイムを入れる必要がなく、起動も動作も軽いです。Windows の x64 でも ARM64 でも動きます。圧縮の中身の処理には、定番の 7-Zip のエンジンを土台にした自作の仕組みを使っているので、固める力はしっかりしています。表側はやさしい操作感、裏側はしっかりした圧縮力、という組み合わせを目指したソフトです。

ダウンロード・入手先

Lhamiel は無料で使えます。気になった方は、次のいずれかから入手してください。

まとめ4行

  • Lhamiel の除外リストは .gitignore とそっくりな書き方になり、*.log や node_modules/ など7つの書き方を覚えれば自由自在
  • 迷ったら node_modules/ と *.log あたりをまず書いておけば、重いゴミが消えて圧縮ファイルが軽くなる
  • 設定はボタン4つで管理でき、テキストエディタで直接書いても保存した瞬間にアプリへ即反映される
  • 「サブフォルダの .gitignore も尊重する」をオンにすれば、開発中のフォルダをそのまま放り込むだけで不要物が自動で外れる