按模式递归添加文件

问题描述 投票:0回答:13

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

例如,我想使用一个命令添加

A/B/C/foo.java
D/E/F/bar.java
(以及其他几个 java 文件):

git add '*.java'

不幸的是,这并没有达到预期的效果。

git glob filepattern
13个回答
213
投票

您可以使用

git add [path]/\*.java
从子目录添加java文件,
例如
git add ./\*.java
表示当前目录。

来自

git add
文档

添加

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

$ git add Documentation/\*.txt

请注意,本例中星号

*
是从 shell 中引用的;这使得命令包含
Documentation/
目录的子目录中的文件。


108
投票
如果某些要添加的文件可能尚未被跟踪,

Sergio Acosta 的答案可能是您最好的选择。如果你想限制自己使用 git 已经知道的文件,你可以将

git-ls-files
与过滤器结合起来:

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

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


92
投票

使用

zsh
你可以运行:

git add "**/*.java"

并且您的所有

*.java
文件都将递归添加。


65
投票

有点偏离主题(不是特别与 git 相关),但如果你使用的是 linux/unix,解决方法可能是:

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

如果您期望路径带有空格:

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

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


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 状态:

$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

10
投票

由于这里没有提到,还请考虑“magic签名

:/
以递归方式添加项目根目录下匹配的任何内容:

git add :/*.{java,pom}

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


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
了解更多标志


8
投票

只需使用

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


5
投票

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

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

3
投票

我只想添加具有基于

git status
的特定字符串的文件:

git status | grep string | xargs git add

然后能够

git commit -m 'commit msg
提交文件标题中带有“字符串”的所有已更改文件


2
投票

如“git:如何递归添加目录子树中与 glob 模式匹配的所有文件?”中提到的,如果您正确转义或引用路径规范通配符(如

'*.java'
),那么是的,git add
 '*.java'

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

请参阅 Jeff King (peff)

commit 7288e12(2017 年 3 月 14 日)。
(由 Junio C Hamano --
gitster
--
合并于 commit 153e0d7,2017 年 3 月 17 日)

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
存储库中,“drivers”目录中有大约 20K 个文件(在本例中没有一个文件被修改)。即使对于如此庞大的路径集,“
ulimit -s
”技巧对于在 Linux 上显示问题也是必要的。
其他操作系统的限制要小得多(例如,在 OS X 上看到的实际情况只有 5K 文件)。

  1. 即使它确实有效,它也非常慢。路径规范 代码未针对大量路径进行优化。这是 没有 ulimit 的相同情况:

    $ time git add -p drivers
      No changes.
    
    real  0m16.559s
    user    0m53.140s
    sys 0m0.220s
    

我们可以通过完全跳过“

ls-files
”来改进这一点,并将原始路径规范提供给 diff 命令。

历史上“

diff-index
”支持的路径规范语言较弱,但现在情况不再如此。


1
投票

将行放入〜/.gitconfig

[alias]
         addt = !sh -c 'git ls-files | grep \"\\.$1*\" | xargs git add' -

如果你想添加所有修改过的java文件可以这样做:

git addt java

同样,如果你想添加所有修改过的Python文件可以这样做:

git addt py


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 
© www.soinside.com 2019 - 2024. All rights reserved.