etc./StackOverFlow

모든 git 하위 모듈의 최신 버전을 가져오는 쉬운 방법

청렴결백한 만능 재주꾼 2021. 12. 2. 00:26
반응형

질문자 :Brad Robinson


우리는 git 하위 모듈을 사용하여 우리가 개발한 많은 다른 라이브러리에 종속된 몇 가지 대규모 프로젝트를 관리하고 있습니다. 각 라이브러리는 종속 프로젝트에 하위 모듈로 가져온 별도의 저장소입니다. 개발하는 동안 우리는 종종 모든 종속 하위 모듈의 최신 버전을 얻으려고 합니다.

git에 이 작업을 수행하는 명령이 내장되어 있습니까? 그렇지 않은 경우 Windows 배치 파일 또는 이와 유사한 작업을 수행할 수 있습니까?



저장소를 처음 체크아웃하는 경우 --init 먼저 사용해야 합니다.

 git submodule update --init --recursive

git 1.8.2 이상의 경우 원격 분기의 최신 팁 업데이트를 지원하기 위해 --remote

 git submodule update --recursive --remote

.gitmodules 또는 .git/config 파일에 지정된 "기본이 아닌" 분기를 존중하는 추가 이점이 있습니다(있는 경우 기본값은 origin/master입니다. 이 경우 여기의 다른 답변 중 일부는 다음과 같이 작동합니다. 잘).

git 1.7.3 이상의 경우 다음을 사용할 수 있습니다.

 git submodule update --recursive

또는:

 git pull --recurse-submodules

리포지토리가 가리키는 현재 커밋 대신 하위 모듈을 최신 커밋으로 가져오려는 경우.

자세한 내용은 git-submodule(1) 을 참조하세요.


Henrik Gustafsson

git pull --recurse-submodules --jobs=10

1.8.5에서 처음 배운 기능 git.

버그 가 수정될 때까지 처음으로 실행해야 합니다.

git 하위 모듈 업데이트 --init --recursive


Alexander Bartosh

init에서 다음 명령을 실행합니다.

 git submodule update --init --recursive

git repo 디렉토리 내에서 가장 잘 작동합니다.

이것은 하위 모듈을 포함한 모든 최신 항목을 가져옵니다.

설명

 git - the base command to perform any git command submodule - Inspects, updates and manages submodules. update - Update the registered submodules to match what the superproject expects by cloning missing submodules and updating the working tree of the submodules. The "updating" can be done in several ways depending on command line options and the value of submodule.<name>.update configuration variable. --init without the explicit init step if you do not intend to customize any submodule locations. --recursive is specified, this command will recurse into the registered submodules, and update any nested submodules within.

이 후에 다음을 실행할 수 있습니다.

 git submodule update --recursive

git repo 디렉토리 내에서 가장 잘 작동합니다.

이것은 하위 모듈을 포함한 모든 최신 항목을 가져옵니다.


abc123

참고: 이것은 2009년의 것이며 당시에는 좋았을 수도 있지만 지금은 더 나은 옵션이 있습니다.

우리는 이것을 사용합니다. git-pup 이라고 합니다.

 #!/bin/bash # Exists to fully update the git repo that you are sitting in... git pull && git submodule init && git submodule update && git submodule status

적당한 bin 디렉토리(/usr/local/bin)에 넣으면 됩니다. Windows에서 작동하려면 구문을 수정해야 할 수도 있습니다. :)

업데이트:

모든 하위 모듈의 모든 HEAD를 가져오는 것에 대한 원래 작성자의 의견에 대한 응답으로 -- 좋은 질문입니다.

git 내부적으로 이에 대한 명령이 없다고 확신합니다. 그렇게 하려면 HEAD가 실제로 하위 모듈을 위한 것인지 식별해야 합니다. master 가 가장 최신 브랜치라고 말하는 것처럼 간단할 수 있습니다.

그런 다음 다음을 수행하는 간단한 스크립트를 만듭니다.

  1. "수정된" 리포지토리에 대한 git submodule status 를 확인합니다. 출력 라인의 첫 번째 문자는 이것을 나타냅니다. 하위 리포지토리가 수정된 경우 계속 진행하고 싶지 않을 수 있습니다.
  2. 나열된 각 리포지토리에 대해 해당 디렉터리로 cd하고 git checkout master && git pull 합니다. 오류를 확인하십시오.
  3. 마지막으로 하위 모듈의 현재 상태를 표시하기 위해 사용자에게 디스플레이를 인쇄할 것을 제안합니다. 아마도 모두 추가하고 커밋하라는 메시지를 표시할까요?

이 스타일은 실제로 git 하위 모듈이 설계된 목적이 아니라는 점을 언급하고 싶습니다. 일반적으로 "LibraryX"는 버전 "2.32"이며 "업그레이드"라고 말할 때까지 그대로 유지됩니다.

즉, 어떤 의미에서는 설명된 스크립트로 수행하는 작업이지만 더 자동입니다. 케어가 필요합니다!

업데이트 2:

Windows 플랫폼을 사용하는 경우 Python을 사용하여 이러한 영역에서 매우 뛰어난 스크립트를 구현할 수 있습니다. 유닉스/리눅스에 있다면 bash 스크립트만 제안합니다.

설명이 필요하십니까? 댓글을 달면 됩니다.


gahooa

Henrik은 올바른 길을 가고 있습니다. 'foreach' 명령은 임의의 쉘 스크립트를 실행할 수 있습니다. 가장 최신 정보를 가져오는 두 가지 옵션은

 git submodule foreach git pull origin master

그리고,

 git submodule foreach /path/to/some/cool/script.sh

초기화된 모든 하위 모듈을 반복하고 지정된 명령을 실행합니다.


mturquette

다음은 Windows에서 저에게 효과적이었습니다.

 git submodule init git submodule update

zachleat

처음으로

복제 및 초기화 하위 모듈

 git clone git@github.com:speedovation/kiwi-resources.git resources git submodule init

쉬다

개발하는 동안 하위 모듈을 끌어서 업데이트하십시오.

 git pull --recurse-submodules && git submodule update --recursive

원본에서 최신 커밋으로 Git 하위 모듈 업데이트

 git submodule foreach git pull origin master

선호하는 방법은 아래에 있어야 합니다

 git submodule update --remote --merge

참고: 마지막 두 명령의 동작은 동일합니다.


Yash

하위 모듈의 기본 분기가 master 가 아닐 수도 있으므로 전체 Git 하위 모듈 업그레이드를 자동화하는 방법은 다음과 같습니다.

 git submodule init git submodule update git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'

Sebastien Varrette

편집 :

의견에서 ( philfreo 에 의해) 최신 버전이 필요하다고 지적했습니다. 최신 버전이어야 하는 중첩된 하위 모듈이 있는 경우:

 git submodule foreach --recursive git pull

------아래에 오래된 주석-----

공식적으로 하는 방법 아닌가요?

 git submodule update --init

매번 사용합니다. 지금까지는 문제가 없습니다.

편집하다:

방금 다음을 사용할 수 있음을 발견했습니다.

 git submodule foreach --recursive git submodule update --init

또한 모든 하위 모듈, 즉 종속성을 재귀적으로 끌어옵니다.


antitoxic

어떤 버전의 git이 작동하는지 모르지만 이것이 당신이 찾고있는 것입니다.

 git submodule update --recursive

git pull 과 함께 사용하여 루트 저장소도 업데이트합니다.

 git pull && git submodule update --recursive

Jens Kohl

위의 답변은 좋지만 git-hooks를 사용하여 이를 더 쉽게 만들었습니다. 그러나 git 2.14 에서는 git config submodule.recurse 를 true로 설정하여 git 저장소로 가져올 때 하위 모듈이 업데이트되도록 할 수 있습니다.

이것은 분기에 있는 경우 모든 하위 모듈 변경 사항을 푸시하는 부작용이 있지만 해당 동작이 이미 필요한 경우 작업을 수행할 수 있습니다.

다음을 사용하여 수행할 수 있습니다.

 git config submodule.recurse true

JamesD

Windows 2.6.3 용 Git:

git submodule update --rebase --remote


seoul

나를 위해 git 2.24.03은 .gitmoodule에 정의된 원격 분기의 최신 커밋으로 업데이트됩니다.

git submodule update --recursive --init

git submodule update --recursive --remote

git 버전 2.24.3(Apple Git-128)

참고: 누군가 git pull --recurse-submodules git submodule update --recursive --remote 와 동일하다고 말했습니다. 그러나 내 테스트에서 git pull --recurse-submodules 는 .gitmoodule에 정의된 원격 분기의 최신 커밋으로 업데이트되지 않을 수 있습니다.


Francis Bacon

리포지토리의 최상위 수준에서:

 git submodule foreach git checkout develop git submodule foreach git pull

이렇게 하면 모든 분기가 최신 개발 및 가져오기로 전환됩니다.


Srayan Guhathakurta

나는 종종 이 명령을 사용하는데, 지금까지 작동합니다.

 git pull git submodule foreach --recursive git checkout master git submodule foreach --recursive git pull

이 더 빨리 바랍니다.


Binh Ho

gahooa 의 답변을 적용하여 이 작업을 수행했습니다.

[alias] 와 통합 ...

.gitmodules 다음과 같은 항목이 있는 경우:

 [submodule "opt/submodules/solarized"] path = opt/submodules/solarized url = git@github.com:altercation/solarized.git [submodule "opt/submodules/intellij-colors-solarized"] path = opt/submodules/intellij-colors-solarized url = git@github.com:jkaving/intellij-colors-solarized.git

.gitconfig 안에 이와 같은 것을 추가하십시오.

 [alias] updatesubs = "!sh -c \"git submodule init && git submodule update && git submodule status\" "

그런 다음 하위 모듈을 업데이트하려면 다음을 실행하십시오.

 git updatesubs

환경 설정 repo 에 예가 있습니다.


Tom

이제 간단한 git checkout

이 전역 구성을 통해 활성화해야 합니다. git config --global submodule.recurse true


Pellet

다음은 하위 모듈이든 아니든 모든 git 리포지토리에서 가져오는 명령줄입니다.

 ROOT=$(git rev-parse --show-toplevel 2> /dev/null) find "$ROOT" -name .git -type d -execdir git pull -v ';'

최상위 git 저장소에서 실행하는 경우 "$ROOT". .


kenorb

비고: 너무 쉬운 방법은 아니지만 실행 가능하며 고유한 장점이 있습니다.

저장소의 HEAD HEAD 만 복제하려는 경우(즉, "트렁크"를 체크아웃하기 위해) 다음 Lua 스크립트를 사용할 수 있습니다. 때때로 간단한 명령 git submodule update --init --recursive --remote --no-fetch --depth=1 복구할 수 없는 git 오류가 발생할 수 있습니다. .git/modules 디렉터리의 하위 디렉터리를 정리하고 git clone --separate-git-dir 명령을 사용하여 수동으로 하위 모듈을 복제해야 합니다. 유일한 복잡성은 URL , .git 디렉토리 경로 및 수퍼 프로젝트 트리에서 하위 모듈의 경로를 찾는 것입니다.

비고: 스크립트는 https://github.com/boostorg/boost.git 저장소에 대해서만 테스트됩니다. 특징: 동일한 호스트에서 호스팅되는 모든 하위 모듈과 .gitmodules 에는 상대 URL 만 포함됩니다.

 -- mkdir boost ; cd boost ; lua ../git-submodules-clone-HEAD.lua https://github.com/boostorg/boost.git . local module_url = arg[1] or 'https://github.com/boostorg/boost.git' local module = arg[2] or module_url:match('.+/([_%d%a]+)%.git') local branch = arg[3] or 'master' function execute(command) print('# ' .. command) return os.execute(command) end -- execute('rm -rf ' .. module) if not execute('git clone --single-branch --branch master --depth=1 ' .. module_url .. ' ' .. module) then io.stderr:write('can\'t clone repository from ' .. module_url .. ' to ' .. module .. '\n') return 1 end -- cd $module ; git submodule update --init --recursive --remote --no-fetch --depth=1 execute('mkdir -p ' .. module .. '/.git/modules') assert(io.input(module .. '/.gitmodules')) local lines = {} for line in io.lines() do table.insert(lines, line) end local submodule local path local submodule_url for _, line in ipairs(lines) do local submodule_ = line:match('^%[submodule %"([_%d%a]-)%"%]$') if submodule_ then submodule = submodule_ path = nil submodule_url = nil else local path_ = line:match('^%s*path = (.+)$') if path_ then path = path_ else submodule_url = line:match('^%s*url = (.+)$') end if submodule and path and submodule_url then -- execute('rm -rf ' .. path) local git_dir = module .. '/.git/modules/' .. path:match('^.-/(.+)$') -- execute('rm -rf ' .. git_dir) execute('mkdir -p $(dirname "' .. git_dir .. '")') if not execute('git clone --depth=1 --single-branch --branch=' .. branch .. ' --separate-git-dir ' .. git_dir .. ' ' .. module_url .. '/' .. submodule_url .. ' ' .. module .. '/' .. path) then io.stderr:write('can\'t clone submodule ' .. submodule .. '\n') return 1 end path = nil submodule_url = nil end end end

Tomilov Anatoliy

이렇게 하려면 스크립트를 작성해야 한다고 생각합니다. 솔직히 말해서, 나는 그래서 당신이 사용할 수있는 그것을 할 파이썬을 설치할 수 os.walkcd 각 디렉토리에 적절한 명령을 실행합니다. 파이썬이나 배치가 아닌 다른 스크립팅 언어를 사용하면 스크립트를 수정하지 않고도 하위 프로젝트를 쉽게 추가/제거할 수 있습니다.


baudtack

출처 : http:www.stackoverflow.com/questions/1030169/easy-way-to-pull-latest-of-all-git-submodules

반응형