異なるディレクトリにあるパターン(またはグロブ)でファイルを再帰的に追加するにはどうすればよいですか?
A/B/C/foo.java
たとえば、1つのコマンドでとD/E/F/bar.java
(および他のいくつかのJavaファイル)を追加したいと思います。
git add '*.java'
残念ながら、それは期待どおりに機能しません。
異なるディレクトリにあるパターン(またはグロブ)でファイルを再帰的に追加するにはどうすればよいですか?
A/B/C/foo.java
たとえば、1つのコマンドでとD/E/F/bar.java
(および他のいくつかのJavaファイル)を追加したいと思います。
git add '*.java'
残念ながら、それは期待どおりに機能しません。
たとえば、現在のgit add [path]/\*.java
ディレクトリなど、サブディレクトリからJavaファイルを追加するために使用できます。git add ./\*.java
ディレクトリとそのサブディレクトリ
*.txt
の下にあるすべてのファイルからコンテンツを追加します。Documentation
$ git add Documentation/\*.txt
この例では、アスタリスク
*
がシェルから引用されていることに注意してください。これにより、コマンドにディレクトリのサブディレクトリからのファイルを含めることができますDocumentation/
。
追加するファイルの一部がまだ追跡されていない可能性がある場合は、SergioAcostaの答えがおそらく最善の策です。gitがすでに知っているファイルに制限したい場合はgit-ls-files
、フィルターと組み合わせることができます。
git ls-files [path] | grep '\.java$' | xargs git add
Gitは、基本的にシェルの問題であるため、これ自体を実行するための高度なメカニズムを提供していません。特定のコマンドの引数として提供するファイルのリストを取得するにはどうすればよいですか。
あなたと一緒zsh
に実行することができます:
git add "**/*.java"
そして、すべての*.java
ファイルが再帰的に追加されます。
少し外れたトピック(特にgit関連ではありません)ですが、linux / unixを使用している場合、回避策は次のようになります。
find . -name '*.java' | xargs git add
また、スペースのあるパスが必要な場合:
find . -name '*.java' -print0 | xargs -0 git add
しかし、私はそれがあなたが尋ねたものと正確に一致しないことを知っています。
セルゲイの答え(私を信用しないでください)は機能しています:
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
すでにファイルを追跡していて、ファイルに変更を加えた後、パターンに基づいてファイルを選択的に追加したい場合は、--modified
フラグを使用できます。
git ls-files --modified | grep '<pattern>' | xargs git add
たとえば、CSSの変更のみをこのコミットに追加する場合は、次のことができます。
git ls-files --modified | grep '\.css$' | xargs git add
man git-ls-files
その他のフラグについては、を参照してください
を使用するだけgit add *\*.java
です。これにより、ルートディレクトリとすべてのサブディレクトリにすべての.javaファイルが追加されます。
ここでは言及されていないので、プロジェクトルートの下に一致するものを再帰的に追加するための「魔法の署名」も検討してください。:/
git add :/*.{java,pom}
まだ言及されていないWindowsコマンドラインソリューションの追加:
for /f "delims=" %G in ('dir /b/s *.java') do @git add %G
に基づいて特定の文字列を持つファイルのみを追加したかったgit status
:
git status | grep string | xargs git add
その後git commit -m 'commit msg
、ファイルのタイトルに「文字列」が含まれるすべての変更されたファイルをコミットすることができました
「git:globパターンに一致するディレクトリサブツリー内のすべてのファイルを再帰的に追加するにはどうすればよいですか?」で述べたように、pathspec globbing(のように'*.java'
)を適切にエスケープまたは引用すると、はい、git add'*.java'
Git 2.13(2017年第2四半期)は、インタラクティブな追加の機能を改善します。
Jeff King()によるcommit 7288e12(2017年3月14日)を参照してください。(濱野純雄による合併---コミット153e0d7、2017年3月17日)peff
gitster
add --interactive
:pathspecsを展開しないでくださいls-files
変更されたファイルのリストを取得する場合は、最初にユーザーが指定したパススペックを「
ls-files
」で展開し、結果のパスのリストを引数として「diff-index
」と「diff-files
」にフィードします。
pathspecが多数のパスに拡張される場合、次の2つの問題のいずれかに遭遇する可能性があります。
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ファイルのみで実際のケースが見られました)。
それが機能するときでさえ、それは本当に遅いです。pathspecコードは、膨大な数のパスに対して最適化されていません。これは、ulimitがない場合と同じです。
$ time git add -p drivers No changes. real 0m16.559s user 0m53.140s sys 0m0.220s
これを改善するには、 "
ls-files
"を完全にスキップし、元のパススペックをdiffコマンドにフィードするだけです。
歴史的に、 ""でサポートされているpathspec言語diff-index
は弱かったのですが、もはやそうではありません。
〜/.gitconfigに行を入れます
[alias]
addt = !sh -c 'git ls-files | grep \"\\.$1*\" | xargs git add' -
変更されたすべてのJavaファイルを追加したい場合は、次のようにすることができます。
git addt java
同様に、変更されたすべてのPythonファイルを追加する場合は、次のようにすることができます。
git addt py
.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