git repoを新しい.gitignoreファイルと再同期します


191

gitignoreファイルを更新した後にgitリポジトリを「更新」することは可能ですか?

gitignoreにignorations(?)を追加したばかりで、新しいファイルと一致するリポジトリ内の既存のものを削除したいと考えています。



その解決策は、新しいgitignoreに一致する既にコミットされたファイルを削除することでしょうか?
ChristianWattengård、2011

99
「無視」という言葉を生み出すための+1。
Aasmund Eldhuset 2011


1
@ user770:今日私は学んだ!
Aasmund Eldhuset

回答:


369

.gitignore file not ignoring」で言及されている解決策は少し極端ですが、機能するはずです。

# rm all files
git rm -r --cached .
# add all files as per new .gitignore
git add .
# now, commit for new .gitignore to apply
git commit -m ".gitignore is now working"

jball037が以下のコメントとして発生するのを防ぐために最初に、保持したい変更をコミットしてください。 このオプションを使用しても、ディスク上のファイルは変更されません。)
--cached

また、ブログの投稿「Gitが既に追跡されたファイルを無視するようにする」には、さらに詳細なソリューションがあります

git rm --cached `git ls-files -i --exclude-standard`

Bassim彼の編集で示唆しています

パスにスペースがあるファイル

のようなエラーメッセージが表示さfatal: path spec '...' did not match any filesれる場合は、パスにスペースが含まれているファイルがある可能性があります。

あなたはオプションで他のすべてのファイルを削除することができます--ignore-unmatch

git rm --cached --ignore-unmatch `git ls-files -i --exclude-standard`

ただし、一致しないファイルはリポジトリに残り、パスを二重引用符で囲んで明示的に削除する必要があります。

git rm --cached "<path.to.remaining.file>"

git addステップは不要であることがわかりました。gitrm --cachedの後にgit statusを実行すると、削除されたファイルはすでにステージング領域にあり、先に進んでコミットできます。
CHAP

3
私はこれを実行し、コミットされていない変更をすべて失い、仕事からの辞任をほぼ発表しました。このスレッドで受け入れられた答えは私の人生を救いました:stackoverflow.com/questions/2125710/how-to-revert-a-git-rm-r
jball037

2
@VonC申し訳ありません、それは暴言や棒を意味するものではありませんでした:)しかし、はい、私は--cachedを使用し、ファイルをチェックしたときにコミットされていないすべての変更が失われました。一瞬パニックになりましたが、「git reset HEAD」でファイルが復元されました(ただし、今回は.gitignoreで指定したファイルがないため、ソリューションは引き続き機能します!)
jball037

3
@ jball037いいね。警告を追加し、それに応じて回答を編集しました。
VonC、2015

1
これを実行する前にさらに1行だけを読む場合(「jball037としてのインシデントを回避するために、保持する変更を最初にコミットしてください」#fml
Aiden

9

私は誤解しているかもしれませんが、新しく無視されたファイルを削除しようとしていますか、それともこれらのファイルへの新しい変更を無視しますか?この場合、問題は解決しています。

以前にコミットされた無視されたファイルを削除したい場合は、

git rm –cached `git ls-files -i –exclude-standard`
git commit -m 'clean up'

ここの単一引用符とは何ですか?
IgorGanapolsky 2015年

これは素晴らしい答えです
ホーレン

これは、.gitignoreを更新した後にファイルを削除する非常に単純な理由ですが、いくつかのマイナーアップデートが必要です: `` git rm –cached git ls-files -i –exclude-standard git commit -m 'clean up ``
Aaron

1

これは古い質問ですが、ファイル名にスペースが含まれている場合、gracchusの解決策は機能しません。スペースを含むファイル名に対するVonCの解決策は、それらを利用してそれらを削除しないことです--ignore-unmatch手動で削除することですが、たくさんある場合はうまく機能しません。

これは、すべてのファイルをキャプチャするためにbash配列を利用するソリューションです。

# Build bash array of the file names
while read -r file; do 
    rmlist+=( "$file" )
done < <(git ls-files -i --exclude-standard)

git rm –-cached "${rmlist[@]}"

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