ローカルで一部のファイルを無視するようにgitを構成するにはどうすればよいですか?


1350

他の人のためにグローバルgit設定を汚染することなく、ファイルをローカルで無視できますか?私のgitステータスでスパムである追跡されていないファイルがありますが、ローカルブランチにある小さなランダムな追跡されていないファイルごとにgit configの変更をコミットしたくありません。

回答:


1863

関連するGitのドキュメント

特定のリポジトリに固有であるが、他の関連リポジトリと共有する必要がないパターン(たとえば、リポジトリ内に存在するが、1人のユーザーのワークフローに固有である補助ファイル)は、$GIT_DIR/info/excludeファイルに入れる必要があります。

.git/info/excludeファイルは任意のと同じ形式がある.gitignoreファイルを。別のオプションは、core.excludesFileグローバルパターンを含むファイルの名前に設定することです。

すでにステージングされていない変更がある場合は、ignore-patternsを編集した後、次を実行する必要があります。

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

$GIT_DIR:これは、gitマニュアル全体で使用されいる表記、単にgitリポジトリへのパスを示しています。環境変数が設定されている場合は、現在のリポジトリの場所をオーバーライドします。これは、おそらく望んでいる場所ではありません。


編集:別の方法は、使用することです:

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

それを逆にします:

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

204
注意点としてgit update-index --assume-unchanged [<file>...]、excludeファイルに追加を行った後に実行してください。それまで変更は反映されません。
tollmanz 2013年

30
git 1.7.9.5を使用して変更を有効にするために、「git update-index ...」を実行する必要はありませんでした。
ジェフリーマルティネス

39
すでにファイルに変更を加えており、無視する場合は、git update-indexを使用するだけで済みます。変更を行う前に除外を変更した場合、それは必要ありません。
Brady Emerson

13
これにより、.gitignoreなどのコミット中にファイルが変更されたように表示されなくなりますが、無視されたファイルとは異なり、git reset --hardを実行すると、ファイルはリポジトリバージョンにリセットされます。
Brady Emerson

19
stackoverflow.com/questions/23097368/…およびstackoverflow.com/questions/13630849/…ごとに、skip-worktreeおそらくが優先されassume-unchangedます。
danShumway、2015

436

更新git update-index --skip-worktree [<file>...]代わりに使用を検討してください、@ danShumwayに感謝!2つのオプションの違いに関するBorealidの説明を参照してください。


古い答え:

追跡されたファイルへのローカルの変更を無視する必要がある場合(設定ファイルへのローカルの変更を含む)、を使用しますgit update-index --assume-unchanged [<file>...]


8
ただ注意して、ファイルを$ GIT_DIR / info / exclude(たとえば、my-file.php)に追加し、git update-index --assume-unchanged my-file.phpそれを無視して無視されるように実行する必要がありました。先端をありがとう!
tollmanz 2013年

78
元に戻すには: git update-index --no-assume-unchanged my-file.php
Ray

18
ただ、明確化のために:と仮定し、そのまま(レポに存在する)は、追跡ファイルのためのものです... OPは、その場合には、人跡未踏のファイルを求めていた.git/info/excludeあなたは(多くの場合、共有、追跡.gitignoreを汚染を避けるために)何をしたいです
dyodjiを

7
stackoverflow.com/questions/23097368/…によると、これは安全ではないと見なされており、注意しないとファイルがコミットされる可能性があります。これはパフォーマンスの向上を目的としており、この問題の完全な解決策ではありません。
danShumway、2015

3
私は--assume-unchangedあなたのアップデートを読む前に急いで行きました。私は元に戻しましたが--no-assume-unchangedそれから--skip-worktree...をクリアしましたか?
Nicolas Miari

162

.gitconfigファイルの[alias]セクションに次の行を追加します

ignore = update-index --assume-unchanged
unignore = update-index --no-assume-unchanged
ignored = !git ls-files -v | grep "^[[:lower:]]"

これを使用git ignore my_fileして、ローカルファイルへの変更をgit unignore my_file無視し、変更の無視を停止できます。git ignored無視されたファイルをリストします。

この回答はhttp://gitready.com/intermediate/2009/02/18/temporarily-ignoring-files.htmlから収集されました。


1
"!git ls-files -v | grep" ^ [[:lower:]] "-Windowsコマンドでこれを行う方法を知っている可能性はありますか?
Haohmaru

3
実際のシェルをインストールします(たとえば、Babunはbashまたはzshを提供します);)私はあなたの気持ちを知っていますが、最近WindowsからLinuxに切り替えたので、cmdを再び使用することはありません。
Xerus

@ Haohmaru、WSL(LinuxのWindowsサブシステム)はいつでも使用できます。
1

110

いくつかのオプションがあります。

  • ダーティ(またはコミットされていない).gitignoreファイルを作業ディレクトリに残します(またはtopgitまたはその他のパッチツールを使用して自動的に適用します)。
  • $GIT_DIR/info/excludeこれが1つのツリーに固有の場合は、ファイルに除外を配置します。
  • を実行git config --global core.excludesfile ~/.gitignoreして、パターンをに追加します~/.gitignore。このオプションは、すべてのツリーで特定のパターンを無視する場合に適用されます。たとえば、これをファイル.pyc.pyoファイルに使用します。

また、該当する場合は、ファイルを明示的に列挙せず、パターンを使用していることを確認してください。


10
git config --globalオプションをグローバルに設定する必要があると思います。
ジョシュリー

7
実際には、.gitignoreを.gitignoreに追加するだけです;)!
ドミニクジョージ

68

私はあなたが探していると思います:

git update-index --skip-worktree FILENAME

ローカルで行われた変更を無視します

ここだhttp://devblog.avdi.org/2011/05/20/keep-local-modifications-in-git-tracked-files/これらのソリューションの詳細については説明が!

使用を元に戻すには:

git update-index --no-skip-worktree FILENAME

9
間の関連の議論がある--skip-worktree--assume-unchangedこのSOの質問
Merwer

1
これを元に戻すにはどうすればよいですか、または現在で無視されているファイル/パターンのリストを表示します。--skipworktree後で気が変わって、ファイルの追跡を再開したいですか?
アノマリー

1
これを元に戻すには?
user1735921

3
アンドゥしてください使用するためにgit update-index --no-skip-worktree <file>
user1735921

49

このプロセスを簡単にするために、いくつかのgitエイリアスをインストールできます。これ[alias]により、.gitconfigファイルのノードが編集されます。

git config --global alias.ignore 'update-index --skip-worktree'
git config --global alias.unignore 'update-index --no-skip-worktree'
git config --global alias.ignored '!git ls-files -v | grep "^S"'

これによりインストールされるショートカットは次のとおりです。

  • git ignore config.xml
    • gitは変更を認識しないふりをしてconfig.xml、誤って変更をコミットするのを防ぎます。
  • git unignore config.xml
    • gitは変更の承認を再開しますconfig.xml—これらの変更を再度コミットできます。
  • git ignored
    • gitは、上記の方法で「無視」しているすべてのファイルをリストします。

私はファットマンの答えを参照してこれらを作成しました--assume-unchanged同じバージョンを提示しています。

私が提示するバージョンは--skip-worktree、ローカルの変更を無視するために使用します。違いの詳細については、Borealidの回答を参照してください。ただし、本質的に--skip-worktree、開発者が変更をコミットするリスクなしにファイルを変更することを目的としています

git ignoredここで紹介するコマンドは、使用していますgit ls-files -v、そして始まるちょうどこれらのエントリを示すために、リストをフィルタリングSタグを。Sタグは、その状態で「worktreeをスキップ」ファイルを表しています。によって表示されるファイルステータスの完全なリストについてはgit ls-files-tオプションのドキュメントを参照してくださいgit ls-files


1
これは追跡されていないファイルでは機能しません:<(osxでgit 2.13.5)
Terra Ashley

それは '!' にいるはず'!git ls-files -v | grep "^S"'?コマンドはそこにあると動作しません。削除すると正常に動作するようです。
Tirisは、

gitエイリアスの感嘆符は、gitにgitサブコマンドではなく外部コマンドを実行するように指示します。シェルパイプラインが必要なために配置したので、外部からgitを呼び出す必要があります。私は感嘆符を削除しようとしましたが(推奨に従って)、それは私にとってはうまくいきません。私が取得します。意味あり; 感嘆符なし:gitはコマンドをにエイリアスします。Expansion of alias 'ignored' failed; 'git' is not a git commandgit git ls-files …
Birchlabs 2017年

説明ありがとう。私はgitエイリアスに慣れておらず、エイリアスを作成する前にシェルで実行してテストしていました。
Tirisは、

これは素晴らしいソリューションです。gitはディレクトリごとに追跡するため、上記のエイリアスを実行すると、git ignore <filename>そのディレクトリにのみ適用されます。そして、最終的にそのファイルに変更を加えてコミットしてリモートにプッシュしたい場合は、便利な機能git unignore <filename>を使用して一時的に再び追跡を開始します!ありがとう!
nickang 2018

42

あなたは、単につまり、自分のホームディレクトリに.gitignoreファイルを追加することができます$HOME/.gitignore~/.gitignore。次に、次のコマンドでそのファイルを使用するようにgitに指示します。

git config --global core.excludesfile ~/.gitignore

これは、無視するものを決定するときにgitが参照する通常の.gitignoreファイルです。これはホームディレクトリにあるため、自分だけに適用され、プロジェクトの.gitignoreファイルを汚染することはありません。

私はこのアプローチを何年も使用してきましたが、すばらしい結果が得られました。


ありがとう、@ EricChen。回答を更新しました。試してから、git check-ignore <file-name>確認に使用してください。LMKが機能する場合
JESii 2017年

それは私なしでのみ機能しました=git config --global core.excludesfile ~/.gitignore
E. Sundin 2017年

.gitignoreホームディレクトリの下にファイルを置き、代わりにそのファイルを使用するようにgitに指示してから、ローカルで追跡を解除するファイルを削除しました。ただし、変更をプッシュした後、リモートリポジトリもそれらのファイルを削除しました。私は何か間違ったことをしましたか?
zyy

うわー、@ xyz; .gitignoreローカルディレクトリに存在するファイルを無視することです。あなたがしなければならないことはgit rm --cached、それらをリポジトリから削除しますが、ローカルに残します。git reset --soft HEAD^そのコミットを元に戻し、ファイルを回復するようなもので、以前のコミットに戻ることができるはずです。それがgitの美点です。gitの履歴にはすべて残っています。
JESii

2

追跡されていない(数個の)フォルダーにある場合に特に追跡されていないファイルを無視するには、すべての追跡され.gitignoreていないフォルダーにファイルを追加し、を含む1行に*続けて新しい行を入力するのが簡単な解決策です。追跡されていないファイルがいくつかのフォルダーにある場合、これは本当にシンプルで簡単なソリューションです。私にとって、すべてのファイルは単一の追跡されていないフォルダーvendorからのものであり、上記はうまくいきました。


1
すごい!参考:これはgitがフォルダーではなくファイルのみを追跡する(そしてコミットできるようにする)ためにのみ機能します。
jmiserez

-2

リポジトリに.gitignoreファイルがまだない場合、簡単な解決策は.gitignoreファイルを作成し、その中に.gitignore無視するファイルのリストに追加することです。


4
そして、チームが後でgitignoreを追加するために追加したい場合はどうなりますか?これでも機能しますか?ひどい考えのようで、うまくいかないはずの何かのように聞こえます。
ビョルン

この男の答えは私を解任しました。だれもこれをやっているわけではない。
Martyn Chamberlin

置く場所さえあれば、これは素早く簡単な解決策です。リポジトリ.gitignoreの上部に共有ファイルがあります。しかし、私のダーティーファイルは深いフォルダーにあるので、その.gitignore横に自分のダーティファイルを追加しました。+1
joeytwiddle
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.