- Gitはリポジトリ内の特定ファイルを通じて動作を制御し、これらは
.git/ 内部の設定ではなく、コミットされてコードとともに移動するファイルである
.gitignore, .gitattributes, .lfsconfig, .gitmodules, .mailmap などはそれぞれ、ファイル追跡の除外、属性定義、LFS設定、サブモジュール管理、作者の統合を担う
.git-blame-ignore-revs と .gitmessage は、コード整形コミットの無視とコミットメッセージテンプレートを提供し、コラボレーションの品質を高める
- GitHub、GitLab、Gitea などは
.github/, .gitlab/, .gitea/ のようなプラットフォーム別設定フォルダを通じて、CI/CD、レビュアー指定などの機能を拡張する
- この構造は Git を超えて、EditorConfig、Docker、言語バージョン管理ツールなどにも同様に適用され、ドットファイルベースの自動設定エコシステムを形成している
Gitの主要なマジックファイル
- Gitは
.gitignore, .gitattributes, .lfsconfig, .gitmodules, .mailmap など複数の特殊ファイルを認識して、リポジトリの動作を制御する
- これらのファイルは
.git/ 内部の設定ではなく、コミットされて共有される構成要素であり、共同作業時に一貫した動作を保証する
.gitignore
- Gitが追跡してはいけないファイルパターンを定義する
- ワイルドカード(
*.log)、ディレクトリ(dist/)、否定(!important.log) などをサポート
.gitignore, .git/info/exclude, グローバル設定(~/.config/git/ignore) の順で適用される
- すでに追跡されているファイルは
.gitignore を追加した後も引き続き追跡され、git rm --cached で削除できる
- GitHub、GitLab、Gitea などでは、無視されたパターンのファイルでも警告なしでコミットできる
- GitHubは言語別の
.gitignore テンプレートを公式リポジトリで提供している
.gitattributes
- ファイルごとのフィルター、diff、merge、改行、言語検出などを制御する
- 例:
*.psd filter=lfs, *.png binary, *.sh text eol=lf
text は改行の正規化、binary は diff/merge の無効化、merge=ours は競合時にローカル版を維持することを意味する
- GitHub Linguist は
.gitattributes を読み取り、言語統計からの除外、生成コードの折りたたみ、ドキュメントの除外などを行う
- ディレクトリごとの
.gitattributes と .git/info/attributes もあわせて認識する
.lfsconfig
- Git LFS設定をリポジトリとともに共有する
.gitattributes で LFS 処理対象のファイルを指定し、.lfsconfig はサーバー位置などの詳細設定を担う
- 既存コミットのファイルを LFS に移行するには
git lfs migrate コマンドが必要
.gitmodules
- サブモジュールの構成情報を保存する
git submodule add 時に作成され、git submodule update 時に参照される
git clone しても自動ではサブモジュールを取得せず、--recurse-submodules オプションが必要
- バージョン範囲の追跡ができないことや、ネストした
.git ディレクトリが生成されることなどの欠点がある
.mailmap
- 作者名とメールアドレスを統合管理する
git log, git shortlog, git blame などで統合後の名前として表示される
- GitHub のコントリビューターグラフは mailmap を反映しない
.mailmap または mailmap.file 設定で場所を指定できる
.git-blame-ignore-revs
git blame で無視するコミット一覧を指定する
git config blame.ignoreRevsFile .git-blame-ignore-revs で有効化する
- GitHub、GitLab(15.4+)、Gitea は自動認識する
- ファイルが存在しないとエラーになる場合があるため、空ファイルを維持することが推奨される
.gitmessage
- コミットメッセージテンプレートを定義する
- 例:
# <type>: <subject>
#
# Types: feat, fix, docs, style, refactor, test, chore
git config commit.template .gitmessage で設定する必要がある
- クローン後に手動設定が必要で、一部のチームは husky などで自動化している
- 代替として
commit-msg フックや prepare-commit-msg フックも利用できる
プラットフォーム別の拡張フォルダ
- GitHub、GitLab、Gitea、Forgejo、Bitbucket などは独自の設定フォルダを使用する
.github/, .gitlab/, .gitea/, .forgejo/, .bitbucket/
- CI/CD ワークフロー、Issue・PR テンプレート、CODEOWNERS ファイルなどを含む
- Forgejo は
.forgejo/ → .gitea/ → .github/、Gitea は .gitea/ → .github/ の順でフォールバックする
- SourceHut は
.build.yml または .builds/*.yml を使用する
その他の慣例的なファイル
- .gitkeep: Git は空ディレクトリを追跡しないため、ディレクトリ維持用のダミーファイルとして使われる
- .gitconfig: プロジェクト別 Git 設定の例を提供するが、自動では読み込まれない
- .gitsigners: GPG/SSH 署名鍵の一覧を管理し、
gpg.ssh.allowedSignersFile で指定できる
- .gitreview: Gerrit コードレビューサーバーの設定ファイル
- .gitlint: コミットメッセージの lint ルールを定義する
- .jj/: Git 互換 VCS である Jujutsu の状態ディレクトリで、
.git/ と共存できる
Gitを超えたドットファイルエコシステム
- .editorconfig: エディタ間で一貫したコードスタイルを維持する
- インデント、改行、エンコーディング、空白削除などを定義する
- VS Code、Vim、Emacs など主要エディタが対応している
- .ruby-version, .node-version, .python-version: 言語バージョン管理ツール(rbenv、nodenv、pyenv など)が読み取り、自動で切り替える
- .tool-versions: asdf の多言語バージョン管理ファイル
- .dockerignore: Docker ビルド時に除外するファイル一覧を指定する
.gitignore と同じパターン文法を使い、ビルド速度向上や機密情報の除外に役立つ
Git連携ツール開発時の考慮事項
- Git リポジトリを扱うツールは、次のファイルを必ず認識する必要がある
.gitignore: ファイル探索時に無視パターンを適用
.gitattributes: バイナリ・生成ファイルの判別
.mailmap: 作者情報の統合表示
.gitmodules: サブモジュール処理
- Git 設定ファイル形式は
[section "subsection"] key = value 構造で、git config コマンドで読み書きできる
- ほとんどの言語向け Git ライブラリは、この形式をパースする機能を提供している
2件のコメント
gitmessageは知らなかったので、使ってみようと思いますHacker News の意見
.gitignoreを尊重して Web UI に無視されたファイルを表示しないと書かれていたが、それは誤った説明のように思える実際には、無視されたファイルが リポジトリに含まれていないから 表示されないだけだ。すでにコミット済みのファイルなら、むしろ表示されるべきだと思う
.gitignoreに追加しても、UI には引き続き表示される。そのファイルは依然として repo の一部 だからだ逆に、最初から無視されているファイルを強制的にコミットすることも可能だが、少しコツがいる
.gitignoreは単に untracked ファイルを隠すかどうか だけを決める。望めば無視されたファイルもコミットできるshowinwebui=(true|false)みたいなオプションがあるといいのにと思う 😄.git/info/excludeを強調したい。これは ローカル専用の gitignore で、自分だけのための設定だたとえばバグ調査中に一時ファイルを作って、ブランチを切り替えてもそのまま残しておきたいときに便利だ
私は次のようなシェル alias を作って使っている こうすると
git-ignore-local myfile.extで簡単に追加できるmacOS では
readlinkの部分だけ直せばよい この関数を PATH にgit-ignore-localとして登録すれば、git ignore-localのように使える.git/info/excludeは.gitignoreの説明の最初の部分でも触れられている.gitattributesに/test export-ignoreを追加すると、本番サーバーへデプロイする際にテストファイルを除外 できるCapistrano のようなデプロイツールが
git exportを使うと自動で適用され、テストファイルがサーバーに上がらなくなる開発中には影響せず、ディスク容量の節約にもなる
git archive自体をあまり知らない気がする基本的な CI ツールでもほとんど使われているのを見ない。Capistrano がこれを活用している最初の例として知った
ちなみに
export-substオプションを使えば、git describeに近い情報をファイル内へ直接埋め込むこともできるjjを使っていて、.jjフォルダを repo とすべての git 操作から完全に除外 したかったgit clean -xdfでも消されないようにしたい。今は暫定的にgit clean -e .jjalias で対応している.git/info/excludeを使えばよい.mailmapをサポートしていない関連する議論は GitHub Community Discussion にある
package-lock.json merge=oursの設定は危険だと思うmerge や rebase の際に ours/theirs の意味が曖昧 だからだ
こうした設定が意味を持つのは、自動化されたマージツール(例: git-annex branch)だけだ
参考: ours/theirs の意味の説明、git-annex の内部構造
.git-blame-ignore-revsは良い機能だが、「その他の慣習」セクションに入れるべきだgit クライアントに設定していないと、そのファイルがないリポジトリでは git blame が失敗する
(:optional)オプションを使って、ファイルがなくてもエラーにならないようにできる関連説明は Stack Overflow の回答 にある
ただ、すべてのツールが
.mailmapをサポートしていないのは残念だ。たとえば IntelliJ ではまだ関連機能が バグ/機能要望の状態 にあるまた、
.git-blame-ignore-revsは単なる慣習にすぎず、手動で設定しないと動作しない.ignoreファイルも認識することを最近知った.gitignoreだけが適用されると思っていたが、.ignoreで ripgrep の設定を変えたら 検索結果が変わった。調べてみると、理にかなった挙動だったリンク: nesbitt.io の記事