Git 서브 모듈은 새로운 커밋을 보여주고, 서브 모듈 상태는 커밋 할 것이 없다고 말합니다


47

git 리포지토리에서 github 리포지토리를 참조하도록 .gitmodules 파일을 설정했습니다.

[submodule "src/repo"]
    path = src/repo
    url = repourl

이 리포지토리에서 '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:   src/repo (new commits)

repo에서 src / repo 및 git status로 cd하면 커밋 할 것이 없다고 말합니다.

최상위 git repo가 ​​왜 불평합니까?

답변:


42

분기 또는 태그가 아닌 커밋하는 Git 레코드 (SHA-1 해시로 표시된 하나의 커밋)는 각 하위 모듈에 대해 체크 아웃해야하기 때문입니다. 하위 모듈 디렉토리에서 무언가를 변경하면, Git은이를 감지하고 최상위 레포지토리에서 해당 변경 사항을 커밋하도록 촉구합니다.

git diff최상위 레벨 저장소에서 실행 하여 실제로 Git이 생각한 변경 사항을 표시하십시오. 하위 모듈에서 이미 커밋을 한 경우 (서브 모듈에서 "깨끗한") 하위 모듈의 해시 변경을보고합니다.

$ git diff
diff --git a/src/repo b/src/repo
index b0c86e2..a893d84 160000
--- a/src/repo
+++ b/src/repo
@@ -1 +1 @@
-Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea
+Subproject commit a893d84d323cf411eadf19569d90779610b10280

그렇지 않으면 -dirty최상위 저장소에서 스테이징 또는 커밋 할 수없는 해시 변경이 표시 됩니다. git status또한 서브 모듈이 추적되지 않거나 수정 된 컨텐츠를 가지고 있다고 주장합니다.

$ git diff
diff --git a/src/repo b/src/repo
--- a/src/repo
+++ b/src/repo
@@ -1 +1 @@
-Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea
+Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea-dirty

$ git status
On branch 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)
  (commit or discard the untracked or modified content in submodules)

    modified:   src/repo (untracked content)

no changes added to commit (use "git add" and/or "git commit -a")

서브 모듈에 대해 어떤 커밋 레코드를 체크 아웃해야하는지 업데이트하려면 서브 모듈의 변경 사항을 커밋하는 것 외에도 서브 모듈을 커밋해야합니다.

git add src/repo

1
메인 리포지토리에 커밋을 추가하지 않으려면 어떻게해야합니까? 내 유스 케이스는-기본 저장소가 있고 저장소 인 GitHub 및 Bitbucket에서 Wiki도 있습니다. 이제 wiki디렉토리 위키 에서 하위 모듈로를 추가했습니다 . 메인 / 코드 리포지토리에 변경 내용 wiki(예 : wiki 디렉토리)을 반영 하고 싶지 않습니다 . 기본 리포지토리에 .gitmodules 경로 를 추가해야합니까 .gitignore? 어떻게해야합니까?
yadav_vi

14
필자의 경우 메인 리포지토리에서 하위 모듈 자체를 업데이트하기 만하면됩니다. 뭔가 같은 :git submodule update src/repo
아구스틴 Amenabar

19

방금이 같은 종류의 문제에 부딪 쳤고 @AugustinAmenabar 가 제공하는 솔루션을 허용 된 답변의 의견 섹션에서 사용할 수있었습니다 . 설정이 조금 더 복잡 --recursive해서 모든 종속성을 최신 상태로 유지하기 위해 플래그를 추가했습니다 .

git submodule update src/repo --recursive

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.