gitリポジトリ内の追跡されていないすべてのファイルとフォルダを無視する便利な方法はありますか?
(私は知ってい.gitignoreます。)
したがってgit status、再びクリーンな結果が得られます。
すでに述べたように、ステータスから除外するには、次を使用します。
git status -uno # must be "-uno" , not "-u no"
代わりに、現在追跡されていないファイルを永続的に無視したい場合は、プロジェクトのルートから次のコマンドを起動できます。
git status --porcelain | grep '^??' | cut -c4- >> .gitignore
以降のすべての呼び出しは、git statusこれらのファイルを明示的に無視します。
更新:上記のコマンドには小さな欠点があり.gitignoreます。ファイルがまだない場合、gitignoreはそれ自体を無視します。これは、が実行される前にファイル.gitignoreが作成されるために発生しますgit status --porcelain。.gitignoreしたがって、まだファイルがない場合は、次を使用することをお勧めします。
echo "$(git status --porcelain | grep '^??' | cut -c4-)" > .gitignore
これにより、ファイルが作成される前に完了するサブシェルが作成されます。.gitignore
たくさんの票を獲得しているので、コマンドの説明(ありがとう!)コマンドについて少し説明したほうがいいと思います。
git status --porcelain手動で「スクリプトの出力を解析しやすい形式で提供します。これは短い出力に似ていますが、gitバージョン間で、ユーザー構成に関係なく安定したままです」と記載されてgit status --shortいるため、代わりにが使用されます。したがって、解析可能性と安定性の両方があります。grep '^??'で始まる行のみをフィルタリングします。これは、 gitステータスマニュアル??によると、追跡されていないファイルに対応します。cut -c4-すべての行の最初の3文字を削除します。これにより、追跡されていないファイルへの相対パスのみが得られます。|シンボルはパイプであり、前のコマンドの出力を次のコマンドの入力に渡します。>>および>記号はリダイレクト演算子であり、前のコマンドの出力をファイルに追加するか、新しいファイルを上書き/作成します。との代わりに使用sedすることを好む人のための別のバリエーション、ここに別の方法があります:grepcut
git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore
これらのファイルを永続的に無視したい場合、それらを追加する簡単な方法.gitignoreは次のとおりです。
git ls-files --others --exclude-standard >> .gitignoreこれにより、追跡されていないディレクトリ内のすべてのファイルが列挙されますが、これは希望するものである場合とそうでない場合があります。
マニュアルで見つけました
modeパラメーターは、追跡されていないファイルの処理を指定するために使用されます。これはオプションです。デフォルトはallであり、指定する場合は、オプションに固定する必要があります(たとえば、-unoですが、-u noではありません)。
git status -uno
受け入れられた答えよりも良い私見は、以下を使用することです:
git config --local status.showUntrackedFiles no
受け入れられた回答は、含まれていない新しいファイルが追加された場合には機能しません.gitignore
ふたつのやり方:
の引数-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。その場合、それらは表示されません。
-u noステージングされていないファイルも表示されません。 -uno必要に応じて動作し、ステージングされていない状態で表示されますが、追跡されていない状態で非表示になります。
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
追跡されていないファイルがたくさんあり、それらすべてを「」したくない場合は、git 1.8.3(2013年4月22日)以降、そのオプションをに追加しなかった場合でも言及されることgitignoreに注意してください。最初の場所!git status--untracked-files=no
" "は、時間がかかりすぎる場合にオプション
git statusの使用を検討することをユーザーに提案します。--untracked=no
少し違う問題を解決しようとここに来ました。多分これは他の誰かに役立つでしょう:
新しいブランチを作成します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"