按模式递归添加文件

Mic*_*mer 160 git glob filepattern

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

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

git add '*.java'
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不能按预期工作.

Ser*_*tov 147

您可以使用git add [path]/\*.java从子目录添加java文件,
例如git add ./\*.java当前目录.

来自git add文档:

添加目录及其子目录*.txt下的所有文件的内容Documentation:

$ git add Documentation/\*.txt
Run Code Online (Sandbox Code Playgroud)

请注意,*在此示例中引用了星号的星号; 这使命令包含Documentation/目录子目录中的文件.

  • 这是最好的解决方案,也适用于Windows. (7认同)
  • @MichelKrämer可能不是,但它现在. (2认同)
  • “星号 * 是从 shell 中引用的”。我想你的意思是“逃脱”。在任何情况下,反斜杠都会阻止 shell 扩展它。 (2认同)
  • @gwideman 我认为你是对的,但不是我。这是来自文档的引用 https://git-scm.com/docs/git-add#_examples (2认同)

Cas*_*bel 82

如果可能尚未跟踪某些要添加的文件,Sergio Acosta的回答可能是您最好的选择.如果你想限制自己已经知道的文件,你可以结合git-ls-files过滤器:

git ls-files [path] | grep '\.java$' | xargs git add
Run Code Online (Sandbox Code Playgroud)

Git没有提供任何花哨的机制来执行此操作,因为它基本上是一个shell问题:如何获取要作为给定命令的参数提供的文件列表.

  • 谢谢!我稍微改进了你的命令,现在它正在做我想要的:`git ls-files -co --exclude-standard | grep'\ .java $'| xargs git add` (5认同)

Ser*_*sta 54

有点偏离主题(不是专门与git相关)但是如果你在linux/unix上有一个解决方法可能是:

find . -name '*.java' | xargs git add
Run Code Online (Sandbox Code Playgroud)

如果你期望路径有空格:

find . -name '*.java' -print0 | xargs -0 git add
Run Code Online (Sandbox Code Playgroud)

但我知道这不完全是你问的.

  • 这种方法的一个小问题 - 如果你"找到"与.gitignore相匹配的文件,那么git会抱怨你正在尝试添加一个你告诉它忽略的文件. (6认同)
  • @Maslow,强行添加文件,即使它应该被忽略(基于.gitignore).我更愿意收到投诉,而不是添加文件(这是默认行为.) (5认同)
  • @yoyo - 我刚刚添加了-f,这就解决了这个问题 (2认同)

Oli*_*ier 52

有了zsh你可以运行:

git add "**/*.java"
Run Code Online (Sandbox Code Playgroud)

并且所有*.java文件都将以递归方式添加.

  • 嗯,我看到 Windows 有一个 `zsh` shell...使用它而不是 bash 会对你自己有好处,恕我直言。 (2认同)

Alb*_*rto 12

谢尔盖的回答(不要相信我)正在发挥作用:

You can use git add [path]/\*.java
Run Code Online (Sandbox Code Playgroud)

最近的一个git:

$git version
git version 1.7.3.4
Run Code Online (Sandbox Code Playgroud)

测试文件:

$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
Run Code Online (Sandbox Code Playgroud)

Git状态:

$git status -s
?? dirA/
?? dirB/
?? file7.txt
Run Code Online (Sandbox Code Playgroud)

添加*.txt:

$git add \*.txt
Run Code Online (Sandbox Code Playgroud)

更新状态:

$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
Run Code Online (Sandbox Code Playgroud)


pti*_*tim 10

由于这里没有提到,还请考虑“魔术签名:/以递归方式添加项目根目录下匹配的任何内容:

git add :/*.{java,pom}
Run Code Online (Sandbox Code Playgroud)

发送至:https ://stackoverflow.com/a/64210713/2586761


小智 8

只需使用git add *\*.java. 这将添加根目录和所有子目录中的所有 .java 文件。


Ram*_*Ram 7

如果您已经在跟踪文件并对其进行了更改,现在您想根据模式选择性地添加它们,则可以使用该--modified标志

git ls-files --modified | grep '<pattern>' | xargs git add
Run Code Online (Sandbox Code Playgroud)

例如,如果您只想将CSS更改添加到此提交,则可以执行此操作

git ls-files --modified | grep '\.css$' | xargs git add
Run Code Online (Sandbox Code Playgroud)

请参阅man git-ls-files更多标志


sel*_*rer 5

添加尚未提及的 Windows 命令行解决方案:

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