🐙

【Git】あとからgitignoreを設定したいとき

2023/04/13に公開

Summary

まず、.gitignoreを更新する。

その後、次のコマンドを実行することで除外対象にすべきファイルが一覧で表示される

Unityプロジェクトの例
git ls-files --full-name --exclude-standard -i -c
Assembly-CSharp-Editor.csproj
Assembly-CSharp-firstpass.csproj
Assembly-CSharp.csproj
EditMode.csproj
...

コマンドの詳細

  • git ls-files - インデックスと作業ツリーにあるファイルについての情報を表示する
  • オプション:
    • --full-name: サブディレクトリから実行した場合、コマンドは通常、カレントディレクトリからの相対パスを出力します。このオプションは、プロジェクトのトップディレクトリからの相対パスを出力するよう強制します。
    • --exclude-standard: Gitの標準的な除外ファイルである.git/info/exclude、各ディレクトリの.gitignore、そしてユーザーのグローバル除外ファイルを追加します。
      • つまり、.git/info/exclude.gitignoreに書かれたファイルを対象とする
    • -i, --ignored: 除外パターン(.gitignore)に一致したファイルのみ出力する。-c-oと併せて使う必要がある
      • -o, --othersと組み合わせると、除外パターン以外のファイル(管理対象のファイル)を出力する
    • -c, --cached: 追跡済み(コミットされた)ファイルを表示

通常、git ls-filesするとすべてのファイル名が表示される。

--exclude-standard -icオプションを付けることで、.gitignoreにかかれたファイルかつ、ステージング済みのファイル一覧を返す。

さらに、git rm --cachedと組み合わせることで、除外したいすべてのファイルをステージング上から消すことができる。

ワンラインでの実行例

PowerShellの場合
git ls-files --full-name --exclude-standard -ic | ForEach-Object { git rm --cached $_ }

Linuxの場合、以下で実行できるかも(未検証)

Linuxの場合
git rm --cached $(git ls-files --full-name --exclude-standard -ic)

Reference

http://to-developer.com/blog/?p=1889
https://git-scm.com/docs/git-ls-files
https://zenn.dev/pictogram/articles/f81920695d68b6

Behind

一時ファイルや管理対象にすべきじゃなかったファイル・フォルダをうっかりGitに上げてしまい、あとからgitignoreを設定したかったのでメモ

Discussion