재귀 적으로 Git 업데이트 서브 모듈


284

내 프로젝트 구조

ProjectA
-FrameworkA (submodule)
--Twig (submodule of FrameworkA)

하위 모듈을 재귀 적으로 업데이트하려면 어떻게해야합니까? 이미 git 명령을 시도했습니다 (ProjectA 루트에서)

git submodule foreach git pull origin master

또는

git submodule foreach --recursive git pull origin master

Twig 파일은 가져올 수 없습니다.


방법에 대한 자식 깊이 ?
Mathew Kurian

답변:


609
git submodule update --recursive

--init 옵션을 사용하여 초기화되지 않은 하위 모듈을 초기화 할 수도 있습니다.

git submodule update --init --recursive

참고 : 일부 이전 버전의 Git에서이--init 옵션 을 사용하면 이미 초기화 된 하위 모듈이 업데이트되지 않을 수 있습니다. 이 경우 --init옵션 없이 명령을 실행해야합니다 .


1
재귀 추가 하위 모듈은 어떻습니까? "git submodule add FrameworkA.git"은 FrameworkA의 파일을 가져옵니다.
complez

2
"git submodule add blah"를 수행 한 다음 "git submodule update --init --recursive"를 수행하면됩니다.
drewag

아래의 방식과 다른가요?
William Entriken

3
@Irineau 이미 초기화 된 서브 모듈 --init이 사용되는 경우 업데이트되지 않는 참고 사항 이 Git 2.2.2에서의 경험과 일치하지 않습니다. 내가 사용할 때 올바른 커밋을 체크 아웃하여 이미 초기화 된 최상위 및 중첩 하위 모듈을 모두 보았 git submodule update --init --recursive으며 명령을 사용하거나 사용하지 않고 명령을 실행해야한다는 주장 --init은 단순히 잘못되었다고 생각합니다. 누군가가 이것이 동작이라는 증거를 보여 주거나 버전간에 변경되어 한 번 사실임을 증명할 수 없다면 완전히 편집 할 계획입니다.
Mark Amery 14

3
@ MarkAmery, 나는 이것이 기억할 수없는 일부 버전의 git에서 문제가 된 것을 기억합니다. 방금 1.9.3에서 테스트했지만 문제가 더 이상 존재하지 않는 것 같습니다. 모호한 "이전 버전"을 참조하도록 답변을 업데이트했습니다. 누구든지이 동작을 변경 한 버전을 지정할 수 있다면 좋을 것입니다.
drewag

35

내가 사용하는 방법은 다음과 같습니다

git submodule update --init --recursive
git submodule foreach --recursive git fetch
git submodule foreach git merge origin master

6
: 나는에 마지막 줄을 변화와 함께 일git submodule foreach git pull --ff-only origin master
길 라드 벨렉

2
또한 마지막 줄에 재귀를 추가합니다. "git submodule foreach --recursive git merge origin master"그렇지 않으면 자체적으로 하위 모듈을 업데이트했을 때 더티 하위 모듈을 얻을 수 있습니다.
Michael Scott Cuthbert 18

지난 3 시간 동안 이것을 찾고있었습니다. 감사합니다. 이것에 추가하기 위해 다음과 같은 커밋 명령을 사용할 수도 있습니다 git submodule foreach --recursive 'git commit -a | :'. 는 :상관없이 결과는 루프를 만든다. stackoverflow.com/questions/19728933/… 링크를 참조하십시오 .
Fledgling Pidgeon

17

하위 모듈의 기본 분기가 (내 경우에는 많이 발생 하지 않음) 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'

나는 일반적인 Makefile 에이 명령을 추가하려고 했지만 여전히 간단한 인용 부호 안에 있음에도 불구하고 GNU Make 가 $ (...) 시퀀스의 해석을 무시 하도록 만들었 습니다. 아무도 아이디어가 있습니까?
Sebastien Varrette

당신의 명령은 내가 필요한 것입니다 감사합니다! 그러나 나는 얻는다 : 하위 모듈은 Entering 'Core' fatal: ambiguous argument 'origin/HEAD': unknown revision or path not in the working tree.어디에 Core
있습니까

또한, 당신은이 의견을 이해해야한다고 생각합니다 stackoverflow.com/a/18008139/3383543
Ahmad AlMughrabi

재귀 옵션이 없으면 하위 모듈에 하위 모듈이 다시 포함되지 않은 경우에만 작동합니다.
erikbwork 08

15

최근 Git (v2.15.1을 사용하고 있습니다)에서 다음은 업스트림 하위 모듈 변경 사항을 하위 모듈에 재귀 적으로 병합합니다.

git submodule update --recursive --remote --merge

당신은 추가 할 수 --init있는 초기화되지 않은 서브 모듈 사용을 초기화--rebase 병합 대신 리베이스하려는 경우에 수 있습니다.

나중에 변경 사항을 커밋해야합니다.

git add . && git commit -m 'Update submodules to latest revisions'

이것, 나는 내가 잘못하고 있다고 생각했지만 당신의 대답은 저 git submodule update --remote my-dir/my-submodule에게도 잘 작동 한다는 것을 확인했습니다
iomv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.