서브 모듈의 리포지토리에 사용하려는 커밋이 포함되어 있다고 가정하면 (수퍼 프로젝트의 현재 상태에서 참조되는 커밋과 달리) 두 가지 방법이 있습니다.
첫 번째는 사용하려는 서브 모듈의 커밋을 이미 알고 있어야합니다. 하위 모듈을 직접 조정 한 다음 수퍼 프로젝트를 업데이트하여 "내부, 외부"에서 작동합니다. 두 번째는“외부에서”서브 모듈을 수정 한 수퍼 프로젝트의 커밋을 찾은 다음 다른 서브 모듈 커밋을 참조하도록 수퍼 프로젝트의 인덱스를 재설정하여 작동합니다.
뒤집어서
당신이 이미 알고있는 경우에는 사용에 서브 모듈, 원하는 커밋 된 cd다음, 당신이 원하는 커밋 체크 아웃, 서브 모듈로를 git add하고 git commit는 다시 슈퍼 프로젝트이다.
예:
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
하위 모듈에서 게시되지 않은 커밋을 나타내는 수퍼 프로젝트 커밋을 만들었습니다 sub. 어쨌든 우리는 이미 서브 모듈이 커밋되기를 원한다는 것을 알고 있습니다 5d5a3ee314476701a20f2c6ec4a53f88d651df6c. 거기 가서 직접 확인하십시오.
서브 모듈에서 체크 아웃
$ cd sub
$ git checkout 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
Note: moving to '5d5a3ee314476701a20f2c6ec4a53f88d651df6c' which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
git checkout -b <new_branch_name>
HEAD is now at 5d5a3ee... quux
$ cd ..
커밋을 체크 아웃하기 때문에 서브 모듈에서 HEAD가 분리됩니다. 서브 모듈이 브랜치를 사용하고 있는지 확인 git checkout -b newbranch <commit>하려면 커밋에서 브랜치를 생성 및 체크 아웃하거나 원하는 브랜치를 체크 아웃하십시오 (예 : 원하는 커밋이있는 브랜치).
슈퍼 프로젝트 업데이트
하위 모듈의 체크 아웃은 작업 트리 변경으로 수퍼 프로젝트에 반영됩니다. 따라서 우리는 수퍼 프로젝트의 색인 변경을 준비하고 결과를 검증해야합니다.
$ git add sub
결과 확인
$ git submodule update
$ git diff
$ git diff --cached
diff --git c/sub i/sub
index e47c0a1..5d5a3ee 160000
--- c/sub
+++ i/sub
@@ -1 +1 @@
-Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
서브 모듈이 이미 지정된 커밋에 있으므로 서브 모듈 업데이트가 자동입니다. 첫 번째 diff는 인덱스와 작업 트리가 동일 함을 보여줍니다. 세 번째 차이점은 단계적 변경 만이 sub서브 모듈을 다른 커밋으로 옮기는 것임을 보여줍니다 .
범하다
git commit
이것은 고정 서브 모듈 엔트리를 커밋한다.
밖에서
서브 모듈에서 어떤 커밋을 사용해야하는지 확실하지 않은 경우 수퍼 프로젝트의 히스토리를보고 안내 할 수 있습니다. 수퍼 프로젝트에서 직접 재설정을 관리 할 수도 있습니다.
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
위와 같은 상황입니다. 그러나 이번에는 서브 모듈에 담그지 않고 수퍼 프로젝트에서 수정하는 데 중점을 둘 것입니다.
슈퍼 프로젝트의 Errant Commit 찾기
$ git log --oneline -p -- sub
ce5d37c local change in sub
diff --git a/sub b/sub
index 5d5a3ee..e47c0a1 160000
--- a/sub
+++ b/sub
@@ -1 +1 @@
-Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
+Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
bca4663 added sub
diff --git a/sub b/sub
new file mode 160000
index 0000000..5d5a3ee
--- /dev/null
+++ b/sub
@@ -0,0 +1 @@
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
OK,에서 잘못 된 것처럼 보이 ce5d37c므로 하위 모듈을 부모 ( ce5d37c~) 에서 복원합니다 .
또는 패치 텍스트 ( 5d5a3ee314476701a20f2c6ec4a53f88d651df6c) 에서 서브 모듈의 커밋을 가져 와서 위의 "내부, 외부"프로세스를 대신 사용할 수 있습니다.
슈퍼 프로젝트에서 체크 아웃
$ git checkout ce5d37c~ -- sub
이렇게하면 서브 프로젝트 항목이 수퍼 프로젝트 sub에서 커밋 ce5d37c~된 항목으로 재설정 됩니다.
서브 모듈 업데이트
$ git submodule update
Submodule path 'sub': checked out '5d5a3ee314476701a20f2c6ec4a53f88d651df6c'
하위 모듈 업데이트가 정상적으로 진행되었습니다 (분리 된 HEAD를 나타냄).
결과 확인
$ git diff ce5d37c~ -- sub
$ git diff
$ git diff --cached
diff --git c/sub i/sub
index e47c0a1..5d5a3ee 160000
--- c/sub
+++ i/sub
@@ -1 +1 @@
-Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
첫 번째 차이점 sub은 현재와 동일 하다는 것을 보여줍니다 ce5d37c~. 두 번째 diff는 인덱스와 작업 트리가 동일 함을 보여줍니다. 세 번째 차이점은 단계적 변경 만이 sub서브 모듈을 다른 커밋으로 옮기는 것만 보여줍니다 .
범하다
git commit
이것은 고정 서브 모듈 엔트리를 커밋한다.