서브 모듈을 최신 커밋으로 업데이트


269

라이브러리 A 프로젝트 A가 있고 프로젝트 B에서 사용됩니다.

프로젝트 A와 B는 모두 github But에 별도의 저장소를 가지고 있으며 B 내부에는 A의 하위 모듈이 있습니다.

리포지토리 A에있는 라이브러리의 일부 클래스를 편집하고 원격 리포지토리를 푸시하여 라이브러리 (리포지토리 A)가 업데이트되었습니다.

이 업데이트는 하위 모듈이 이전 커밋을 참조하는 "참조"(하위 모듈)에 반영되지 않습니다. git에서 하위 모듈을 업데이트하려면 어떻게해야합니까?

답변:


358

서브 모듈 디렉토리를 입력하십시오.

cd projB/projA

프로젝트 A에서 리포지토리를 가져옵니다 ( 부모 B의 프로젝트 상태는 업데이트 되지 않음 ).

git pull origin master

루트 디렉토리로 돌아가서 업데이트 확인 :

cd ..
git status

하위 모듈이 이전에 업데이트 된 경우 다음과 같이 표시됩니다.

# Not currently on any branch.
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   projB/projA (new commits)
#

그런 다음 업데이트를 커밋하십시오.

git add projB/projA
git commit -m "projA submodule updated"

최신 정보

@paul이 지적했듯이 git 1.8부터 사용할 수 있습니다.

git submodule update --remote --merge

하위 모듈을 최신 원격 커밋으로 업데이트합니다. 대부분의 경우 편리합니다.


35
BTW, 서브 모듈의 소유자가 아닌 git submodule update경우 다른 누군가가 projA를 업데이트했을 때 할 수 있습니다 (새로운 커밋 ID를 얻습니다).
Kjuly

나는 서브 모듈 메인 repo (proj A)를 소유하고 있지만 나는 proj B의 커미터입니다.
fat

@Kjuly 커밋 후 어떻게 원격으로 푸시합니까? 그냥 git push?
KR29

1
@ KR29로, 전체 cmd는 git push <remote> <branch>예를 들어 git push origin dev입니다.
Kjuly

2
git submodule update커밋이 풀렸을 때 (프로젝터 B에서) 해당 서브 모듈 (프로젝터 A)에 대한 참조를 업데이트하는 경우에만 플래그없이 작동합니다. HEADproj A의 원격 추적 분기 를 참조하도록 proj B를 업데이트하려면 git submodule update --remote --merge아래의 Paul Hatcher의 답변에 표시된대로 수행하십시오.
Ben Burns

109

git 1.8부터 할 수 있습니다

git submodule update --remote --merge

서브 모듈을 최신 원격 커밋으로 업데이트합니다. 그런 다음 변경 사항을 커밋해야 부모 리포지토리의 gitlink가 업데이트됩니다.

git commit

그런 다음이 변경 사항을 적용하지 않으면 하위 모듈을 가리키는 SHA-1 ID가 업데이트되지 않으므로 변경 사항이 다른 사람에게 표시되지 않습니다.


비록 내가 git commit다른 사람을 하더라도 여전히 그것을 보지 못한다. On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: modified: SubmoduleA (new commits) modified: SubmoduleB (new commits)
Max N

1
커밋 후 "git push"를 수행 했습니까? commit은 로컬 저장소 만 변경한다는 점을 명심하십시오. 다른 사람들이 볼 수 있도록 원격으로 푸시해야합니다.
Paul Hatcher

이 답변에서 누락되었지만 아래의 다른 답변에 언급되어 있습니다 git add. 커밋하기 전에 업데이트 된 하위 모듈을 준비해야합니다 .
joshng

1
@ joshng 나는 서브 모듈을 작업하는 시점에있는 모든 사람들이 그것을 이해할 것이라고 생각합니다. 이것은 매우 도움이 된 유일한 게시물입니다.
Husk Rekoms

38

서브 모듈을 업데이트하고 커밋하는 경우 포함 또는 상위 레벨 저장소로 이동하여 변경 사항을 추가해야합니다.

git status

다음과 같은 내용이 표시됩니다.

modified:
   some/path/to/your/submodule

서브 모듈이 동기화되지 않았다는 사실은

git submodule

출력은 다음과 같이 표시됩니다 :

+afafaffa232452362634243523 some/path/to/your/submodule

더하기 (+)는 하위 모듈이 최상위 리포지토리가 가리키는 위치를 가리키고 있음을 나타냅니다.

이 변경 사항을 추가하기 만하면됩니다.

git add some/path/to/your/submodule

그리고 그것을 저 지르십시오 :

git commit -m "referenced newer version of my submodule"

변경 사항을 푸시 할 때 먼저 서브 모듈에서 변경 사항을 푸시 한 다음 외부 저장소에서 참조 변경 사항을 푸시하십시오. 이런 식으로 업데이트하는 사람들은 항상 성공적으로 실행할 수 있습니다

git submodule update

하위 모듈에 대한 자세한 내용은 http://progit.org/book/ch6-6.html 에서 확인할 수 있습니다 .


+를 실행할 때가 표시되지 않으면 git submodule서브 모듈을 초기화하고 가져 왔는지 확인하십시오. 이에 대한 명령은 각각 git submodule initgit submodule update입니다.
fureigh

19

한 줄 버전

git submodule foreach "(git checkout master; git pull; cd ..; git add '$path'; git commit -m 'Submodule Sync')"

2

다른 답변 중 일부는 서브 모듈의 디렉토리 내에서 병합 / 커밋을 권장하며, IMO는 약간 혼란 스러울 수 있습니다.

원격 서버의 이름이 지정 origin되었고 master하위 모듈 의 분기를 원한다고 가정하면 다음 을 사용하는 경향이 있습니다.

git submodule foreach "git fetch && git reset --hard origin/master"

참고 : 각 하위 모듈에 대해 하드 리셋이 수행 --hard됩니다 --soft. 원하지 않는 경우로 변경할 수 있습니다 .


1

내 프로젝트는 하위 모듈에 '최신'을 사용해야합니다. Mac OSX 10.11, git 버전 2.7.1에서는 커밋을 수집하기 위해 하위 모듈 폴더로 'in'할 필요가 없었습니다. 난 그냥 정기적으로했다

git pull --rebase 

최상위 레벨에서 하위 모듈을 올바르게 업데이트했습니다.


0

Andy의 답변은 $ path를 피하여 나를 위해 일했습니다.

git submodule foreach "(git checkout master; git pull; cd ..; git add \$path; git commit -m 'Submodule Sync')"

@Andy Webov의 답변에 이스케이프 처리가 필요하지 않은 이유 는 경로 주위에 작은 따옴표를 사용했기 때문입니다. '$path'
S0AndS0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.