IT

Git Submodule 포인터를 포함하는 저장소에 저장된 커밋으로 되돌리는 방법은 무엇입니까?

itgroup 2023. 9. 20. 20:15
반응형

Git Submodule 포인터를 포함하는 저장소에 저장된 커밋으로 되돌리는 방법은 무엇입니까?

제 메인 깃 레포에 깃 서브모듈이 있습니다.제가 알기로는, 메인 레포는 SHA 값(somewhere...)을 저장하며, SHA 값이 "연결"되는 서브모듈의 구체적인 커밋을 가리킵니다.

를 .git checkout some_other_branch 전혀 저는 제가 어떤 약속에서 왔는지 전혀 모릅니다.

메인 레포와 서브모듈이 다시 동기화되도록 포인터를 되돌리고 싶습니다.

내 첫번째(아마도 순진한) 본능은 다음과 같이 말하는 것이었습니다.git reset --hard 건 다 것 요 -다놀랍게도, 이 시나리오에는 효과가 없었습니다.

그래서 내가 타이핑을 할 수 있다는 것을 알게 되었습니다.git diff SHA ID 를를 합니다.git checkout [SHA ID] 더 쉬운 겁니다

아직 git 서브모듈에 대해 배우는 중이라 모르는 개념의 단어가 있으면 언제든지 용어를 수정해주세요.

하위 모듈을 업데이트하여 상위 리포지토리에서 생각하는 것과 동기화되도록 하려는 것입니다.update 명령은 다음과 같은 용도입니다.

하위 모듈 관리 페이지에서:

등록된 하위 모듈을 업데이트합니다. 즉, 누락된 하위 모듈 복제 및내용의 색인에 명시된 커밋을 체크합니다.저장소그렇지 않으면 하위 모듈 헤드가 분리됩니다.--rebase 또는 --merge이 지정되거나 키 하위 모듈이 지정됩니다.$name.update기본 재배치 또는 병합으로 설정됩니다.

이것을 실행하면 모든 것이 잘 될 것입니다.

git submodule update --init

를 할 수 .--recursive플래그 또한 모든 하위 모듈을 통해 반복됩니다.

하위 모듈이 가리키는 커밋을 변경하려면 하위 모듈에서 해당 버전을 확인한 다음 해당 repo로 돌아가서 변경 사항을 추가하고 커밋해야 합니다.

합니다를 합니다.git submodule update --recursive.더하다--init이제 막 복제를 하셨다면요

.git submodule .submodule됩니다를(를) 됩니다.동기화되지 않으면 커밋 앞에 - 또는 +가 표시됩니다.

이 을 알 수 commit다른 것들과 반대로 방울이나 나무들입니다.

특정 커밋 포인트가 하위 모듈에 무엇을 쓰는지 확인하려면 다음을 수행할 수 있습니다.

git ls-tree <some sha1, or branch, etc> Submodule/path

그러면 로그 등에 전달함으로써 커밋 또는 다른 것을 볼 수 있습니다.git-dirgit 명령 수준의 option을 사용하면 하위 모듈로 cd다운해야 하는 것을 건너뛸 수 있습니다):

git --git-dir=Submodule/path log -1 $(<the above statement>)

방금 발견한 또 다른 경우는 폐기할 서브모듈에 단계적으로 변경된 사항이 있는 경우입니다. git 서브모듈 업데이트는 해당 변경 사항을 제거하지 않으며 상위 디렉토리에서 git reset --hard를 수행하지 않습니다.서브모듈 디렉토리로 이동하여 git reset --hard를 수행해야 합니다.따라서 부모 모듈과 하위 모듈 모두에서 단계별 변경 사항을 완전히 삭제하려면 다음 작업을 수행합니다.

상위 항목:

git reset --hard

git submodule update

하위 모듈에서:

git reset --hard

서브모듈과 모듈의 변경사항을 무시하고 싶었습니다.

다음 명령이 도움이 되었습니다.

git submodule update --init --recursive

여기서의 답은 서브모듈에 대한 나의 구체적인 문제를 해결하지 못했으므로, 당신에게도 그런 일이 발생할 경우를 대비하여 다음과 같이 시도해 보십시오.

 git submodule foreach git reset --hard

사용하다git ls-tree HEAD"superproject" 폴더에서 서브모듈이 원래 무엇인지 확인할 수 있습니다.그런 다음 서브모듈 디렉토리로 변경하여 사용합니다.git log --oneline --decorate원래 커밋이 어느 지점에 있는지 확인합니다.마침내.git checkout original-commit-branch.

설정한 일부 테스트 디렉토리를 사용하여 명령어의 모양은 다음과 같습니다.

$ git --version
git version 1.7.4.1
$ 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)
#
#   modified:   sm2 (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git ls-tree HEAD
100644 blob 76813a07ae558db274cefc6d903ec24323fdeb0d    .gitmodules
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    main
160000 commit 7c5889497938cd5699a9234a98ee93947e52b1ed  sm1
160000 commit f68bed61cba6f94cef57554f2cf46a45a4a0d337  sm2
$ cd sm2
$ git log --oneline --decorate
5b8d48f (HEAD, foo1) foo1.1
f68bed6 (origin/master, origin/HEAD, master) Initial commit.
$ git checkout master
Switched to branch 'master'
$ cd ..
$ git status
# On branch master
nothing to commit (working directory clean)

"슈퍼 프로젝트"는 sm2 서브 모듈을 커밋하여 보여줍니다.f68bed6하지만 sm2는 머리를 가지고 있습니다.5b8d48f. 서브모듈 커밋f68bed6는 하위 모듈 디렉토리의 체크아웃에 사용될 수 있는 세 개의 분기를 가지고 있습니다.

enter image description here

업데이트된 비주얼 워크스루 - 여기 내 서브모듈이 가리키고 있습니다 - 8c3fd8b 이 폴더로 이동하는 것은 간단할 것이고..

git checkout master
error: pathspec 'master' did not match any file(s) known to git

하위 모듈에서 stylegan2-ada 폴더를 실행해야 합니다.

git checkout main
git pull

이것으로 나의 문제가 해결되었습니다 (일시적으로

마지막 단계는 부모 레포의 변경 사항을 실행하는 것이었습니다.추적된 변경 내용이 자동으로 나타나므로 파일을 생성할 필요가 없습니다. vScode에서 +를 클릭하고 푸시하는 것만으로 파일 변경 내용을 스테이징할 수 있습니다.

여기서 깃 커밋이 상쾌한 것을 볼 수 있습니다.

-Subproject commit 8c3fd8bac3e5a54a20e860fc163d6e67cc03c623
+Subproject commit 0045ea50f1b9710ffde3ab2a9a18c0d4c97bfaed

enter image description here

문제 해결

각각의 git 리모트 레포를 가리키는 .gits 서브모듈 파일이 있으니 주의하세요.

enter image description here

언급URL : https://stackoverflow.com/questions/7882603/how-to-revert-a-git-submodule-pointer-to-the-commit-stored-in-the-containing-rep

반응형