193

異なるディレクトリにあるパターン(またはグロブ)でファイルを再帰的に追加するにはどうすればよいですか?

A/B/C/foo.javaたとえば、1つのコマンドでとD/E/F/bar.java(および他のいくつかのJavaファイル)を追加したいと思います。

git add '*.java'

残念ながら、それは期待どおりに機能しません。

4

13 に答える 13

193

たとえば、現在のgit add [path]/\*.javaディレクトリなど、サブディレクトリからJavaファイルを追加するために使用できます。
git add ./\*.java

git addドキュメントから:

ディレクトリとそのサブディレクトリ*.txtの下にあるすべてのファイルからコンテンツを追加します。Documentation

$ git add Documentation/\*.txt

この例では、アスタリスク*がシェルから引用されていることに注意してください。これにより、コマンドにディレクトリのサブディレクトリからのファイルを含めることができますDocumentation/

于 2012-02-24T14:20:46.853 に答える
105

追加するファイルの一部がまだ追跡されていない可能性がある場合は、SergioAcostaの答えがおそらく最善の策です。gitがすでに知っているファイルに制限したい場合はgit-ls-files、フィルターと組み合わせることができます。

git ls-files [path] | grep '\.java$' | xargs git add

Gitは、基本的にシェルの問題であるため、これ自体を実行するための高度なメカニズムを提供していません。特定のコマンドの引数として提供するファイルのリストを取得するにはどうすればよいですか。

于 2010-05-18T13:57:44.407 に答える
76

あなたと一緒zshに実行することができます:

git add "**/*.java"

そして、すべての*.javaファイルが再帰的に追加されます。

于 2010-05-18T07:30:18.703 に答える
62

少し外れたトピック(特にgit関連ではありません)ですが、linux / unixを使用している場合、回避策は次のようになります。

find . -name '*.java' | xargs git add

また、スペースのあるパスが必要な場合:

find . -name '*.java' -print0 | xargs -0 git add

しかし、私はそれがあなたが尋ねたものと正確に一致しないことを知っています。

于 2010-05-18T07:15:29.187 に答える
12

セルゲイの答え(私を信用しないでください)は機能しています:

You can use git add [path]/\*.java

最近のgitで:

$git version
git version 1.7.3.4

テスト用のファイル:

$find -name .git -prune -o -type f -print | sort
./dirA/dirA-1/dirA-1-1/file1.txt
./dirA/dirA-1/dirA-1-2/file2.html
./dirA/dirA-1/dirA-1-2/file3.txt
./dirA/dirA-1/file4.txt
./dirB/dirB-1/dirB-1-1/file5.html
./dirB/dirB-1/dirB-1-1/file6.txt
./file7.txt

Gitステータス:

$git status -s
?? dirA/
?? dirB/
?? file7.txt

* .txtの追加:

$git add \*.txt

更新されたステータス:

$git status -s
A  dirA/dirA-1/dirA-1-1/file1.txt
A  dirA/dirA-1/dirA-1-2/file3.txt
A  dirA/dirA-1/file4.txt
A  dirB/dirB-1/dirB-1-1/file6.txt
A  file7.txt
?? dirA/dirA-1/dirA-1-2/file2.html
?? dirB/dirB-1/dirB-1-1/file5.html
于 2012-03-14T19:07:40.023 に答える
9

すでにファイルを追跡していて、ファイルに変更を加えた後、パターンに基づいてファイルを選択的に追加したい場合は、--modifiedフラグを使用できます。

git ls-files --modified | grep '<pattern>' | xargs git add

たとえば、CSSの変更のみをこのコミットに追加する場合は、次のことができます。

git ls-files --modified | grep '\.css$' | xargs git add

man git-ls-filesその他のフラグについては、を参照してください

于 2012-04-13T04:58:06.360 に答える
8

を使用するだけgit add *\*.javaです。これにより、ルートディレクトリとすべてのサブディレクトリにすべての.javaファイルが追加されます。

于 2017-12-20T13:40:42.487 に答える
6

ここでは言及されていないので、プロジェクトルートの下に一致するものを再帰的に追加するための「魔法の署名」も検討してください。:/

git add :/*.{java,pom}

送信先:https ://stackoverflow.com/a/64210713/2586761

于 2021-01-22T02:11:03.010 に答える
5

まだ言及されていないWindowsコマンドラインソリューションの追加:

for /f "delims=" %G in ('dir /b/s *.java') do @git add %G
于 2018-12-19T08:09:49.520 に答える
3

に基づいて特定の文字列を持つファイルのみを追加したかったgit status

git status | grep string | xargs git add

その後git commit -m 'commit msg、ファイルのタイトルに「文字列」が含まれるすべての変更されたファイルをコミットすることができました

于 2017-07-26T23:06:07.430 に答える
2

git:globパターンに一致するディレクトリサブツリー内のすべてのファイルを再帰的に追加するにはどうすればよいですか?」で述べたように、pathspec globbing(のように'*.java')を適切にエスケープまたは引用すると、はい、git add'*.java'

Git 2.13(2017年第2四半期)は、インタラクティブな追加の機能を改善します。

Jeff King()によるcommit 7288e12(2017年3月14日)を参照してください。濱野純雄による合併---コミット153e0d72017年3月17日peff
gitster

add --interactive:pathspecsを展開しないでくださいls-files

変更されたファイルのリストを取得する場合は、最初にユーザーが指定したパススペックを「ls-files」で展開し、結果のパスのリストを引数として「diff-index」と「diff-files」にフィードします。
pathspecが多数のパスに拡張される場合、次の2つの問題のいずれかに遭遇する可能性があります。

  1. OSは、引数リストのサイズについて不平を言い、実行を拒否する場合があります。例えば:

    $ (ulimit -s 128 && git add -p drivers)
    Can't exec "git": Argument list too long at .../git-add--interactive line 177.
    Died at .../git-add--interactive line 177.
    

これはlinux.gitリポジトリにあり、「drivers」ディレクトリに約20Kのファイルがあります(この場合はいずれも変更されていません)。このulimit -sような巨大なパスのセットであっても、Linuxで問題を示すには、「」トリックが必要です。
他のオペレーティングシステムには、はるかに小さな制限があります(たとえば、OS Xでは5Kファイルのみで実際のケースが見られました)。

  1. それが機能するときでさえ、それは本当に遅いです。pathspecコードは、膨大な数のパスに対して最適化されていません。これは、ulimitがない場合と同じです。

    $ time git add -p drivers
      No changes.
    
    real  0m16.559s
    user    0m53.140s
    sys 0m0.220s
    

これを改善するには、 " ls-files"を完全にスキップし、元のパススペックをdiffコマンドにフィードするだけです。

歴史的に、 ""でサポートされているpathspec言語diff-indexは弱かったのですが、もはやそうではありません。

于 2017-04-10T20:34:24.283 に答える
1

〜/.gitconfigに行を入れます

[alias] addt = !sh -c 'git ls-files | grep \"\\.$1*\" | xargs git add' -

変更されたすべてのJavaファイルを追加したい場合は、次のようにすることができます。 git addt java

同様に、変更されたすべてのPythonファイルを追加する場合は、次のようにすることができます。 git addt py

于 2019-06-09T06:51:30.090 に答える
0
GNUmakefileで使用したバリエーション

.PHONY: docs
docs:
    @echo docs
    bash -c "if pgrep MacDown; then pkill MacDown; fi"
    bash -c 'cat $(PWD)/HEADER.md                >  $(PWD)/README.md'
    bash -c 'cat $(PWD)/COMMANDS.md              >> $(PWD)/README.md'
    bash -c 'cat $(PWD)/FOOTER.md                >> $(PWD)/README.md'
    bash -c 'pandoc -s README.md -o index.html'
    bash -c "if hash open 2>/dev/null; then open README.md; fi || echo failed to open README.md"
    #git add --ignore-errors *.md
    git ls-files -co --exclude-standard | grep '\.md/$\' | xargs git 



于 2021-07-02T18:57:49.877 に答える