source

패턴별로 파일을 재귀적으로 추가합니다.

manysource 2023. 7. 9. 11:16

패턴별로 파일을 재귀적으로 추가합니다.

다른 디렉토리에 있는 패턴(또는 글로벌)별로 파일을 재귀적으로 추가하려면 어떻게 해야 합니까?

예를 들어, 다음과 같이 추가합니다.A/B/C/foo.java그리고.D/E/F/bar.java하나의 명령으로 (및 기타 여러 Java 파일):

git add '*.java'

유감스럽게도, 그것은 예상대로 작동하지 않습니다.

사용할 수 있습니다.git add [path]/\*.java하위 디렉터리에서 Java 파일을 추가하려면,
예.git add ./\*.java현재 디렉터리에 대해.

설명서에서:

모두의 콘텐츠를 추가합니다.*.txt아래의 파일Documentation디렉터리 및 해당 하위 디렉터리:

$ git add Documentation/\*.txt

별표에 유의하십시오.*이 예에서는 셸에서 인용합니다. 이 명령을 사용하여 하위 디렉터리의 파일을 포함할 수 있습니다.Documentation/디렉토리입니다.

추가할 파일 중 일부가 아직 추적되지 않았다면 Sergio Acosta의 답변이 최선일 입니다.만약 당신이 Git가 이미 알고 있는 파일로 당신 자신을 제한하고 싶다면, 당신은 결합할 수 있습니다.git-ls-files필터 사용:

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

Git는 기본적으로 셸 문제이기 때문에 이것 자체를 수행하기 위한 어떤 멋진 메커니즘도 제공하지 않습니다. 주어진 명령에 대한 인수로 제공할 파일 목록을 어떻게 얻습니까?

와 함께zsh실행할 수 있습니다.

git add "**/*.java"

그리고 당신의 모든 것*.java파일이 재귀적으로 추가됩니다.

약간 엉뚱한 주제(특히 git 관련 항목은 아님)이지만 Linux/unix를 사용하는 경우 해결 방법은 다음과 같습니다.

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

또한 공백이 있는 경로가 필요한 경우:

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

하지만 그것이 정확히 당신이 요청한 것이 아니라는 것을 압니다.

세르게이의 대답은 효과가 있습니다.

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

최근의 기트로:

$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

이미 파일을 추적 중이고 파일을 변경한 경우 패턴을 기반으로 선택적으로 추가하려면--modified깃발

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

예를 들어, 이 커밋에 CSS 변경 사항만 추가하려는 경우 다음을 수행할 수 있습니다.

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

man git-ls-files더 많은 깃발을 위하여

여기에 언급되지 않았으므로 "매직 시그니처"도 고려하십시오.:/프로젝트 루트 아래에 일치하는 항목을 재귀적으로 추가합니다.

git add :/*.{java,pom}

발송처: https://stackoverflow.com/a/64210713/2586761

그냥 사용하기git add *\*.java루트 디렉터리와 모든 하위 디렉터리에 모든 .java 파일이 추가됩니다.

아직 언급되지 않은 윈도우즈 명령줄 솔루션 추가:

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

다음을 기반으로 특정 문자열이 있는 파일만 추가하고 싶었습니다.git status:

git status | grep string | xargs git add

그리고 나서 할 수 있었습니다.git commit -m 'commit msg파일 제목에 "string"이 있는 변경된 모든 파일을 커밋합니다.

"git: 만약 당신이 당신의 경로 사양 글로빙을 적절하게 탈출하거나 따옴표로 묶는다면, 어떻게 내가 디렉토리 하위 트리의 모든 파일을 재귀적으로 추가할 수 있습니까?"'*.java'), add), 면예그러, git add.'*.java'

Git 2.13(2017년 2분기)은 대화형 추가 기능을 개선했습니다.

제프 peff킹()의 커밋 7288e12(2017년 3월 14일)를 참조하십시오.
(주니오 C 하마노에 의해 합병 -- -- 153e0d7, 2017년 3월 17일 커밋)

add --interactive 규확지않으로 경로 규격을 ls-files

할 때, 가 제공한 정된파목로가면려먼수" " 자사가제경사확로다장니합을양한"로합니다.ls-files로 나온 로 " 런다음에 " 대로인 " 의수경 " 로을결 " 그합제 " 공록니 " 목과다 " 한런▁as "▁to▁of▁" " ▁the그▁and " 합에 " 의다니 " 공을로 " 제과로경다 "diff-index그리고 "diff-files".
경로 규격이 많은 경로로 확장되는 경우 다음 두 가지 문제 중 하나에 직면할 수 있습니다.

  1. OS는 인수 목록의 크기에 대해 불평하고 실행을 거부할 수 있습니다.예:

    $ (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저장소 - "드라이버" 디렉터리에 약 20,000개의 파일이 있습니다(이 경우 수정되지 않음)."ulimit -sLinux에서 그러한 거대한 경로 집합에 대해서도 문제를 보여주기 위해 트릭이 필요합니다.
다른 운영 체제는 훨씬 더 작은 제한을 갖습니다(예: OS X에서 5K 파일만 있는 실제 사례).

  1. 효과가 있을 때도 정말 느립니다.경로 규격 코드가 대량의 경로에 대해 최적화되지 않았습니다.다음은 제한이 없는 동일한 사례입니다.

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

우리는 건너뛰기를 통해 이를 개선할 수 있습니다.ls-files완전하게, 그리고 단지 diff 명령에 원래의 경로 사양을 공급합니다.

역사적으로 "가 지원하는 경로 지정 언어.diff-index더 약했지만, 더 이상 그렇지 않습니다.

~/.gitconfig에 줄 바꿈

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

과 같이 됩니다.git addt java

과 같이 하면 .git addt py

GNU make 파일에서 사용한 변형입니다.

.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 



언급URL : https://stackoverflow.com/questions/2855140/recursively-add-files-by-pattern