Recursively add files by pattern

前端 未结 11 1328
予麋鹿
予麋鹿 2020-11-28 18:18

How do I recursively add files by a pattern (or glob) located in different directories?

For example, I\'d like to add A/B/C/foo.java and D/E/F/bar

相关标签:
11条回答
  • 2020-11-28 18:48

    If you are already tracking your files and have made changes to them and now you want to add them selectively based on a pattern, you can use the --modified flag

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

    For example, if you only want to add the CSS changes to this commit, you can do

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

    See man git-ls-files for more flags

    0 讨论(0)
  • 2020-11-28 18:49

    I wanted to only add files that had a certain string based on git status:

    git status | grep string | xargs git add

    and then was able to git commit -m 'commit msg to commit all changed files with "string" in the title of the file

    0 讨论(0)
  • 2020-11-28 18:50

    Sergey's answer (don't credit me) is working:

    You can use git add [path]/\*.java
    

    with a recent git:

    $git version
    git version 1.7.3.4
    

    Files for the test:

    $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:

    $git status -s
    ?? dirA/
    ?? dirB/
    ?? file7.txt
    

    Adding *.txt:

    $git add \*.txt
    

    Updated status:

    $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
    
    0 讨论(0)
  • 2020-11-28 18:53

    As mentioned in "git: How do I recursively add all files in a directory subtree that match a glob pattern?", if you properly escape or quote your pathspec globbing (like '*.java'), then yes, git add '*.java'

    Git 2.13 (Q2 2017) improves that for interactive add:

    See commit 7288e12 (14 Mar 2017) by Jeff King (peff).
    (Merged by Junio C Hamano -- gitster -- in commit 153e0d7, 17 Mar 2017)

    add --interactive: do not expand pathspecs with ls-files

    When we want to get the list of modified files, we first expand any user-provided pathspecs with "ls-files", and then feed the resulting list of paths as arguments to "diff-index" and "diff-files".
    If your pathspec expands into a large number of paths, you may run into one of two problems:

    1. The OS may complain about the size of the argument list, and refuse to run. For example:

      $ (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.
      

    That's on the linux.git repository, which has about 20K files in the "drivers" directory (none of them modified in this case). The "ulimit -s" trick is necessary to show the problem on Linux even for such a gigantic set of paths.
    Other operating systems have much smaller limits (e.g., a real-world case was seen with only 5K files on OS X).

    1. Even when it does work, it's really slow. The pathspec code is not optimized for huge numbers of paths. Here's the same case without the ulimit:

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

    We can improve this by skipping "ls-files" completely, and just feeding the original pathspecs to the diff commands.

    Historically the pathspec language supported by "diff-index" was weaker, but that is no longer the case.

    0 讨论(0)
  • 2020-11-28 18:54

    put line in ~/.gitconfig

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

    If you want to add all modified java file can just do: git addt java

    Samely, if you want to add all modified python file can just do: git addt py

    0 讨论(0)
提交回复
热议问题