コミットされたファイルに.gitignoreを適用する


436

無視したいファイルを大量にコミットしました。今後のコミットでこれらのファイルを無視するようにgitに指示するにはどうすればよいですか?

編集:私もそれらをリポジトリから削除したいと思います。これらは、ビルド後、またはユーザー固有のツールサポートのために作成されたファイルです。



8
@Wooble答えは似ているかもしれませんが、この質問は私が直面し、解決する必要がある問題を正確に説明しています。
rjmunro 2013年

1
これは、直接あなたのgitリポジトリに最小限の変更で、タイトルの質問に対処している答え:stackoverflow.com/a/26245961/3543437
kayleeFrye_onDeck

回答:


471

12
ただし、ファイルはたくさんあります。私はひとつひとつの1のためにこれを行うしたくない
user880954

1
ファイルは一般的なディレクトリにありますか?そうでない場合、問題はgitの問題ではなく、シェルの使用法の質問に減少します。
マットボール

12
「最初のコミット後まで.gitignoreを追加するのを忘れた」モードである必要はありません。
ルークプレット2013

9
答えはこの下にあります。
2015年

3
フラグ-rを追加するように要求されました。
Vishal Gulati

599

.gitignore無視されたファイルと一致するように編集した後git ls-files -ci --exclude-standard、除外リストに含まれているファイルを確認できます。次にできる

//On Linux:
git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached
//On Windows:
for /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
//On mac
alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached"

(ディスクから削除せずに)リポジトリから削除します。

編集:これをエイリアスとして.gitconfigファイルに追加して、いつでも実行できるようにすることもできます。[alias]セクションの下に次の行を追加するだけです(WindowsまたはMacの必要に応じて変更します)。

apply-gitignore = !git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached

(の-rフラグは、空の結果で実行され、その使用法のメッセージが出力されるのをxargs防ぎgit rmますが、GNU findutilsでのみサポートされる場合があります。他のバージョンでxargsは、同様のオプションがある場合とない場合があります。)

これgit apply-gitignoreで、リポジトリを入力するだけで作業が完了します。


10
Macのxargsには-rがないと思います...または私のバグがある/古いです、わかりません...そしてなぜ!before gitですか?まあ...私のものはとして働いたalias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached"。tks!
フェリペサビノ

18
Windowsの場合for /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
Luke Puplett

これにより、.gitignoreファイルにリストされていた、無視したいファイルではなく、.gitignoreファイルが削除されました。それが目的でしたか?
Hippyjim 2014年

ファイルはすでに(彼らは.gitignoreにリストされていたにもかかわらず)コミットされており、.gitignoreがされている場合@Hippyjim ないまだコミット、それが期待される結果となり、そうでない場合、私はあなたのケースで何が起こっているのかわかりません。
ジョナサンカレン2014年

1
Macユーザーの場合、これ-rがデフォルトであり、BSDバージョンでは受け入れられません。だから削除し-rます。
Weishi Zeng

136

ファイルをリポジトリに残しますが、その後の変更は無視します。

git update-index --assume-unchanged <file>

これを元に戻すには:

git update-index --no-assume-unchanged <file>

このように設定されているファイルを確認するには:

git ls-files -v|grep '^h'

http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/への元の回答に対するクレジット


1
:Chronialは、ディレクトリの再帰的にこれを行うための偉大な答えてい stackoverflow.com/a/16346756/1101076
jordan314

IDE構成をコミットしたいが、それに対する不要な変更を追跡したくなかった。これは機能しますが、リポジトリをチェックアウトする他の人が機能するかどうかはわかりません。それがgit ls-files -ci --exclude-standard -z | xargs -0 git update-index --assume-unchanged役立つ場合は、それを組み合わせることができます。
dlamblin 2017年

7
これは、タイトルの質問が要求することを正確に行う唯一の回答です。パーフェクト!これらの他の回答のほとんどは、不必要にファイルをいじっていました。
kayleeFrye_onDeck 2017

1
これは質問に対する正解です。などのコマンドを使用git rm --cachedすると、リポジトリ内のファイルが削除されます。これは、クイズの必要性を満たしていません。ありがとうございました。ほんとうにありがとう。あなたの答えは私を大いに助けます。
ramwin

88

実際のリポジトリが最新バージョンであることを確認してください

  1. .gitignore好きなように編集
  2. git rm -r --cached .
  3. git add .

その後、通常どおりにコミットします


14
質問は削除するファイルがたくさんあると具体的に言ったので、これは受け入れられる答えであるはずです。
nbeuchat

3
大きなリポジトリがある場合、ステップ2にはしばらく時間がかかることに注意してください。
ブレインバッグ2018年

これにより、インデックスからすべてのファイルが削除されました。これは私を救いました:(git reset HEAD変更を隠しておくことを忘れないでください)
aksh1618

2
ステップ2はすべてを削除しますが、ステップ3は.gitignoreが原因で失敗したものを除いて、すべてを読み取る必要があります。
ojchase

11

古い質問ですが、何人かはgit-posh(Powershell)にいます。これはそのためのソリューションです:

git ls-files -ci --exclude-standard | foreach { git rm --cached $_ }

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.