我如何递归地通过位于不同目录的模式(或glob)添加文件?

例如,我想用一个命令添加A/B/C/foo.java和D/E/F/bar.java(以及其他几个java文件):

git add '*.java'

不幸的是,这并没有像预期的那样起作用。


当前回答

有点偏离主题(不是特别与git相关),但如果你在linux/unix上,一个变通方法可以是:

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

如果你期望路径有空格

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

但我知道这不是你想要的。

其他回答

有点偏离主题(不是特别与git相关),但如果你在linux/unix上,一个变通方法可以是:

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

如果你期望路径有空格

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

但我知道这不是你想要的。

添加一个之前没有提到的Windows命令行解决方案:

for /f "delims=" %G in ('dir /b/s *.java') do @git add %G

用zsh你可以运行:

git add "**/*.java"

所有的*.java文件将被递归添加。

如果您已经在跟踪文件并对其进行了更改,现在您想根据模式有选择地添加它们,您可以使用——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 [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 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