서브 모듈의 리포지토리에 사용하려는 커밋이 포함되어 있다고 가정하면 (수퍼 프로젝트의 현재 상태에서 참조되는 커밋과 달리) 두 가지 방법이 있습니다.
첫 번째는 사용하려는 서브 모듈의 커밋을 이미 알고 있어야합니다. 하위 모듈을 직접 조정 한 다음 수퍼 프로젝트를 업데이트하여 "내부, 외부"에서 작동합니다. 두 번째는“외부에서”서브 모듈을 수정 한 수퍼 프로젝트의 커밋을 찾은 다음 다른 서브 모듈 커밋을 참조하도록 수퍼 프로젝트의 인덱스를 재설정하여 작동합니다.
뒤집어서
당신이 이미 알고있는 경우에는 사용에 서브 모듈, 원하는 커밋 된 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
이것은 고정 서브 모듈 엔트리를 커밋한다.