서브 모듈을 최신 커밋으로 업데이트 일부 클래스를 편집하고 원격 리포지토리를 푸시하여

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

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

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

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



답변

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

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

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


답변

git 1.8부터 할 수 있습니다

git submodule update --remote --merge

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

git commit

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


답변

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

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 foreach "(git checkout master; git pull; cd ..; git add '$path'; git commit -m 'Submodule Sync')"


답변

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

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

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

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


답변

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

git pull --rebase

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


답변

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

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