하위 모듈이 포함된 프로젝트가 있고 하위 모듈을 변경한 다음 해당 변경 사항을 커밋하면 기본 프로젝트에서 해당 하위 모듈에 "새 커밋"이 표시됩니다.
그러나 "git pull"을 수행하고 로컬 프로젝트를 업데이트하고 끌어오는 동안 하위 모듈 커밋이 변경되면 "git status"에도 "새 커밋"이 표시됩니다.
"새 커밋"이 "로컬 변경 사항을 커밋해야 함"을 의미하는지, 아니면 "업데이트해야 하는 새 참조로 업데이트했습니다"를 의미하는지 혼란스럽습니다.
"새 커밋"은 완전히 반대되는 두 가지 사실을 알려줄 수 있는 것 같습니다.
푸시해야 할 변경 사항이 있는지, 업데이트해야 할 새 참조가 있는지 최상위 수준에서 알 수 있는 더 좋은 방법이 있습니까?
답변1
내 생각에 당신이 보는 것은 이것이다:
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: sub (new commits)
no changes added to commit (use "git add" and/or "git commit -a")
이를 이해하려면 프로젝트에 하위 모듈을 넣을 때 git이 해당 하위 모듈이 복제된 위치를 추적할 뿐만 아니라 해당 하위 모듈의 최신(또는 선택된) 커밋 ID(예: HEAD)도 추적한다는 점을 알아야 합니다. 체크아웃할 때 특정 버전의 하위 모듈을 가져오도록 합니다. 그렇지 않은 경우 이전 버전의 코드를 확인할 때 호환되지 않는 버전의 하위 모듈을 가져올 수 있습니다.
Git은 하위 모듈의 HEAD 커밋 ID가 변경되었으며 해당 변경 사항을 상위 프로젝트에 커밋할 수 있음을 알려줍니다. 을 수행하면 git diff
변경된 커밋 ID가 표시됩니다(물론 ID는 달라집니다).
$ git diff
diff --git a/sub b/sub
index d67371f..07bc855 160000
--- a/sub
+++ b/sub
@@ -1 +1 @@
-Subproject commit d67371f7485a97dd4d00802619f93a0cb4d2df16
+Subproject commit 07bc855dd4d958783a686241b911aead1d73ca3c
그것은 중요하지 않습니다왜하위 모듈 체크아웃의 HEAD 커밋 ID가 변경되었습니다. git pull
상위 프로젝트에 관한 한 하위 모듈의 새 버전을 가져오거나(예: 하위 모듈 디렉터리에서) 하위 모듈 디렉터리에서 로컬로 커밋하는 것은 동일한 작업을 수행합니다. 하위 모듈 HEAD 커밋 ID를 변경하기 위한 새로운 다중 커밋입니다.
답변2
내가 아는 한 mfurseman의 의견이 최선의 해결책입니다.
git submodule update --init --recursive