git:現在のすべての追跡されていないファイルを無視する方法は?


131

gitリポジトリ内の追跡されていないすべてのファイルとフォルダーを無視する便利な方法はありますか?
(私は知ってい.gitignoreます。)

したがってgit status、再びクリーンな結果が得られます。



または、単一の*を.gitignoreファイルに追加することもできます。:)
vilicvane 2013

1
ただ、*非常に可能性の高いあなたが望むものではありません。
sjas 2013年


非常に多くの不正解に驚いています。-u no間違っている。-uno正しい。-u noという名前のファイルでステータスを実行しようとしますnonoない引数-u。を強制的にnoへの引数として解釈するには、-uスペースを入れてはなりません。これをテストするには、を実行してtouch Invalidと比較git status -uInvalidgit status -u Invalidます。
Aaron McDaid 2016年

回答:


251

すでに述べたように、ステータスから除外するには、以下を使用します。

git status -uno  # must be "-uno" , not "-u no"

代わりに、現在追跡されていないファイルを永久に無視したい場合は、プロジェクトのルートから次を起動します。

git status --porcelain | grep '^??' | cut -c4- >> .gitignore

以降の呼び出しでgit statusは、これらのファイルは明示的に無視されます。

更新:上記のコマンドには小さな欠点があり.gitignoreます:ファイルがまだない場合、gitignoreはそれ自体を無視します!これは、ファイル.gitignoregit status --porcelainが実行される前に作成されるために発生します。したがって、.gitignoreまだファイルがない場合は、次の使用をお勧めします。

echo "$(git status --porcelain | grep '^??' | cut -c4-)" > .gitignore

これにより、ファイルが作成される前に完了するサブシェル.gitignoreが作成されます。

コマンド説明私は票の多くを得ているように私は私がより良いコマンドを少し説明したいと思います(ありがとう!):

  • git status --porcelain代わりに使用されているgit status --shortので、マニュアルの状態が「スクリプト用の簡単に解析形式で出力を与える。これは、短い出力に似ていますが、gitのバージョン間で安定しており、関係なく、ユーザの設定のままになります。」したがって、解析性と安定性の両方があります。
  • grep '^??'git status manualに??よれば、追跡されていないファイルに対応する、で始まる行のみをフィルタリングします。
  • cut -c4- 各行の最初の3文字を削除します。これにより、追跡されていないファイルへの相対パスのみが取得されます。
  • |記号はパイプ次のコマンドの入力に前のコマンドの出力を渡します。
  • >>そして>シンボルでリダイレクト演算子ファイルに前のコマンドの出力を追加、または上書き/それぞれ、新しいファイルを作成します。

andの代わりに使用sedすることを好む人のための別のバリアント、ここに別の方法があります:grepcut

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore

3
cut -c4- 各行の最初の4文字を削除します。これにより、追跡されていないファイルへの相対パスのみが取得されます。No. -cは、カットする列番号のリストの始まりを示します。そして 、列4から最後までの行を4- 選択し、列1〜3を切り取ります。したがって、カットコマンドは実際には各行の最初の3文字を削除します。このファイルの例のようにgitステータス行から4文字を削除した場合?? app/views/static_pages/contact.html.erb、の最初の文字を削除しますapp。したがって、コマンドは正しいですが、説明が間違っています。
2014

@ 7stud:ありがとう、あなたは正しい、私は誤って4を書いた。答えを修正しました。
ディエゴ

2
コマンドの説明には本当に感謝しています。私がインターネットからコピーしたランダムなコマンドが何をしているかを知るのはうれしいことであり、私たち全員がコマンドラインとgitをよりよく使う方法を学ぶのに役立ちます。
エリックフィッティング2015年

1
-u noうまくいきません。しかし-unoそうです。それに応じて答えを更新しました。これはgitの奇妙なデザインです。私はgit 1.7.1
Aaron McDaidが2016年

2
@AaronMcDaid:ありがとう。変更はここに文書化さここで議論されます
Diego

51

これらのファイルを永久に無視したい場合.gitignoreは、それらを追加する簡単な方法は次のとおりです。

  1. gitツリーのルートに移動します。
  2. git ls-files --others --exclude-standard >> .gitignore

これにより、追跡されていないディレクトリ内のすべてのファイルが列挙されます。


3
なぜこれは多くの票を得ないのですか?他の2つのプログラムをパイプする必要はありません。
JoelFan 2017年

4
@JoelFan:2つの理由:1)これはgitのルートからのみ機能しますが、受け入れられたものはすべてのサブディレクトリから機能しますが、宛先.gitignoreパスを微調整する必要があります2)追跡されていないディレクトリがある場合は、この1つずつと追跡されていないディレクトリ自体ではなく、その中のすべての単一ファイル(したがって、ディレクトリを無視しないため、ディレクトリ内の将来のファイルが追跡されていないものとして報告されますが、受け入れられたファイルにはディレクトリのみが表示され、内部の追跡されていないファイルは表示されませんこれはあなたが何をしたいかという問題ですが、多くの場合、ディレクトリ全体を無視したいだけです
Diego

1
Poolie私は違い感謝ありがとうご提案を理由 @Diego Iで述べた点のファイル&フォルダのライブラリでの作業を開始し、私は、元のファイルをプッシュ/追跡する必要はありません。ライブラリで追加または再構築したファイルのみを追跡したい。親フォルダを追加すると、すべてが無視されます。この/あなたのソリューションは、すべての1696ファイルを瞬時に追加しました。xD
Chaos7703 2017

これは、を使用しても実現できgit config status.showUntrackedFiles noます。
ラルシュ

16

マニュアルで見つけた

modeパラメータは、追跡されていないファイルの処理を指定するために使用されます。これはオプションです。デフォルトはすべてであり、指定する場合はオプションに固定する必要があります(例:-uno、ない-u no)。

git status -uno


39
まあ、誰もが投稿する前にRTFMを行うとしたら、誰も返信を得られないでしょう:-)
Jenny D

4

二つの方法:

引数「-uno」をgit-statusに使用します。次に例を示します。

[jenny@jenny_vmware:ft]$ git status
# On branch ft
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       foo
nothing added to commit but untracked files present (use "git add" to track)
[jenny@jenny_vmware:ft]$ git status -uno
# On branch ft
nothing to commit (working directory clean)

または、ファイルとディレクトリを.gitignoreに追加できます。その場合、それらは表示されません。


2
編集の便利な方法.gitignoreビーイングをgit status | cat >> temp && vim temp。次に、最初の数行と最後の行が削除されるようにファイルを編集し、末尾#とその後の空白を削除します。その後cat temp >> .gitignore && rm temp.gitignore以前に存在しなかった場合は、mv temp .gitignoreやります。醜いものですが、.gitignore手動で更新するよりも優れています。
sjas

1
この答えは間違っています。正解は-unoです。を使用する場合-u no、これは次と同等no -uです。呼び出されたファイルno(おそらく存在しない可能性があります)でステータスを実行し、デフォルトの-uモードを使用します。つまり、以下と同等ですgit status no
アーロン・マクダイド2016年

3

-u noステージングされていないファイルも表示されません。 -uno必要に応じて機能し、ステージングされていないものを表示しますが、追跡されていないものを非表示にします。


1
これでもまったく正しくありません。 (はの引数ではありません)git status -u Xと同じです。これは次と同じです(引数がないとデフォルトになるため)。したがって、これは単にファイルのgit-statusです。したがって、それは単にと呼ばれるファイルでgitステータスを実行しようとするだけの場合、おそらく持っていないgit status X -uX-ugit status X-u-uXXnono
Aaron McDaid

2

OSのようなUnixを使用していない場合、これはPowerShellを使用してWindowsで動作します

git status --porcelain | ?{ $_ -match "^\?\? " }| %{$_ -replace "^\?\? ",""} | Add-Content .\.gitignore

ただし、.gitignoreファイルには新しい空の行が必要です。それ以外の場合は、コンテンツがあるかどうかに関係なく、最後の行にテキストが追加されます。

これはより良い代替手段になるかもしれません:

$gi=gc .\.gitignore;$res=git status --porcelain|?{ $_ -match "^\?\? " }|%{ $_ -replace "^\?\? ", "" }; $res=$gi+$res; $res | Out-File .\.gitignore


1

あなたは持っている場合は、多くの人跡未踏のファイルを、そして「したくないgitignore、それらのすべて」以来、そのノートのgit 1.8.3(2013年4月、22D) git status言及されます--untracked-files=noあなたがそのオプションを追加しなかった場合でもを最初の場所!

git status」は--untracked=no、時間がかかりすぎる場合にオプションの使用を検討することをユーザーに提案します。


0

少し違う問題を解決しようとしてここに来ました。多分これは他の誰かに役立つでしょう:

新しいブランチを作成しますfeature-a。このブランチの一部として、新しいディレクトリを作成し、.gitignoreを変更してそれらの一部を抑制する必要があります。これは、さまざまなキャッシュフォルダを作成する新しいツールをプロジェクトに追加するときによく発生します。 .serverless.terraformなど

それをマスターにマージする準備ができる前に、別のものが出てきたのでmaster、もう一度チェックアウトしgit statusますが、.gitignoreはまだマージされていないため、抑制されたフォルダーを再び取得します。

ここでの答えは実際には簡単ですが、それを理解するにはこのブログを見つける必要がありました。

feature-aブランチから.gitignoreファイルをチェックアウトするだけです

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