web-dev-qa-db-ja.com

.gitignoreにリストされているがまだリポジトリにあるファイルを削除するにはどうすればいいですか?

私は自分のリポジトリに無視されるべきファイルをいくつか持っています。それらを.gitignoreに追加しましたが、もちろん、それらは私のリポジトリから削除されません。

だから私の質問は、私の歴史を書き換えて簡単にこれらすべてのファイルを削除できるfilter-branchを使った魔法のコマンドやスクリプトがあるのでしょうか?または単にそれらを削除するコミットを作成するコマンドですか?

237
Intrepidd

手動でそれらをリポジトリから削除することができます。

git rm --cached file1 file2 dir/file3

または、ファイルがたくさんある場合は、

git rm --cached `git ls-files -i --exclude-from=.gitignore`

しかし、これはWindows上のGit Bashではうまくいかないようです。エラーメッセージが表示されます。次の方がうまく機能します。

git ls-files -i --exclude-from=.gitignore | xargs git rm --cached  

これらのファイルを使わずに全履歴を書き換えることに関して、私は自動それをする方法があるかどうか疑わしいです。
そして、歴史を書き換えるのは悪いことを私たち全員が知っていますね。 :)

341
Samy Dindane

どのOSでも機能するもっと簡単な方法は

git rm -r --cached .
git add .
git commit -m "Removing all files in .gitignore"

あなたは基本的に、.gitignoreのファイルを除いて、すべてのファイルを読みました。

268
gtatr

。gitignore内のファイルは追跡されていないので、git cleanコマンドを使用して、バージョン管理下にないファイルを再帰的に削除することができます。

ドライランを実行し、何が削除されるかを確認するには、git clean -xdnを使用します。
それからgit clean -xdfを使って実行します。

基本的にgit clean -hまたはman git-clean(unixの場合)が役に立ちます。

このコマンドでステージング領域にない新しいファイルも削除されることに注意してください。

それが役に立てば幸い。

113
weiz

Sedを使って.gitignoreステートメントの出力を操作することで、非常に簡単な解決策を得ました。

cat .gitignore | sed '/^#.*/ d' | sed '/^\s*$/ d' | sed 's/^/git rm -r /' | bash

説明:

  1. .gitignoreファイルを印刷する
  2. 印刷からすべてのコメントを削除
  3. 空の行をすべて削除する
  4. 行の先頭に 'git rm -r'を追加してください。
  5. すべての行を実行します。
4
Scott Crossen