Gitが指定したファイルを無視しないのはなぜですか?


190

に次の行を追加しました.gitignore

sites/default/settings.php

しかし、タイプするgit statusとファイルはステージングされていないファイルとして表示されます。

どうしたの?他のすべてのパターンはうまく機能します。



同じ問題があり、.gitignoreファイルを別のドライブに保存したことがわかりました:face-palm:
Henry Chan

リポジトリにものを保持し、その変更を無視することは非常に悪い考えです。
Yevgeniy Afanasyev 2017

回答:


363

.gitignoreが作業ディレクトリのルートにあることを確認し、そのディレクトリでステータス出力からファイルへのパスを実行git statusしてコピーし、に貼り付け.gitignoreます。

それが機能しない場合は、ファイルがすでにGitによって追跡されている可能性があります。これはの出力で確認できますgit status。ファイルが「追跡されていないファイル」セクションにリストされていない場合、そのファイルはすでにGitによって追跡されており、.gitignoreファイルからのルールは無視されます。

Gitでファイルを無視する理由は、それらがリポジトリに追加されないようにするためです。以前に無視したいファイルを追加した場合、そのファイルはGitによって追跡され、それに一致する無視ルールはスキップされます。ファイルはすでにリポジトリの一部であるため、Gitはこれを行います。

ファイルを実際に無視するには、ファイルを追跡解除してリポジトリから削除する必要があります。これは、を使用して行うことができますgit rm --cached sites/default/settings.php。これにより、ファイルを物理的に削除することなく、ファイルがリポジトリから削除されます(それがの--cached機能です)。その変更をコミットした後、ファイルはリポジトリから削除され、無視しても正しく機能するはずです。


「作業ディレクトリのルート」とはどういう意味ですか?'.git'リポジトリがあるディレクトリ?
ジョナサンレフラー、

作業ディレクトリは、ディレクトリ.gitが配置されているディレクトリであり、それ自体がリポジトリのルートです。あなたがリポジトリのクローンを作成するときと同じように/xy/、その後/xy/で自分の作業ディレクトリである/xy/.git/内部。
突く

3
時には、あなたもまた、実行する必要がありますgit add .後にgit rm --cached適切にインデックスを再構築します。
クーパー

gitステータスで確認するというアイデアは素晴らしいものでした。EclipseのGitステージングでチェックし続けましたが、パスが正しくありませんでした。ありがとう!
ワラ

1
ネストされたフォルダもチェックインしたため、-r(再帰的)フラグを追加する必要がありました。私の場合、gitフォルダーのルートに移動して、コマンドgit rm --cached -r .vs /を実行しました。vsは、追跡から削除したい最上位のフォルダーです。
Devology Ltd

105

私はこれに遭遇しました、それは古い質問ですが、そのファイルは追跡されるが、特定の作業コピーでは追跡されないようにして、実行できることを行います

git update-index --assume-unchanged sites/default/settings.php

5
それが実際に私が探していた答えです。他のすべての回答は、ファイルがgit addで追加されたことを前提としていますが、常にそうであるとは限りません。Acquia Cloudでは、.gitignoreファイルはsettings.php(たとえば)を無視することになっていますが、ファイルは最初のコミットに含まれています。ファイルの追跡を解除し、単にリポジトリからファイルを削除します。したがって、ライブサイトから削除します...
PatrickS

私も助けてくれました-ありがとう!投票した。ローカルのgitリポジトリにのみ適用され、リモートにプッシュされて他の開発者によって複製されると永続化しないと思いますが?
Ivan

1
はい、ローカルのみです。
Mescalito

40

.gitignoreは、リポジトリにまだ追加していないファイルのみを無視します。

を実行しgit add .、ファイルがインデックスに追加された場合、.gitignoreは役に立ちません。git rm sites/default/settings.php削除する必要がありますが、無視されます。


thanks.butファイルをインデックスからのみ削除し、作業ディレクトリからは削除しませんか?
Nick.h 2010

1
git rmこれを行う必要がありますが、-fオプションを使用して作業ディレクトリから削除するように求められる場合があります。私はファイルのコピーを作成しgit rm -f、それを実行してからコピーを復元する以外にこれを理解していません。
jonescb 2010

同じです。どこかにコピーを作成し、それを削除し、削除された状態をコミットし、ファイルを再度追加して、現在無視されている方法を確認します。
Yevgeniy Afanasyev 2017

15

このコマンドを使用してください

git rm -rf --cached .
git add .

正しい場合でも、.gitignoreファイルが機能しないことがあります。Gitがファイルを無視する理由は、それらがリポジトリーに追加されないためです。以前に無視したいファイルを追加した場合、そのファイルはGitによって追跡され、一致するルールのスキップはスキップされます。ファイルがすでにリポジトリの一部であるため、Gitはこれを行います。


12

私も同じ問題を抱えていました。.gitingore実行時に未追跡ファイルとしてリストされている場所で定義されたファイルgit status

その理由は、.gitignoreファイルがUTF-16LEエンコードではなくエンコードで保存されたためUTF8です。

.gitignoreファイルのエンコーディングを変更した後UTF8、私にとってはうまくいきました。


これが原因で私は初心者のように感じます...それをぶら下げてWindows
Coty Embry

ファイルのエンコーディングが重要な理由は何ですか?パスを正しく読み取っていませんか?
Chargnn

2

settings.phpファイルを正常に無視するために私がしたこと:

  1. git rm --cached sites / default / settings.php
  2. コミット(ここまでは機能しませんでした)
  3. 手動で削除されたsites / default / settings.php(これはトリックを行いました)
  4. git add。
  5. コミット(正常に無視)

Gitにコミットされたファイルがある場合、ignoreは期待どおりに動作しません。ファイルを削除してコミットするだけです。その後は無視されます。


2

たとえばgitで追跡したい(たとえば.gitignoreが機能しない)アプリケーション構成ファイルなどのインスタンスがありますが、ローカル設定を変更する必要があります。これらのファイルをgitで管理したり、変更されたものとして表示したりしたくありません。これを行うには、skip-worktreeを使用します。

git update-index --skip-worktree path/to/file

ファイルをリストし、Sで始まる行をスキップしてスキップしたことを確認することで、ファイルがスキップされたことを確認できます。

git ls-files -v | grep ^S

将来的にgitでファイルをローカルに再び管理する場合は、次のコマンドを実行します。

 git update-index --no-skip-worktree path/to/file

上記のメスカリトは素晴らしい答えを出しました、それは私を正しい道に導きましたが、

git update-index --assume-unchanged file / to / ignore.php

gitと契約を結んでいます。ユーザーはファイルを変更しないことを約束し、Gitが作業ツリーファイルがインデックスに記録されているものと一致すると想定できるようにします。

ただし、ファイルの内容を変更するため、私の場合は--skip-worktreeの方が適しています。

Toshiharu NishinaのWebサイトは、skip-worktreeと仮定が変更されていないことの優れた説明を提供しました:ローカルでGitで既に管理されているファイルを無視します


2

もう1つの考えられる理由同時に実行しているgitクライアントのインスタンスがいくつかあります。たとえば、「git shell」+「GitHub Desktop」などです。


これは私に起こりました、私はメインクライアントとして「GitHubデスクトップ」を使用していて、いくつかの新しい.gitignore設定を無視していました:コミット後にコミット:

  1. あなたは何かをコミットします。
  2. 次に、コミット:.gitignore設定を無視します。コミットには、.gitignoreで言及されている多くの一時ファイルが含まれます。
  3. gitキャッシュをクリアします。.gitignoreがUTF8かどうかを確認します。ファイルを削除->コミット->ファイルを元に戻します。1コミットをスキップ–何の助けにもなりません。

理由:Visual Studioコードエディターは、同じリポジトリが開かれているバックグラウンドで実行されていました。VS Codeにはgitコントロールが組み込まれているため、競合が発生します。

解決策:複数の非表示のgitクライアントを再確認し、一度に1つのgitクライアントのみを使用します(特にgitキャッシュをクリアする場合)。


1

.gitignoreに拡張子がないことを確認してください!! .gitignore.txtにすることはできません。Windowsでは、ファイル名を.gitignoreにしてください。そしてそれは動作します。


0

私はこれをgit 1.7.3.1で試してみて、次のような構造を与えました:

repo/.git/
repo/.gitignore
repo/sites/default/settings.php

ここでrepo、上記の「ルート」はここにあり(私はそれを作業ツリーのルートと呼びます)、それ.gitignoreだけが含まれsites/default/settings.php、無視は私にとって機能します(.gitignoreリポジトリに追加されているかどうかは関係ありません)。これはあなたのリポジトリのレイアウトと一致していますか?そうでない場合、何が異なりますか?


はい、それはあなたのものとまったく同じですが、機能しません。他のすべてのパターンは機能します。私が言ったように問題は確かにsettings.phpフォルダに関連しています。
Nick.h 2010

リポジトリにものを保持し、その変更を無視するのは非常に悪い考えだと思います。
Yevgeniy Afanasyev 2017

@YevgeniyAfanasyevコンパイル出力、IDEユーザー設定、ツールチェーンによって生成された他のすべての一時ファイルなどを除く...
Chris F Carroll

プロジェクトフォルダーにあるファイルだけでなく、リポジトリにコミットし続けることを意味しました。リポジトリに一時ファイルが必要なのはなぜですか?
Yevgeniy Afanasyev

0

将来の誰かが私と同じ問題を抱えている場合に備えて:

あなたが使用する場合

*
!/**/
!*.*

拡張子のないバイナリファイルを削除するには、他のすべてのgitignore行が以下であることを確認してください。Gitは上から.gitignoreから読み取るため、gitignoreに「test.go」が含まれていても、最初はファイル内にあり、その後「無視」されました

!*.*

0

上記のほとんどのコマンドをVS Code端末で試しましたが、次のようなエラーが発生しました。

fatal: pathspec '[dir]/[file]' did not match any files

私はGitHubデスクトップでプロジェクトを開き、そこから無視しましたが、うまくいきました。

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