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


327

リポジトリに無視する必要のあるファイルがいくつかあります。それらを.gitignoreに追加しましたが、もちろん、それらは私のリポジトリから削除されません。

だから私の質問は、私の履歴を書き換えてこれらすべてのファイルを簡単に削除できるフィルターブランチを使用する魔法のコマンドまたはスクリプトはありますか?または単にそれらを削除するコミットを作成するコマンドですか?





警告:これはローカルから物理ファイルを削除しませんが、次のgit pullで他の開発者マシンからファイルを削除します。追跡されたが現在.gitignoreにあるファイルについてGitに「忘れる」方法
クリスルーフ

@Stevoisiakこれはその質問の複製ではありません。これは無視されたすべてのファイルについて質問するものであり、同様の質問のどれよりも良い答えを持っているからです。
Omn

回答:


438

リポジトリから手動で削除できます:

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  

これらのファイルを使用せずに履歴全体を書き換えるということについては、自動で行う方法はないと思います。
そして、歴史を書き換えることは悪いことだと私たちは皆知っていますね。:)


2
残念ながら、WindowsのGit Bashコマンドはスペースを含むパスでは機能しません
Nate Bundy

19
@カップケーキありがとう。git ls-files -i -z --exclude-from=.gitignore | xargs -0 git rm --cachedトリックを行うようです
ネイトバンディ

3
Windowsでも同じ問題が発生しました。私はpowershellを使用しています。私の場合、@ samy-dindaneによって3番目のコマンドの先端を取得し、それをforeachに変更しました。それはこれになったgit ls-files -i --exclude-from=.gitignore | %{git rm --cached $_}
digaomatias 14

1
「git ls-files -i --exclude-from = .gitignore」は非常に役立ちます。これにより、.ignoreによって除外されるファイルがわかります。
Owen Cao

1
これらのコマンドを見つけてうれしかったですが、実際にはリポジトリからファイルが削除されません。2300 kBの画像を削除すると、リポジトリーのサイズは10 kBしか減少しませんでした。したがって、たとえば、リポジトリを小さくして転送を高速化するために使用することはできません。
JanPotužník19年

343

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

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

基本的に、.gitignore内のファイルを除くすべてのファイルを読み取りました


1
これはプルを実行しているリポジトリ上の他のユーザーにどのように影響しますか?私がそれを読むと、もう追跡したくないフォルダが削除されます??? どうすればこれを防ぐことができます
追跡

これにより、すべてのファイルが変更済みとして偽のコミットメッセージでマークされます。
ハイダーZeineddine

3
偽のコミットメッセージとはどういう意味ですか?これは実際のコミットメッセージです:Pもちろん、必要に応じてメッセージを変更できます...
gtatr

1
完全を期すために、最後にgit pushコマンドが必要です。
Mariusz Bialobrzeski

1
これをしないでください、それはすべてのファイルに履歴が削除されます
agrath

144

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

ドライランgit clean -xdnを実行し、何が除去されるかを確認するために使用します。
次に、を使用git clean -xdfして実行します。

基本的に、git clean -hまたはman git-clean(UNIXの場合)はあなたを助けます。

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

それが役に立てば幸い。


6
これは受け入れられる答えになるはずです。それは実際に機能し(受け入れられた回答はmacOSでは私には機能しませんでした)、かなりクリーンです。
Roger Oba

25
この答えは当てはまりません-OPは、ファイルが追跡され.gitignore いると言っています。
ケンウィリアムズ

20
注意してください!これにより、ブランチから削除されるだけでなく、追跡されていないファイルがすべて完全に削除されます
Emmanuel

1
git clean -xdn削除されません予行演習です。次の人がします。
JohnZaj 2018

17
-1:これは非常に誤解を招く答えです。元の投稿者は、ファイルを完全に削除するのではなく、リポジトリから削除したいと考えていました。私は、IDEに必要な動的ファイルのロードを削除するのにこれほど近かったが、リポジトリにある必要はなかった。
Auspice

4

私は.gitignoreステートメントの出力をsedで操作することにより、非常に簡単な解決策を実行しました。

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

説明:

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

10
sed簡単ですか?
IgorGanapolsky

0

Linuxでは、次のコマンドを使用できます。

たとえば、「*。py〜」を削除したいので、コマンドは==>

find . -name "*.py~" -exec rm -f {} \;


-3

gitは、.gitignoreに追加した後、.gitignoreパターンに一致するファイルを無視します。

ただし、リポジトリにすでに存在するファイルはそのまま残ります。

git rm files_ignored; git commit -m 'rm no use files'無視されたファイルを削除するために使用します。


4
それらはたくさんありますが、名前を指定せずに削除する方法はありますか?
イントレピッド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.