repo-attributes について
repo-attributesは、リポジトリ単位のファイル属性とエディター設定を整えるスキルです。既存設定を保ちながらGit属性、EditorConfig、除外ルール、Git LFSパターンの変更を提案し、改行の再正規化には明示的な許可を求めます。
主な機能
- 01.gitattributesの設定
- 02EditorConfigの既定値設定
- 03言語別除外ルールの統合
- 04既存のGit LFSパス検出
- 05属性と改行の検証
活用シーン
- 01リポジトリ全体の改行形式統一
- 02検出言語向け除外ルールの追加
- 03Git LFS属性パターンの準備
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ paulnsorensen/ git-gouda --skill repo-attributesインストール後、Claude Code で/repo-attributesを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/editorconfig.examplegitattributes.exampleevals/evals.jsonreferences/attributes.md詳細
repo-attributes
リポジトリのファイル単位の属性レイヤー(.gitattributes、.editorconfig、.gitignore、Git LFS のフィルターパターン)を設定します。
これはリポジトリのみを対象とする設定です。pre-commit フック、CI パイプライン、組織レベルのカスタムプロパティ、コミュニティ向けヘルスファイルには触れません。
このスキルの適用範囲
| 対象 | スキル |
|---|---|
| 改行コード、linguist の上書き設定、エディターのデフォルト設定、無視ルール、LFS パターン | /repo-attributes(このスキル) |
pre-commit / prek フックの選択と prek.toml | /prek |
| コミュニティ向けヘルスファイル(README、LICENSE、CODE_OF_CONDUCT、CONTRIBUTING、SECURITY) | /oss-hygiene |
| カスタムプロパティを含む、組織全体の設定のコード化 | /safe-settings |
手順
1. 言語マーカーと既存の設定を検出する
/prek と同じ検出方法を使って、リポジトリのルートにある言語マーカーをスキャンします。
| マーカーファイル | 言語/フレームワーク |
|---|---|
Cargo.toml | Rust |
pyproject.toml、setup.py、requirements.txt | Python |
package.json | TypeScript/JavaScript |
go.mod | Go |
Gemfile | Ruby |
*.sh、zsh/、bin/ | Shell |
Dockerfile | Docker |
複数のマーカーがある場合は、多言語プロジェクトです。生成するファイルですべての検出言語を対象にします。
既存の .gitattributes、.editorconfig、.gitignore、.gitmodules があるか確認します。存在するファイルをそれぞれ読み込み、その内容を置き換えの目標ではなく、維持する最低限の内容として扱います。
Git LFS の使用状況を確認します。
git lfs ls-files
git lfs がインストールされていない場合は、LFS の検出をスキップして、その旨を伝えます。LFS で追跡されているパスを推測してはいけません。
2. .gitattributes を提案する
assets/gitattributes.example を基本形として使用します。手順 1 の検出結果に基づき、以下を含めます。
* text=auto— Git が検出したテキストファイルの改行コードを正規化します。- スクリプトなど、CRLF に変換してはならないファイルには明示的に
eol=lfを指定します。例:*.sh text eol=lf - 改行コードと差分の変換をスキップする必要があるアセットの種類には、バイナリマーカーを指定します。例:
*.png binary - GitHub の言語バーやコードレビューの差分の集計対象から除外するパスには、
linguist-generated、linguist-vendored、linguist-documentationを指定します。 CHANGELOG.mdのような追記専用ファイルにはmerge=unionを指定し、並行して追加された項目が競合せずにマージされるようにします。- CI 専用ディレクトリなど、
git archiveの出力に含めないパスにはexport-ignoreを指定します。 - より有用な意味的差分を表示できるファイル形式には、
diff=ドライバーを指定します(例:ドライバーがすでに設定されている場合の*.md diff=markdown)。 git lfs ls-filesで既に追跡されているパス、またはユーザーが指定したパスには、LFS パターン(filter=lfs diff=lfs merge=lfs -text)を指定します。
提案内容を既存の .gitattributes と比較し、既存の行と異なる内容で上書きする場合は、事前に確認します。
3. .editorconfig を提案する
assets/editorconfig.example を使用します。root = true と、charset、end_of_line、insert_final_newline、trim_trailing_whitespace、indent_style、indent_size を指定する [*] セクションを含めます。続けて、検出された言語ごとに、その言語で一般的なインデントスタイルを指定する上書きセクションを追加します(例:Go と Makefile ではタブ、Python では 4 つのスペース)。
4. .gitignore を提案する
検出された言語向けに GitHub が提供しているテンプレートを取得します。
gh api /gitignore/templates
gh api /gitignore/templates/{name} --jq .source
取得したテンプレートの内容を既存の .gitignore とマージします。不足しているテンプレートの行を追加し、冗長に見える場合でも、既存のユーザーエントリーは削除しないでください。
5. 改行コードを正規化する(許可された場合のみ)
.gitattributes の変更によって、追跡対象ファイルの保存方法が変わる場合、git add --renormalize . を実行すると、追跡対象ファイルの内容が新しいルールに合わせて書き換えられます。これは追跡対象の内容を書き換える破壊的な操作であるため、以下を守ってください。
- 最初に作業ツリーがクリーンであることを確認します。
git status --porcelainが何も出力しない必要があります。 - コマンドを実行する前に、ユーザーから明示的な許可を得ます。
.gitattributesの提案に伴う処理として、改行コードの正規化を実行してはいけません。 - 作業ツリーに未コミットの変更がある場合は、正規化を中止し、ユーザーにコミットまたはスタッシュを依頼します。
6. 検証
git check-attr -a <file>
git ls-files --eol
gh api repos/{owner}/{repo}/languages
git check-attr -a <file> を使用して、適用された属性が提案内容と一致することを確認します。git ls-files --eol を使用して、作業ツリーとインデックスの改行コードが .gitattributes と一致することを確認します。変更が GitHub に反映された後、GitHub の languages API 呼び出しを使用して、linguist の上書き設定によって報告される言語の割合が変わったことを確認します。
このスキルの対象外
- pre-commit または prek フックの選定 — これは
/prekの対象です。 - GitHub のカスタムプロパティやその他の組織レベルのメタデータ — このスキルの対象外です。
- コミュニティ向けの健全性維持ファイル(README、LICENSE、CODE_OF_CONDUCT、CONTRIBUTING、SECURITY) — これは
/oss-hygieneの対象です。 - CI パイプラインの設定 — リポジトリ属性の対象外です。
注意点
* text=autoだけでは、コントリビューターの Windows チェックアウトでスクリプトの改行コードが LF に強制されません。CRLF に変換してはならないファイルには、明示的なeol=lfルールを組み合わせてください。linguist-generatedとlinguist-vendoredは、GitHub の言語バーと、PR の差分をデフォルトで折りたたむ動作を変更します。ローカルのgit diffの出力は変更しません。git add --renormalize .はインデックスと作業ツリーのみを書き換え、履歴は書き換えません。既存のクローンでは、変更をプルして各自で再実行するまで、古い改行コードが表示されます。git lfs installを実行せずに LFS のフィルターパターンを指定しても、ローカルでは効果がありません。大容量ファイルの問題に対する解決策としてフィルターパターンを提案する前に、LFS がインストールされていることを確認してください。.gitignoreが対象とするのは未追跡ファイルのみです。すでに追跡されているパスは、git rm --cachedで明示的に削除するまで追跡され続けます。
参考資料
references/attributes.md—.gitattributes、linguist の上書き設定、.editorconfig、改行コードの設定、.gitignore、Git LFS に関する出典。