193

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

例如,我想用一个命令添加A/B/C/foo.javaD/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

请注意,*在此示例中,星号是从 shell 引用的;这让命令包含目录子目录中的Documentation/文件。

于 2012-02-24T14:20:46.853 回答
105

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

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

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

于 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 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 通配符(如'*.java'),那么是的,git add'*.java'

Git 2.13(2017 年第二季度)改进了交互式添加:

请参阅Jeff King ( )的提交 7288e12(2017 年 3 月 14 日) 。(由Junio C Hamano 合并——提交 153e0d7中,2017 年 3 月 17 日)peff
gitster

add --interactive:不要用ls-files

当我们想要获取修改文件的列表时,我们首先使用“ ls-files”扩展任何用户提供的路径规范,然后将生成的路径列表作为参数提供给“ diff-index”和“ diff-files”。
如果您的路径规范扩展到大量路径,您可能会遇到以下两个问题之一:

  1. 操作系统可能会抱怨参数列表的大小,并拒绝运行。例如:

    $ (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存储库中,“驱动程序”目录中有大约 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 回答