재귀 적으로 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.