Git:「追跡されていない」ファイルのみを一覧表示する(カスタムコマンドも)


339

git ls-files追跡されていないファイルのみを表示するようなコマンドを使用する方法はありますか?

私が質問している理由は、次のコマンドを使用してすべての削除済みファイルを処理するためです。

git ls-files -d | xargs git rm

追跡されていないファイルについても同様のものを希望します。

git some-command --some-options | xargs git add

-oオプションを見つけることができましたが、git ls-files無視されたファイルも表示されるため、これは私が望んでいることではありません。また、次の長くて醜いコマンドを思いつくことができました。

git status --porcelain | grep '^??' | cut -c4- | xargs git add

ここで使用できるより良いコマンドがあるようです。ない場合は、どうすればカスタムgitコマンドを作成できますか?


なぜ必要なのgit ls-files -d | xargs git rmですか?
takeshin

これにより、git通知が欠落しているすべてのファイルが削除されます。私の質問は、関連する操作を行う方法についてでした-gitが現在追跡していないすべてのファイルを追加します。私は通常、コードファイルの名前変更、結合、および/または分割を行った後、これらの両方を実行します。
私たちは全員モニカです。

それらが欠落している場合は、すでに削除されていませんか?あなたが別の場所から引っ張って、リモートと同期しようとしているのでなければ...私はそれを理解していると思います。
バトルButkus

私はすべての回答をテストしましたが、追跡されていない空のフォルダーがある場合、誰もそれを見つけることができません。
kittygirl

@kittygirlこれは正しいです。gitはファイルでのみ機能するため、空のフォルダを追跡する方法はありません。find . -type d -empty代わりに試してください。
私たちは全員モニカです

回答:


529

追跡されていないファイルを一覧表示するには:

git ls-files --others --exclude-standard

出力をにパイプする必要がある場合xargsは、git ls-files -zand を使用して空白を気にするのが賢明ですxargs -0

git ls-files -z -o --exclude-standard | xargs -0 git add

追跡されていないファイルを追加するための素晴らしいエイリアス:

au = !git add $(git ls-files -o --exclude-standard)

編集:参考のために:git-ls-files


7
パーフェクト!!エイリアス行の最初の意味は何ですか?それはどこに文書化されていますか?
私たちは全員モニカです。

@takeshin親ディレクトリ名のみを取得する方法は?サブフォルダではありません。これらの追跡されていないファイルの意味:/ P / a / files、/ P / a / images、/ P / a / / P
/、...-/

2
しかし、どのような状況でエイリアスが必要ですか?git add *同じことを行います:標準を除くすべての追跡されていないファイルを追加します(パスがでカバーされているファイル.gitignore)。
toinetoine 2017

1
私はエイリアスがリポジトリのすべてのディレクトリで一貫して機能することを好みます(ls-filesコマンドは現在のツリーで変更されたファイルのみを表示します)。 [alias] lso = "!f() { cd $(git rev-parse --show-toplevel); git ls-files -o; }; f"
qneill

ありがとう。良いコメント。
Darth Egregious

71

追跡されていないファイルを削除する場合は、次のようにします。

git clean -df

x特に無視されたファイルも含める場合は、これに追加します。私が使用して多くのことを一日中。git clean -dfx

呼び出されるスクリプトを記述git-whateverしてパスに含めるだけで、カスタムgitを作成できます。


追跡されていないファイルすべて追加するのが一般的です(たとえば、移動した後など)。いずれにせよ、カスタムコマンドに関するヒントをありがとう。そのメカニズムはどこに文書化されていますか?
私たちは全員モニカです

5
やるgit add -Agit add -u(どちらがあなたにとってより意味があるかに応じて)
ダスティン

1
あなたのコメントは本当の答えです。これは、後で@Mike Lococoによっても繰り返されます
andho

2
そして「git clean -dfxn」は、「n」を追加してドライランを実行します
charo

50

git add -A -nあなたがしたいことをします。-A、レポにすべての人跡未踏のファイルを追加する-nことになりdry-run、追加が行われていないが、ステータス出力は、それぞれのファイルリスト与えられているでしょうが追加されましたが。


7
これは素晴らしい答えです!ファイル内の.gitignoreファイルは除外されることに注意してください。通常、これが必要ですが、そうでない場合はですgit add -fAn
cdunn2001 2013年

1
これが最良の答えのようです。
ロブ・グラント

1
これが最良の答えです。それはユーザーにそれを何をするか(明示的にそれを行わずに)明示的に伝え、実際に追加する前にレビューする機会を与えます。完璧です。ありがとう!
digitguy

変更されたファイルも一覧表示されます。
Frank-ReneSchäfer18年

いいですが、私はそれを包みます:add '$file'git ls-files --exclude-standard -o裸の出力を提供する一方で、熱くなります。
ハイパーパリウム

28

受け入れられた回答はスペースのあるファイル名でクラッシュします。現時点では、エイリアスコマンドを更新する方法がわからないので、改善されたバージョンをここに配置します。

git ls-files -z -o --exclude-standard | xargs -0 git add

これは正しい回答だと思います。これは、後でファイルにアクション(git addなど)を実行するための各ファイルのパスを提供するためです
Pablo Burgos

27

すべてが非常に簡単です

追跡されていないすべてのファイルのリストを取得するには、コマンドgit statusオプション-u(--untracked-files)を使用します。

git status -u

それの非再帰バージョンはどうですか?
David

残念ながら、.gitignoreファイルを通じて無視されたファイルもリストされます。
プラウフ

8
これは、最初のコミット時に無視されたファイルを示した唯一の回答ですが--ignoredgit status -uコマンドに追加しなければなりませんでした
DN

これはシンプルでいいです。
Eric Wang

1
これはまた、ショーでは、ファイルを変更しました。したがって、質問への回答ではなく、追跡されていないファイルのみを表示します。
ワイルドカード

6

追加する可能性のあるファイルを探すとき。からの出力git showはそれを行いますが、他の多くのものも含みます。次のコマンドは、ファイルの同じリストを取得するのに役立ちますが、他のすべてのものはありません。

 git status --porcelain | grep "^?? " | sed -e 's/^[?]* //'

これは、特定のパターンに一致するファイルを見つけるためにパイプラインで結合し、それをにパイプするときに役立ちますgit add

git status --porcelain | grep "^?? "  | sed -e 's/^[?]* //' | \
egrep "\.project$|\.settings$\.classfile$" | xargs -n1 git add

6

私は古い質問を知っていますが、追跡されていないファイルを一覧表示するという点では、追跡されていないフォルダーも一覧表示する別のファイルを追加すると思いました。

-n(ドライラン)を指定したgit clean操作を使用して、削除するファイル(.gitignoreファイルを含む)を次の方法で表示できます。

git clean -xdn

これには、すべてのファイルすべてのフォルダを表示できるという利点があります追跡されていないを。パラメーター:

  • x -すべての追跡されていないファイルを表示します(ビルド出力などのgitおよび他のユーザーによって無視されたファイルを含む)
  • d -追跡されていないディレクトリを表示する
  • n-そして最も重要なこと!-ドライラン、つまり実際には何も削除せず、クリーンメカニズムを使用して結果を表示します。

を忘れてしまった場合に、このようにするのは少し安全ではありません-n。だから私は通常、それをgit configでエイリアスします。


2

私がチェックした以前のすべての回答も、コミットされるファイルをリストします。これは、まだリポジトリに存在せず、の対象ではないファイルのみを一覧表示するシンプルで簡単なソリューションです.gitignore

git status --porcelain | awk '/^\?\?/ { print $2; }'

または

git status --porcelain | grep -v '\?\?'

これは、名前にスペースが含まれているファイルではうまく機能しないようです
ssc

-2

これは本来のポスターと同じものになると思います:

git add .


2
あなたがするたびgit/svn add .に、子猫は死にます。
Nakilon 2013

えーと、リモートブランチのローカルコピーに大量の残骸がある場合のみ;)ローカルブランチを作成すればgit add .、免責ができます。
Tim Fulmer 2013

@Nakilon、それがあなたが.gitignore適切に設定する理由です。git add .ただし、それでも避けてください。良いですgit add -u
ワイルドカード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.