🫥

後からgitignoreを一気にやる

に公開

結論

// ファイル確認
git ls-files --cached --ignored --exclude-standard

// git管理から外す
git ls-files --cached --ignored --exclude-standard -z | xargs -0 git rm --cached

補足

1つ目のコマンド
  • --cached--ignoredを組み合わせることでgit管理下で除外対象をリスト化
    • --cached-c):git管理ファイルを対象とする
    • --ignored-i):.git/info/exclude.gitignoreの対象となってるファイルを表示する
    • --exclude-standard.git/info/exclude、各ディレクトリの.gitignoreを除外対象とする
      • --exclude-per-directory=.gitignoreでリポジトリ内の.gitignoreだけを対象とする
2つ目のコマンド
  • git ls-files -z:出力されるファイル名を\0(ヌル文字)で区切られた1行のバイト列に変換
    • \0:表示はされないけど意味を持つ制御文字、つまり今回はファイル名の安全な区切りとして使っている
  • xargs -0 git rm --cached:標準入力の内容をgit rm --cachedの引数として渡す
    • xargs:標準入力で受け取った内容を引数として別のコマンドに渡す
    • -0\0区切りで受け取ることで、スペースや改行、特殊文字を含むファイル名でも安全に扱う

参考

https://gist.github.com/jeffjohnson9046/80bc182db7ae2f4a6150
https://git-scm.com/docs/git-ls-files

Discussion