追跡されたが、現在.gitignoreにあるファイルについてGitに「忘れる」方法


5402

によって追跡されてgitいたファイルがありますが、このファイルは.gitignoreリストに含まれています。

ただし、そのファイルはgit status編集後も表示され続けます。どうすればそれgitを完全に忘れるのですか?


16
git clean -X音は似ていますが、この状況には当てはまりません(ファイルがまだGitで追跡されている場合)。これは、間違ったルートをたどらないような解決策を探している人のために書いています。
imz-Ivan Zakharyaschev 2015

35
これに対する唯一の本当の答えは下にあります、を見てくださいgit update-index --assume-unchanged。このソリューションでは、1)サーバー(インデックス)にファイルを保持し、2)ローカルで自由に変更できます。
Qwerty

8
あなたは使用する必要があり--skip-worktree、以下を参照してくださいstackoverflow.com/questions/13630849/...
ドッペルゲンガー

77
重要な質問は、ファイルがリポジトリに残っているかどうかです。たとえば、誰かが新しいリポジトリを複製した場合、ファイルを取得する必要がありますか?場合はYESはその後、git update-index --assume-unchanged <file>正しく、ファイルがリポジトリに残り、変更はして追加されませんgit add。場合はNO、その後、(例えば、それはいくつかのキャッシュファイル、生成されたファイルなどがあった)git rm --cached <file>リポジトリから削除されます。
マーティン

9
@Martin @Qwerty Everyonは--assume-unchangedgitが大きな追跡ファイルのステータスをチェックするのを防ぐためのパフォーマンスのために助言するのをやめるべき--skip-worktreeですが、ユーザーがもうコミットしたくない変更された追跡ファイルのためにどちらを好むのかを好みます。stackoverflow.com/questions/13630849/…を
フィリップ

回答:


5705

.gitignoreadd -f追跡されないファイルがgitによって追跡されるファイルのセットに追加されないようにします(ただし、はありません)。ただし、gitは、すでに追跡されているファイルを追跡し続けます。

ファイルの追跡を停止するには、ファイルをインデックスから削除する必要があります。これは、このコマンドで実現できます。

git rm --cached <file>

フォルダ全体を削除する場合は、その中のすべてのファイルを再帰的に削除する必要があります。

git rm -r --cached <folder>

最新リビジョンからのファイルの削除は、次のコミット時に行われます。

警告:これによってローカルから物理ファイルが削除されるわけではありませんが、次に他の開発者マシンからファイルが削除されますgit pull


55
私のために働いたプロセスは1.保留中の変更を最初にコミットします2. git rm --cached <file>してもう一度コミットします3. .gitignoreにファイルを追加し、gitステータスで確認して再度コミットします
マテリアル

117
非常に重要な追加。無視されたファイルが変更される場合(ただし、これはコミットされないはずです)、変更して実行git add .した後、インデックスに追加されます。そして次のコミットはそれをリポジトリにコミットします。これは、実行回避するためにすべてのことmataalは1つのより多くのコマンドが言った直後:git update-index --assume-unchanged <path&filename>
ダオ

32
@AkiraYamamotoの方法も私にとってうまくいきました。:私のリポジトリは、ファイルの何千も持っていたので、私の場合は、出力を抑制git rm -r -q --cached .
アーロンBlenkush

85
git pullただし、ファイルは削除されます。
Petr Peller、2014年

22
git rm --cached <file>は、リポジトリからファイルを削除するだけです。しかし、私はGITがファイルPLEEEEEASEのコンテンツを無視することを望みます
Igor Semin

2610

以下の一連のコマンドは、Gitインデックスからすべての項目を削除し(作業ディレクトリやローカルリポジトリからではなく)、Gitを無視しながらGitインデックスを更新します。PS。インデックス=キャッシュ

最初:

git rm -r --cached . 
git add .

次に:

git commit -am "Remove ignored files"

またはワンライナー:

git rm -r --cached . && git add . && git commit -am "Remove ignored files"

197
この回答と承認された回答の違いを強調するには:このコマンドを使用すると、影響を受けるファイルを実際に知る必要はありません。(インデックスから削除する必要のある多数のランダムファイルを含む一時ディレクトリを想像してください)。
ルートヴィヒ

53
受け入れられた答えと同じ。ファイルはに削除されgit pullます。
Petr Peller、2014年

73
これを標準のgitコマンドとして使用すると便利です。のようなものgit rmignored
Berik

12
@gudthing -rは「再帰的」を表します
マーク

14
これにより、現在にはない他の不要なファイルが追加される可能性があります.gitignoregit statusこのコマンドの後のノイズの程度によっては、どれを見つけるのが難しいかもしれません。新しく無視されたファイルのみを削除するコマンドの方が良いでしょう。それが私がthSoftの答え
KurzedMetal

1122

git update-indexは私のために仕事をします:

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

注:.gitignore gitignoreは追跡されていないファイル専用であるため、このソリューションは実際には独立しています。

編集:この回答が投稿されてから、新しいオプションが作成されました。あなたは使用する必要があり--skip-worktree、ユーザはもはやコミットして保持しないことに変更追跡ファイルのためである--assume-unchanged大追跡ファイルの状態を確認するためにgitのを防ぐために、パフォーマンスのために。詳細については、https://stackoverflow.com/a/13631525/717372を参照してください...

git update-index --skip-worktree <file>

173
これは、IS本当の答え。驚くほど、実際には非常にシンプルで、汚染されずgit status、実際には非常に直感的です。ありがとう。
パブロオルモスデアギレラC.

4
rm [...] .少なくとも私はそれがどのように機能するかを理解することができたので、十分に良い解決策を探しました。私は何には大きなドキュメント見つからないupdate-index--assume-unchanged行います。無視されたすべてのファイルを削除したいという点で、これが他の方法と比較してどのように追加できますか?(または明確な説明へのリンク?)
ブレイディトレーナー、2014年

25
git update-index --assume-unchanged <path> …に関係なく、gitは指定されたパスの変更を無視します.gitignore。リモートからプルし、そのリモートにこのパスへの変更がある場合、gitは競合を伴うマージに失敗し、手動でマージする必要があります。 git rm --cached <path> …gitがそのパスの追跡を停止します。パスを追加しない場合.gitignore、将来パスが表示されますgit status。最初のオプションは、git commit履歴のノイズが少なく、「無視された」ファイルへの変更を将来配布できるようにします。
ManicDee 2014年

26
これがどのように受け入れられた答えではないのか、私はかなり混乱しています。ここで受け入れられた答えは、質問されている実際の質問には明らかに答えていません。この回答では、リポジトリからファイルを削除しない限り、リポジトリ内のファイルへの変更は無視されます。
Dave Cooper

11
この回答は、特定のコマンドの機能を正確に説明している場合、たとえば、他の推奨されるソリューションとどのように異なるかなど、はるかに役立ちます。
LarsH

283
git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"

これにより、無視されたファイルのリストが取得され、インデックスから削除されて、変更がコミットされます。


7
作業ディレクトリからも削除する必要がある場合は、単にを実行しgit ls-files --ignored --exclude-standard | xargs git rm ます。この答えが一番だと思います!それは非常に明確で、Unix方式であり、他のより複雑なコマンドの副作用を構成することなく、直接的な方法で必要なことを行います。
imz-Ivan Zakharyaschev 2015

6
すばらしい答えです。ただし、途中にスペースがあるパスがある場合、コマンドは失敗します。例: "My dir / my_ignored_file.txt"
David Hernandez

8
git ls-files --ignored --exclude-standard | sed 's /.*/"&"/' | xargs git rm --cached
David Hernandez

3
git rmls-files何も一致しなかった場合、文句を言います。一致するファイルがない場合に実行しないようxargs -r git rm ...に指示するために使用します。xargsgit rm
Wolfgang

10
これは、セパレータとして、\ 0を使用する方が良いでしょう:git ls-files --ignored --exclude-standard -z|xargs -0 git rm --cached
ニルス-O-マット

83

私は常にこのコマンドを使用して、追跡されていないファイルを削除します。1行、Unixスタイル、きれいな出力:

git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

無視されたすべてのファイルをリストし、すべての出力行を引用符付きの行に置き換えて、パスを内部でスペースで処理し、すべてに渡してgit rm -r --cached、パスからパス/ファイル/ディレクトリをインデックスから削除します。


3
素晴らしい解決策!完璧に機能して、すべてのファイルを削除するに戻ってそれらを追加することが、より正確な感じ。
ジョン・キャットマル

5
私もこの「きれい」を見つけました。当たり前かもしれませんが、最初の部分を実行するだけでgit ls-files --ignored --exclude-standard、新しいファイル.gitignoreが除外/削除するファイルを最初に理解/確認してから、最後のを実行できgit rmます。
JonBrave、2015

ファイル名に特定の「厄介な」文字が含まれている場合は失敗することに注意してください\n。これに対応するためのソリューションを投稿しました。
JonBrave、2015

3
もう1つの注意点:プルすると、他のユーザーの作業ディレクトリにあるファイルが削除されますよね?
LarsH

試しましたが、うまくいきませんでした:sed: 1: "s/.*/": unterminated substitute in regular expressionスペースのあるリポジトリのfilter-branchコマンドで。(ただし、フィルターブランチの外側で動作するように見えます)。代わりにgit ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached@ JonBraveの 回答から使用しました。
goofology

71

移動してコミットしてから、再び移動します。これは以前はうまくいきました。これを達成するための「gittier」方法がおそらくあります。


2
これは、以前は無視されていなかった一連のファイルを無視する場合に非常に役立ちます。あなたが言ったように、これにはおそらくもっと良い方法があるでしょう。
Oskar Persson 2013年

これはまさに私がやったことです。単にファイルをgitの外のフォルダーに移動してから、「git add。」、「git commit」を実行します。(これによりファイルが削除されます)次にgitignoreを追加し、ファイル/フォルダーを参照します。再度コミットしてgitignoreファイルをgitに追加し、フォルダーにコピー/移動して戻します。これらは無視してください。注:ファイルはGITから削除されたように見えるため、上記のソリューションで説明したように、おそらく他のチェックアウト/プルからそれらを削除しますが、最初にそれらのコピーを作成しているため、これはIMHOの問題の多くではありません。チームの残りのメンバーに知らせてください...
Del

これは、誤ってコミットされたフォルダを取り除く最も簡単な方法です。
Martlark 2017年

2
私が見ることができる唯一の方法のようです。これはgitの巨大なバグ(「機能」ではありません)であり、ファイル/フォルダーを.gitignoreに追加するとすぐに、その場所からそのファイルが無視されるわけではありません。
JosephK 2017

これは私がそれらを追加した後、そして事実がそれらを.gitignoreに追加した後に機能しました
hanzolo

66

git rm他の人がそれを必要とする可能性があるために追跡ファイルを使用できない場合(警告、あなた git rm --cachedが他の誰かがこの変更を受け取った場合、そのファイルはファイルシステムから削除されます)。これらは、構成ファイルのオーバーライド、認証資格情報などが原因でよく行われます。問題の回避方法については、https://gist.github.com/1423106を参照してください

要約する:

  • アプリケーションに無視されたファイルconfig-overide.iniを探し、それをコミットされたファイルconfig.iniで使用する(または、〜/ .config / myapp.ini、または$ MYCONFIGFILEを探す)
  • config-sample.iniファイルをコミットし、config.iniファイルを無視します。必要に応じて、スクリプトまたは同様のファイルを必要に応じてコピーします。
  • gitattributes clean / smudge magicを使用して変更を適用および削除してみてください。たとえば、構成ファイルを代替ブランチからのチェックアウトとして汚し、構成ファイルをHEADからのチェックアウトとして清掃します。これはトリッキーなものです。初心者にはお勧めしません。
  • マスターにマージされない、専用のデプロイブランチに構成ファイルを保存します。デプロイ/コンパイル/テストしたい場合は、そのブランチにマージしてそのファイルを取得します。これは、ヒューマンマージポリシーと追加のgitモジュールを使用することを除いて、本質的にスマッジ/クリーンアプローチです。
  • 反推奨:変化しない仮定を使用しないでください。それは涙で終わるだけです(gitがそれ自体に嘘をつくと、変更が永久に失われるなど、悪いことが発生するためです)。

7
削除時にダーティだった場合、gitはファイルを削除しませんでした。そして、それがダーティでない場合、ファイルの取得は同じくらい簡単ですgit checkout <oldref> -- <filename>が、チェックアウトされて無視されます。
amenthes 2014

あなたの最後のメモ(について--assume-unchanged)について:これはカーゴカルトであり、却下する必要があるか、または理由(私は確信している)を説明して、それが役立つようになります。
RomainValeri

57

これは次の場合に使用します。

1.多くのファイルの追跡を解除したい、または

2. gitignoreファイルを更新した

ソースリンク: http : //www.codeblocq.com/2016/01/Untrack-files-already-added-to-git-repository-based-on-gitignore/

すでにgitリポジトリにいくつかのファイルを追加/コミットしていて、それらを.gitignoreに追加するとします。これらのファイルは引き続きリポジトリインデックスに存在します。この記事では、それらを取り除く方法について説明します。

ステップ1:すべての変更をコミットする

続行する前に、.gitignoreファイルを含むすべての変更がコミットされていることを確認してください。

ステップ2:リポジトリからすべてを削除する

リポジトリをクリアするには、次を使用します:

git rm -r --cached .
  • rmは削除コマンドです
  • -rは再帰的な削除を許可します
  • –cachedは、インデックスからファイルを削除するだけです。ファイルはそのまま残ります。

rmコマンドは容赦することができます。事前に試したい場合は、-nor --dry-runフラグを追加してテストしてください。

ステップ3:すべてを再追加する

git add .

ステップ4:コミット

git commit -m ".gitignore fix"

あなたのリポジトリはきれいです:)

変更をリモコンにプッシュして、そこで有効な変更を確認します。


1
リモートリポジトリからファイルを削除しませんか?ローカルリポジトリとリモートリポジトリの両方にファイルを保持したいが、それらについてgitに「忘れさせる」場合はどうなりますか?
Avishay28

私の知る限り、これは、履歴変更コマンドを使用していないため、履歴からファイルを削除しません(私が間違っている場合は修正してください)。これは、gitignoreで無視されたファイルをgitから削除することによって新しいコミットを追加するだけです。これらのファイルはそこにあります歴史的なコミット
Dheeraj Bhaskar

49

私はgit filter-branchを使用してこれを実現しました。私が使用した正確なコマンドは、manページから取得されました。

警告:これにより、履歴全体からファイルが削除されます

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

このコマンドは、コミット履歴全体を再作成し、git rm各コミットの前に実行するため、指定されたファイルを削除します。コマンドが失われるので、コマンドを実行する前必ずバックアップしてください。


9
これにより、すべてのコミットIDが変更され、リポジトリのコピーの外部にあるブランチからのマージが解除されます。
bdonlan 2009

19
警告:これにより、履歴全体からファイルが削除されます。これは私が探していたものでしたが、バージョン履歴でずっと以前にコミットされた、完全に不要でサイズが大きいファイル(コミットされるべきではない出力)を削除するためのものです。
zebediah49 2013年

48

うまくいかなかったもの

(Linuxの下で)、私はls-files --ignored --exclude-standard | xargs git rm -r --cachedアプローチを提案するここの投稿を使いたかったです。ただし、削除されるファイル(の一部)の\n名前には、改行/ LF / が埋め込まれていました。どちらのソリューションも:

git ls-files --ignored --exclude-standard | xargs -d"\n" git rm --cached
git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

この状況に対処します(見つからないファイルに関するエラーを取得します)。

だから私は提供します

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached
git commit -am "Remove ignored files"

これはls-filesへの引数とxargs-zへの引数を使用します-0へ、ファイル名の「厄介な」文字を安全に/正しく処理します。

マニュアルページgit-ls-files(1)には、次のように記載されています:

-zオプションを使用しない場合、パス名のTAB、LF、およびバックスラッシュ文字は、それぞれ\ t、\ n、および\\として表されます。

ファイル名にこれらの文字が含まれている場合、私の解決策が必要だと思います。


1
私にとってこれが最善の解決策です。それはよりもはるかに優れたパフォーマンスを持っていますgit add .。また、上記のコメントからの最高の改善点も含まれています。
Nils-o-mat

thSoftをgit commit -am "Remove ignored files"後で答えに追加できますか?あなたの答えを組み合わせて、私は物事を
乗り越えました

の目的がわかりませんgit commit -a。私にとってgit rm --cachedはインデックスに正確に影響するので、ファイルを後でステージングする必要はありません...
Jean Paul

23
  1. .gitignoreファイルを更新します-たとえば、追跡したくないフォルダーを追加します.gitignore

  2. git rm -r --cached .–必要なファイルと不要なファイルを含む、追跡されているすべてのファイルを削除します。ローカルに保存している限り、コードは安全です。

  3. git add . –すべてのファイルが追加されますが、 .gitignoreます。


@AkiraYamamotoに正しい方向を示してくれたハットチップ。


1
とにかくrmを再帰的に実行するには-rが必要なので実際には機能しないため、反対投票はどうですか:)(誰かが正しくコピーしなかった)
Aran Mulholland

1
警告:この手法では、実際にgitがファイルを無視するのではなく、実際にgitがファイルを削除するようにします。つまり、このソリューションを使用すると、他の誰かがgit pullを実行するたびに、ファイルが削除されます。したがって、実際には無視されません。元の質問の解決策については、代わりにgit update-index --assume-unchangedを提案する解決策を参照してください。
orrd

16

おそらく、gitはその概念(セクション「スナップショット、違いではない」)のため、ファイルを完全に忘れることはできないと思います)の。

この問題は、たとえばCVSを使用する場合には発生しません。CVSは情報をファイルベースの変更のリストとして保存します。CVSの情報は、一連のファイルと、時間の経過とともに各ファイルに加えられた変更です。

しかし、Gitでは、プロジェクトの状態をコミットまたは保存するたびに、基本的にすべてのファイルの写真を撮ります、その時点でどのように見えるそのスナップショットへの参照を保存します。そのため、一度ファイルを追加すると、そのスナップショットには常に存在します。

これらの2つの記事は私に役立ちました:

git assume-unchanged vs skip-worktree およびGitで追跡されたファイルの変更を無視する方法

それに基づいて、ファイルがすでに追跡されている場合は、次のようにします。

git update-index --skip-worktree <file>

この時点から、このファイル内のすべてのローカル変更は無視され、リモートには送信されません。リモートでファイルが変更されると、競合が発生しgit pullます。Stashは機能しません。これを解決するには、ファイルの内容を安全な場所コピーし、次の手順に従います。

git update-index --no-skip-worktree <file>
git stash
git pull 

ファイルコンテンツはリモートコンテンツに置き換えられます。安全な場所からファイルに変更を貼り付けて、もう一度実行します。

git update-index --skip-worktree <file>

プロジェクトに携わるすべての人がを実行するgit update-index --skip-worktree <file>場合、問題は発生しpullません。このソリューションは、すべての開発者が独自のプロジェクト構成を持っている場合、構成ファイルには問題ありません。

リモートでファイルが変更されたときに毎回これを行うことはあまり便利ではありませんが、リモートコンテンツによる上書きから保護することができます。


16

次の手順を順番に実行すると、問題ありません。

1. 誤って追加されたファイルをディレクトリ/ストレージから削除します。「rm -r」(Linuxの場合)コマンドを使用するか、ディレクトリを参照して削除できます。または、それらをPCの別の場所に移動します。[ 移動/削除を実行している場合は、IDEを閉じる必要がある場合があります。 ]

ファイル/ディレクトリをgitignore今すぐファイルに追加して保存します。

3. これらのコマンドを使用してgitキャッシュから削除します(複数のディレクトリがある場合は、このコマンドを繰り返し発行して1つずつ削除します)。

git rm -r --cached path-to-those-files

4.now 行うコミットしてプッシュし、これらのコマンドを使用します。これがしますgitのリモートからそれらのファイルを削除し、gitの作る追跡を停止し、それらのファイルを。

git add .
git commit -m "removed unnecessary files from git"
git push origin

13

コピー/貼り付けの答えは git rm --cached -r .; git add .; git status

このコマンドは、Gitリポジトリにすでにコミットされているファイルを無視しますが、ここでそれらをに追加しました.gitignore


9

Matt Fearからの回答が最も効果的なIMHOでした。以下は、除外リストに一致するファイルをgitリポジトリから削除するだけのWindowsのPowerShellスクリプトです。

# Get files matching exclusionsfrom .gitignore
# Excluding comments and empty lines
$ignoreFiles =  gc .gitignore | ?{$_ -notmatch  "#"} |  ?{$_ -match  "\S"} | % {
                    $ignore = "*" + $_ + "*"
                    (gci -r -i $ignore).FullName
                }
$ignoreFiles = $ignoreFiles| ?{$_ -match  "\S"}

# Remove each of these file from Git 
$ignoreFiles | % { git rm $_}

git add .

このファイルのリストが再帰的な--cachedと等しくないのはどのような場合ですか?
John Zabroski、2014年

8

ファイルを安全な場所に移動またはコピーして、紛失しないようにします。次に、ファイルをgit rmしてコミットします。以前のコミットの1つ、または削除されていない別のブランチに戻すと、ファイルは引き続き表示されます。ただし、今後のすべてのコミットでは、ファイルが再び表示されることはありません。ファイルがgit ignoreにある場合は、ファイルをフォルダーに戻すことができます。gitには表示されません。


34
git rm --cachedディスクから削除せずにインデックスからファイルを削除するため、ファイルを移動/コピーする必要はありません
bdonlan

7

git rm --cachedコマンドを使用しても、元の質問には回答しません。

git[ファイル]を完全に忘れさせるにはどうすればよいですか?

実際、このソリューションでは、!を実行すると、リポジトリの他のすべてのインスタンスでファイルが削除されますgit pull

gitにファイルを忘れさせる正しい方法は、GitHubによってここに文書化されています

ドキュメントを読むことをお勧めしますが、基本的に:

git fetch --all
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch full/path/to/file' --prune-empty --tag-name-filter cat -- --all
git push origin --force --all
git push origin --force --tags
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now

full/path/to/fileファイルの完全パスに置き換えるだけです。ファイルがに追加されていることを確認してください.gitignore

また、git履歴を変更しているため、リポジトリへの非早送りプッシュを(一時的に)許可する必要があります。


5

BFGは、それが(・イン・あなたの電流コミットしない)ファイルのいずれかの大きな歴史的に削除されます簡単なフラグを持っているので、具体的には、Gitのリポジトリからの大きなファイルやパスワードなどの不要なデータを除去するために設計されています:「--strip-blobs-より大きい'

$ java -jar bfg.jar --strip-blobs-bigger-than 100M

名前でファイルを指定したい場合は、次のようにすることもできます。

$ java -jar bfg.jar --delete-files *.mp4

BFGはgitフィルターブランチよりも10〜1000倍高速で、通常ははるかに使いやすいです。完全な使用手順例を確認してくださいです。詳細についてはをください。

ソース:https : //confluence.atlassian.com/bitbucket/reduce-repository-size-321848262.html


5

CLIを使用せずにWindowsで作業している場合、TortoiseGitを使用するのが非常に簡単な解決策です。TortoiseGitにはメニューに「削除(ローカルに保持)」アクションがあり、正常に機能します。


5

私はJonBraveの答えが好きでしたが、私はコミットするのに十分な乱雑な作業ディレクトリを持っています-少し怖いので、ここで私がやったことです:

git config --global alias.exclude-ignored '!git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached && git ls-files -z --ignored --exclude-standard | xargs -0 gitステージ&& gitステージ.gitignore && git commit -m "新しいgitignoreと無視されたファイルをインデックスから削除" "

それを分解する:

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached 
git ls-files -z --ignored --exclude-standard | xargs -0 git stage 
git stage .gitignore 
git commit -m "new gitignore and remove ignored files from index"
  • 無視されたファイルをインデックスから削除する
  • .gitignoreステージと削除したファイル
  • コミット

4

これは、最新のgit(執筆時点ではv2.17.1)では問題ではなくなりました

.gitignore最終的に、追跡されたが削除されたファイルを無視します。次のスクリプトを実行して、これを自分でテストできます。最後のgit statusステートメントは「何もコミットしない」と報告する必要があります。

# Create empty repo
mkdir gitignore-test
cd gitignore-test
git init

# Create a file and commit it
echo "hello" > file
git add file
git commit -m initial

# Add the file to gitignore and commit
echo "file" > .gitignore
git add .gitignore
git commit -m gitignore

# Remove the file and commit
git rm file
git commit -m "removed file"

# Reintroduce the file and check status.
# .gitignore is now respected - status reports "nothing to commit".
echo "hello" > file
git status

gitがこれを実行できることをうれしく思います。ただし、OPは、.gitignoreに存在するファイルの変更を追跡しないように求めていました。ステータスが表示された削除済みファイルは追跡していません。
mrturtle

2

すでにコミットされている場合DS_Store

find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch

それらを無視する:

echo ".DS_Store" >> ~/.gitignore_global
echo "._.DS_Store" >> ~/.gitignore_global
echo "**/.DS_Store" >> ~/.gitignore_global
echo "**/._.DS_Store" >> ~/.gitignore_global
git config --global core.excludesfile ~/.gitignore_global

最後に、コミットしてください!


2

特にIDEベースのファイルの場合、これを使用します。

たとえばslnx.sqliteは、次のように完全に削除しました。

git rm {PATH_OF_THE_FILE}/slnx.sqlite -f
git commit -m "remove slnx.sqlite"

これらのファイルの一部には、ローカルユーザー設定とプロジェクトの設定(開いていたファイルなど)が保存されていることに注意してください。そのため、IDEで移動または変更を行うたびに、そのファイルは変更されるため、チェックアウトされて、コミットされていない変更があることが示されます。


2

受け入れられた答えは「ファイルについてGitを「忘れる」 ...」(歴史的に)ではありません。gitに現在/将来のファイルを無視させるだけです。

このメソッドはgitに無視されたファイル(過去 / present / future)を完全に忘れさせますがリモートから再プルされた場合でも)作業ディレクトリから何も削除。

この方法では、の使用が必要です/.git/info/exclude(推奨)をOR 既存 .gitignore全て忘れ/無視するファイルを持ってコミット。1

git ignoreの動作を実際に実行するすべての方法は、事実上履歴を効果的に書き換えるため、このプロセスの後にプルされる可能性のあるパブリック/共有/コラボレーションのリポジトリに大きな影響があります。2

一般的なアドバイス:クリーンなリポジトリから始めます-すべてコミットされ、作業ディレクトリまたはインデックスで保留中のものは何もありません。バックアップを作成しますください!

また、コメント/ 改訂履歴この答えおよび改訂履歴この質問は)啓発/有用である可能性があります。

#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch

git add .gitignore
git commit -m "Create .gitignore"

#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch

git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached

#Commit to prevent working directory data loss!
#this commit will be automatically deleted by the --prune-empty flag in the following command
#this command must be run on each branch

git commit -m "ignored index"

#Apply standard git ignore behavior RETROACTIVELY to all commits from all branches (--all)
#This step WILL delete ignored files from working directory UNLESS they have been dereferenced from the index by the commit above
#This step will also delete any "empty" commits.  If deliberate "empty" commits should be kept, remove --prune-empty and instead run git reset HEAD^ immediately after this command

git filter-branch --tree-filter 'git ls-files -z --ignored --exclude-standard | xargs -0 git rm -f --ignore-unmatch' --prune-empty --tag-name-filter cat -- --all

#List all still-existing files that are now ignored properly
#if this command returns nothing, it's time to restore from backup and start over
#this command must be run on each branch

git ls-files --other --ignored --exclude-standard

最後に、以下のコマンドに関する重要な警告/情報を含むこのGitHubガイドの残り(手順6以降)に従ってください

git push origin --force --all
git push origin --force --tags
git for-each-ref --format="delete %(refname)" refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now

現在変更されているリモートリポジトリからプルする他の開発者は、バックアップを作成してから、次のことを行う必要があります。

#fetch modified remote

git fetch --all

#"Pull" changes WITHOUT deleting newly-ignored files from working directory
#This will overwrite local tracked files with remote - ensure any local modifications are backed-up/stashed

git reset FETCH_HEAD

脚注

1ので/.git/info/exclude、おそらく取得の詳細については、上記の手順を使用して、すべての歴史のコミットに適用することができ.gitignore、ファイルをを必要とする履歴コミットには、この回答の範囲を超えています。.gitignoreそれが私が最初にやったように、ルートコミットに適切な名前を付けたかったのです。コミット履歴の/.git/info/excludeどこに.gitignore存在しても同じことを達成できるため、他の人は気にしないかもしれません。また、影響を認識している場合でも、履歴を明確書き換えることは非常に扱いにくいテーマです。。またです。

FWIW、潜在的な方法には、 git rebaseこの質問への回答のように、外部コミットを各コミットにgit filter-branchコピーするまたは .gitignore

2スタンドアロンgit rm --cachedコマンドの結果をコミットすることでgit ignore動作を強制的に実行すると、強制プッシュされたリモートからのプルで、新しく無視されたファイルが削除される可能性があります。--prune-empty次のgit filter-branchコマンドのフラグは、以前の「無視されたすべてのファイルを削除する」インデックスのみのコミットを自動的に削除することにより、この問題を回避します。git履歴を書き直すとコミットハッシュも変更され、、パブリック/共有/共同リポジトリからの将来のプルで大混乱が発生します。このようなリポジトリにこれを行う前に、影響を十分に理解してください。このGitHubガイドでは、次のことを指定しています。

共同編集者に 古い(汚染された)リポジトリの履歴から作成したブランチをマージするのではなくリベース。1つのマージコミットで、パージの問題に行った汚染された履歴の一部またはすべてを再導入できます。

リモートリポジトリに影響を与えない代替ソリューションは、git update-index --assume-unchanged </path/file>またはでありgit update-index --skip-worktree <file>、その例はここにあります


0

Windowsで苦労していて、フォルダ全体を無視したい場合は、「cd」を実行して「フォルダ」を希望し、「Git Bash Here」を実行します。

git ls-files -z | xargs -0 git update-index --assume-unchanged

0

ここでは、削除する必要があるいくつかのディレクトリにいくつかの.lockファイルがありました。私は以下を実行しましたが、それらを削除するために各ディレクトリに移動する必要はありませんでした:

git rm -r --cached **/*.lock

これを行うと、私がいた場所の「ルート」の下の各フォルダーに入り、パターンに一致するすべてのファイルが除外されました。

これが他の人に役立つことを願っています!

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