我如何递归地通过位于不同目录的模式(或glob)添加文件?
例如,我想用一个命令添加A/B/C/foo.java和D/E/F/bar.java(以及其他几个java文件):
git add '*.java'
不幸的是,这并没有像预期的那样起作用。
我如何递归地通过位于不同目录的模式(或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 add [path]/\*.java从子目录中添加java文件, 例如,git为当前目录添加。/\*.java。
从git添加文档:
添加文档目录及其子目录下所有*.txt文件中的内容: $ git添加文档/\*.txt 注意,星号*引用自本例中的shell;这让该命令包含Documentation/ directory子目录中的文件。
如果要添加的一些文件可能还没有被跟踪,Sergio Acosta的答案可能是您的最佳选择。如果你想把自己限制在git已经知道的文件中,你可以把git-ls-files和一个过滤器结合起来:
git ls-files [path] | grep '\.java$' | xargs git add
Git本身并没有提供任何花哨的机制来实现这一点,因为它基本上是一个shell问题:如何获得作为给定命令的参数提供的文件列表。
用zsh你可以运行:
git add "**/*.java"
所有的*.java文件将被递归添加。
谢尔盖的回答(不要相信我)很管用:
可以使用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
由于这里没有提到,还可以考虑“魔术签名”:/来递归地添加项目根目录下的任何匹配项:
git add :/*.{java,pom}
Tx到:https://stackoverflow.com/a/64210713/2586761