ディスカッション (11件)
Gitでファイルを無視する際、つい.gitignoreファイルだけに頼っていませんか?実は他にも設定方法があるんです。知っておくと便利なテクニックを紹介します。
.git/info/exclude はめちゃくちゃ愛用してる。ローカルでしか使わないスクリプトやMakefileとか、共同作業者には関係ないし使われることもないようなファイルには最適なんだよね。
/.gitignore_global を作って設定をいじるより、/.config/git/ignore と /.config/git/config を使うのが、グローバルなgit設定やignoreの正しい置き場所だと思うよ。個人的な意見だけどね。おかげでルートディレクトリのdotfilesがすっきりしたし、/.config/ を活用するのはいろいろ捗る。あと、git excludeがあまり使われないのはリポジトリにコミットされないからで、使うたびに再作成しなきゃいけないからだね。別に悪い機能ってわけじゃないけど、そういう理由で使われてないんだと思う。
どこで覚えたか忘れたけど、自分のグローバルGit ignoreにはこれを追加してるよ。
attic
これのおかげで、どのプロジェクトでも適当に作った attic ディレクトリに、コミットすべきじゃない雑多なものを放り込んでおける。実際にリポジトリの中にこういうディレクトリチェッカーを入れてるのを見たことはないけどね。
グローバル(ユーザー単位)の除外設定はもっと知られていい機能だと思う。プロジェクトごとの .gitignore に自分のIDEやOS、AI関連のファイルを勝手に追加するプルリクがよく来るんだけど、「標準設定に追加すれば、プロジェクト側に迷惑をかけずにどこでも無視できるし、まだ .gitignore を更新してないプロジェクトでうっかりコミットするリスクも防げるよ」って教えてあげると、みんなたいてい喜んでくれる。
自分の中のルールとして、リポジトリ内の .gitignore はそのプロジェクト固有のもの(ビルド成果物や依存関係のフォルダなど)だけに使うようにして、ユーザー側のツール類は自分の設定側に寄せるのがいいと思ってる。
ユーザーごとのignoreについて:
> 例えばmacOSなら、ここに .DS_Store を追加するのが理想だね。
プロジェクト内のMacユーザー全員がそれやってくれるならいいけどね。複数人いるなら、各自に任せるよりは一括管理したほうが安全かもよ。
マジか!なんで今まで知らなかったんだろ。プロのソフトウェア開発者として20年やってきて、.gitignore しか使ったことなかったよ…。
自分に関連するだけの除外設定で .gitignore が汚れるのを避ける方法なんてないのか、一度も自分に問いかけたことがなかったことに気づかされた。ただ、目の前にある世界をそのまま受け入れてただけだったんだな…
今日、少しだけ世界が良くなったよ :-)
面白い記事だけど、Gitの個人的なお気に入り「ほぼ無視(almost ignore)」機能である .gitattributes が抜けてるよ。
これは特定のファイルのdiffを無視するように指定できる機能だね。例えばNodeプロジェクトの package-lock.json はGitの観点からすると完全にノイズなんだ(ライブラリのバージョンが大量に書かれていてdiffが膨大になるし、人間が読むべき情報は別の package.json にある)。
プロジェクトのルートに .gitattributes を置いて、こう書くだけでいい。
package-lock.json -diff
これでファイル自体はステージ/コミットされる(それはそれで必要だし)んだけど、git diff を打ったときにあの無意味な大量のdiffが表示されなくなるよ。
すでにトラッキングされているファイルに対しては、こんなのもあるよ。
git update-index --[no]-skip-worktree
ローカルでの実験には便利なんだけど、Gitの表立って見える機能じゃないからちょっと扱いが面倒なんだよね。自分で設定したことを忘れると、checkoutなんかの操作がブロックされたりするから要注意。
関連して、自分が使っているエイリアスを貼っておくね。
assume = update-index --assume-unchanged
unassume = update-index --no-assume-unchanged
assumed = "!git ls-files -v | grep ^h | cut -c 3-"
unassumeall = "!git assumed | xargs git update-index --no-assume-unchanged"
assumeall = "!git st -s | awk {'print $2'} | xargs git assume"
複数のリポジトリを含むプロジェクトディレクトリに対して、個別にGit設定を適用するためにエクスクルードファイルを使っている方法がこれ。