1. プロジェクト全体で拡張子を除外する
ルートの .gitignore にこのルールを置くと、app.log、logs/app.log、src/app.log に一致します。* は / 以外の0文字以上に一致します。パターンにスラッシュがなければ、この .gitignore より下の各階層で名前を照合します。
ルールは1行ずつ書きます。Git の除外パターンはシェルコマンドや正規表現ではありません。*.{log,tmp} の波括弧は拡張子の一覧を表しません。
*.log 2. ディレクトリを限定する
次の最初の案は logs 直下の logs/app.log に一致し、logs/archive/app.log には一致しません。2つ目は両方に一致します。/**/ は途中のディレクトリが0階層でも複数階層でも一致します。どちらも src/app.log には一致しません。
比較するときは1つの案だけを適用します。/logs/ のようなルールでも親ディレクトリを除外して下位ファイルを隠すため、ワイルドカードを判断する前に他のルールも確認してください。
/logs/*.log/logs/**/*.log 3. 代表的なパスを検証する
ルールを選び、例の3つの未追跡ファイルを作成してから、一致パターンを調べます。
git check-ignore -v -- logs/app.log logs/archive/app.log src/app.log/logs/**/*.log では logs 以下の2つが一致し、src/app.log は一致しないはずです。詳細出力で ! から始まるものは例外です。1ファイルを残すには明示的な例外を書き、すべての親ディレクトリを探索可能にしてください。
正確な動作や詳細は、公式の資料を参照してください。 Git のドキュメント · git check-ignore の公式ドキュメント