programing

모든 하위 디렉터리에 대해 git 풀 실행

magicmemo 2023. 4. 11. 21:56
반응형

모든 하위 디렉터리에 대해 git 풀 실행

git 합니까?cd각 리포의 루트 디렉토리에 접속할 수 있습니까?아래는 모두 개별 git 저장소(서브모듈이 아님)입니다.

/plugins/cms
/plugins/admin
/plugins/chart

한 번에 업데이트하거나 최소한 현재 워크플로우를 단순화할 수 있습니다.

cd ~/plugins/admin
git pull origin master
cd ../chart
git pull

기타.

디렉토리에서 합니다.plugins 에러:

find . -type d -depth 1 -exec git --git-dir={}/.git --work-tree=$PWD/{} pull origin master \;

명확히 하기 위해:

  • find .는, 합니다.
  • -type d이 아닌 검색하다
  • -depth 1의 서브디렉토리1의 는, 「」를 참조해 주세요.
  • -exec {} \;는 검색마다 합니다.
  • git --git-dir={}/.git --work-tree=$PWD/{} pull.

find를 기기기 to to to to to to를 사용하는 것을 합니다.echo 후에-exec예를 들어 다음과 같습니다.

find . -type d -depth 1 -exec echo git --git-dir={}/.git --work-tree=$PWD/{} status \;

★★의 :-depth 1을 사용할 수 . 사용해보십시오. 시도해 보십시오.-mindepth 1 -maxdepth 1.

ls | xargs -I{} git -C {} pull

병렬로 하려면:

ls | xargs -P10 -I{} git -C {} pull

Leo의 솔루션보다 조금 더 낮은 기술:

for i in */.git; do ( echo $i; cd $i/..; git pull; ); done

그러면 작업 디렉토리에 있는 모든 Git 저장소가 업데이트됩니다.명시적으로 이름(cms, "admin", "chart")을 나열할 필요가 없습니다.cd 명령어는 서브셸에만 영향을 줍니다(괄호 사용).

에는 git repo를 실, 약, rep, 장, 장, 장, 장, 장, 장, 장, 장, 장, 장, 장, 은, 은, 은, actually, actually, actually, actually, actually, actually, actually, actually, actually, actually, actually, actually, actually, actually, actually, actually, actually, actually, actually, actually, actually, find다음 중 하나:

find . -type d -name .git -exec git --git-dir={} --work-tree=$PWD/{}/.. pull origin master \;

PowerShell은 다음과 같습니다.

Get-ChildItem -Recurse -Directory -Hidden -Filter .git | ForEach-Object { & git --git-dir="$($_.FullName)" --work-tree="$(Split-Path $_.FullName -Parent)" pull origin master }

이거 쓰겠습니다.

find . -name ".git" -type d | sed 's/\/.git//' |  xargs -P10 -I{} git -C {} pull

유니버설:현재 디렉토리 아래에 있는 모든 git 저장소를 업데이트합니다.

상위 5개의 답변 중 어느 것도 나에게 효과가 없었고, 그 질문은 디렉토리에 관한 것이었다.

이것은 효과가 있었다:

for d in *; do pushd $d && git pull && popd; done

cms, admin 및 차트가 모두 저장소의 일부인 경우 이 작업은 자동으로 수행됩니다.

이러한 플러그인이 각각 git 서브모듈이라는 문제가 있을 수 있습니다.

실행합니다.git help submodule자세한 정보는.

편집

bash에서 이 작업을 수행하는 경우:

cd plugins
for f in cms admin chart
do 
  cd $f && git pull origin master && cd ..
done

mr유틸리티(일명.k.a., )는 이 문제에 대한 뛰어난 해결책을 제공합니다.마음에 드는 패키지 매니저를 사용하여 설치하거나mr기투브에서 직접 대본을 써서 넣다$HOME/bin 다른 수도 있고PATHcdplugins는 폴더를 """를 ..mrconfig음음음음을을필필필필필필필필을을을을을을URL))

# File: .mrconfig
[cms]
checkout = git clone 'https://<username>@github.com/<username>/cms' 'cms'

[admin]
checkout = git clone 'https://<username>@github.com/<username>/admin' 'admin'

[chart]
checkout = git clone 'https://<username>@github.com/<username>/chart' 'chart'

다음에 '아, 아, 아, 아, 아, 아, 아, 아, 하다'를 실행하면 됩니다.mr up최고위층부터plugins각 저장소에서 업데이트를 가져올 폴더입니다(대상 작업 복사본이 아직 존재하지 않는 경우 초기 복제도 수행됩니다).실행할 수 있는 기타 명령어는 다음과 같습니다.mr st,mr push,mr log,mr diff, etc: 실행mr help가능한 것을 찾아보세요.이 있습니다.mr run에서 직접 지원되지 않는 VCS 명령에 액세스할 수 있도록 하는 패스스루 역할을 하는 명령어mr그 자체(예:mr run git tag STAGING_081220015또한 모든 저장소를 대상으로 셸 스크립트의 임의의 비트를 실행하는 커스텀명령어를 작성할 수도 있습니다.

mr는 여러 저장소를 처리하는 데 매우 유용한 도구입니다.그 이후로는plugins폴더는 홈디렉토리에 있습니다.에 관심이 있을 수도 있습니다.와 함께mr모든 컨피규레이션파일을 관리하기 위한 강력한 메커니즘을 제공합니다.개요에 대해서는, 토마스 페리스 니콜라이센의 블로그 투고를 참조해 주세요.

모든 서브디어가 git 저장소라고 가정하는 가장 콤팩트한 방법:

ls | parallel git -C {} pull

라고 하는 나의 겸손한 구조

  • 에 현재 경로를 나타냅니다(python을 사용하면 편리하고 기능합니다.파일 전체 경로를 얻는 방법 참조).
  • 직접 찾다.gitsubfolder(서브폴더): 비서브폴더에서 git 명령어를 내보낼 가능성이 낮다.
  • 몇 가지 경고를 없애다find

다음과 같습니다.

find . \
    -maxdepth 2 -type d \
    -name ".git" \
    -execdir python -c 'import os; print(os.path.abspath("."))' \; \
    -execdir git pull \;

물론 다른 git 명령어를 추가할 수도 있습니다.-execdir에서 "display"find예를 들어 브랜치를 표시합니다.

find . \
    -maxdepth 2 -type d \
    -name ".git" \
    -execdir python -c 'import os; print(os.path.abspath("."))' \; \
    -execdir git branch \;
    -execdir git pull \;

이거 드셔보세요

find . -type d -name .git -exec sh -c "cd \"{}\"/../ && pwd && git pull" \;

또한 & & 인수를 하나 더 추가하여 맞춤 출력을 추가할 수 있습니다.

find . -type d -name .git -exec sh -c "cd \"{}\"/../ && pwd && git pull && git status" \;

gitfox는 모든 입니다.

npm install gitfox -g
g pull

몇 가지 코멘트와 답변의 포인트를 정리했습니다.

find . -maxdepth 1 -type d -name .git -execdir git pull \;

나는 이것을 사용한다.

for dir in $(find . -name ".git")
do cd ${dir%/*}
    echo $PWD
    git pull
    echo ""
    cd - > /dev/null
done

깃헙

2010년 오리지널 답변:

이들 디렉토리가 모두 별도의 git repo일 경우 서브모듈로 참조해야 합니다.

'이 '원점이 '원점'이죠.plugins는 하위 대한 하고 있습니다.cms , ' , 'admin , ' , 'chart

A git pull에 '아예'가 붙습니다.git submodule update을 사용하다


2016년 1월 갱신:

2(2016년에서는 Git 2.8(2016년 1월)과 수 .git fetch --recurse-submodules -j2.
"git clone --recursive를 사용하여 git 서브모듈 다운로드 속도를 높이거나 병렬화하는 방법"을 참조하십시오.

git 저장소가 있는 서브디어가 많으면 병행 사용 가능

ls | parallel -I{} -j100 '
  if [ -d {}/.git ]; then
    echo Pulling {}
    git -C {} pull > /dev/null && echo "pulled" || echo "error :("
  else
     echo {} is not a .git directory
  fi
'

언급URL : https://stackoverflow.com/questions/3497123/run-git-pull-over-all-subdirectories

반응형