按模式递归添加文件

时间:2010-05-18 07:11:40

标签: git glob filepattern

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

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

git add '*.java'

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

13 个答案:

答案 0 :(得分:133)

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

来自git add documentation

  

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

$ git add Documentation/\*.txt
     

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

答案 1 :(得分:76)

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

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

Git本身并没有提供任何奇特的机制,因为它基本上是一个shell问题:如何获得一个文件列表作为给定命令的参数提供。

答案 2 :(得分:51)

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

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

如果您希望路径包含空格:

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

但我知道这并不是你所要求的。

答案 3 :(得分:48)

使用zsh,您可以运行:

git add "**/*.java"

将以递归方式添加所有*.java个文件。

答案 4 :(得分:12)

Sergey's answer(不要相信我)正在运作:

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

答案 5 :(得分:7)

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

git ls-files --modified | grep '<pattern>' | xargs git add

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

git ls-files --modified | grep '\.css$' | xargs git add

有关更多标记,请参阅man git-ls-files

答案 6 :(得分:4)

由于此处未提及,还请考虑使用“magic signature:/ 以递归方式在项目根目录下添加任何匹配项:

git add :/*.{java,pom}

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

答案 7 :(得分:2)

正如&#34; git: How do I recursively add all files in a directory subtree that match a glob pattern?&#34;中提到的,如果你正确地逃脱或引用你的pathspec globbing(如'*.java'),那么是的,git add '*.java'

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

commit 7288e12Jeff King (peff)(2017年3月14日) Junio C Hamano -- gitster --于2017年3月17日commit 153e0d7合并)

  

add --interactive:不要使用ls-files

扩展pathspecs      

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

     
      
  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.
    
  2.         

    linux.git存储库上的内容,其中&#34;驱动程序&#34;中包含大约20K个文件。目录(在这种情况下没有修改过)。 &#34; ulimit -s&#34;即使对于如此庞大的一系列路径,在Linux上显示问题也是必要的   其他操作系统的限制要小得多(例如,OS X上只有5K文件就会出现真实案例)。

         
        
    1. 即使它确实有效,但它确实很慢。路径规范    代码未针对大量路径进行优化。这里&#39; S    相同的情况没有ulimit:

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

      我们可以通过跳过&#34; ls-files&#34;来改进这一点。完全,只是将原始的pathspecs提供给diff命令。

历史上&#34; diff-index&#34;支持的pathspec语言是较弱的,但现在已经不是这样了。

答案 8 :(得分:2)

我只想添加基于git status的某个字符串的文件:

git status | grep string | xargs git add

然后能够git commit -m 'commit msg使用&#34; string&#34;提交所有已更改的文件在文件的标题

答案 9 :(得分:2)

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

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

答案 10 :(得分:1)

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

答案 11 :(得分:0)

将行放入〜/ .gitconfig

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

如果要添加所有修改过的java文件,可以这样做: git addt java

同样,如果要添加所有修改后的python文件,可以执行以下操作: git addt py

答案 12 :(得分: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