Programing

변경 사항을 git 서브 모듈로 되돌리려면 어떻게해야합니까?

lottogame 2020. 4. 13. 08:09
반응형

변경 사항을 git 서브 모듈로 되돌리려면 어떻게해야합니까?


리포지토리에 추가 한 git 서브 모듈 (RestKit)이 있습니다.

실수로 일부 파일을 변경했으며 소스 버전으로 돌아가고 싶습니다. 그렇게하기 위해, 나는 달리려고 노력했다.

Mac:app-ios user$ git submodule update RestKit

그러나 여기서 볼 수 있듯이 여전히 "수정 된 내용"이므로 작동하지 않았습니다.

Mac:app-ios user$ git status
...
#   modified:   RestKit (modified content)

조차

Mac:app-ios user$ git submodule update -f RestKit 

로컬로 수정 된 파일을 되 돌리지 않습니다.
해당 서브 모듈의 내용을 어떻게 재설정합니까?


서브 모듈의 디렉토리로 이동 한 다음 git reset --hard모든 수정 된 파일을 마지막 커밋 된 상태로 재설정 하려면를 수행하십시오 . 커밋되지 않은 모든 변경 사항은 삭제됩니다.


디렉토리를 변경하지 않고 모든 하위 모듈에 대해이 작업을 수행하려는 경우 수행 할 수 있습니다

git submodule foreach git reset --hard

재귀 플래그를 사용하여 모든 하위 모듈에 적용 할 수도 있습니다.

git submodule foreach --recursive git reset --hard


이전의 모든 답변보다 더 안전한 방법입니다.

git submodule deinit -f .
git submodule update --init

첫 번째 명령은 모든 하위 모듈을 완전히 "바인드 해제"하고 두 번째 명령은 새로 검사합니다.
다른 방법보다 시간이 오래 걸리지 만 하위 모듈의 상태에 관계없이 작동합니다.


글쎄, 나를 위해

git reset --hard

메인의 repo 참조 커밋 / 상태가 필요하지 않은 서브 모듈을 체크 아웃 한 상태로 재설정하면됩니다. 나는 여전히 OP와 같은 "수정 된 내용"을 가질 것이라고 말했다. 따라서 서브 모듈을 올바른 커밋으로 되돌리려면 다음을 실행하십시오.

git submodule update --init

그런 다음 git status하위 모듈에서 깨끗합니다.


4 단계를 순차적으로 수행하십시오.

git submodule foreach git reset --hard HEAD
git submodule update
git submodule foreach "git checkout master; git pull"
git submodule foreach git clean -f

하위 모듈로 재귀 적으로 포함하여 저에게 효과적이었습니다 (아마도 -f가 작동하지 않아 하위 모듈 내부의 하위 모듈을 변경했을 수 있습니다).

git submodule update -f --recursive

Git 2.14 (2017 년 3 분기)부터는 git reset(와 같이 git submodule foreach git reset --hard) 각 하위 모듈로 이동할 필요가 없습니다.

git reset 자체가 재귀 적으로 서브 모듈로 들어가는 방법을 알고 있기 때문입니다.

참조 35b96d1 커밋 (2,017 사월 21) 및 f2d4899 커밋 , 823bab0 커밋 , cd279e2 투입 하여 (18 사월 2017) 스테판 벨러 ( stefanbeller) .
( Junio ​​C gitsterHamano의해 병합 -- 커밋 5f074ca , 2017 년 5 월 29 일)

내장 / 재설정 : add --recurse-submodules 스위치

git-reset 하위 모듈에 대해 학습해야하는 또 다른 작업 트리 조작기입니다.

사용자가 git-reset을 사용하고 하위 모듈로 재귀를 요청하면 하위 프로젝트가 슈퍼 프로젝트에 기록 된대로 객체 이름으로 재설정되어 HEAD가 분리됩니다.

경고 : 차이점

  • git reset --hard --recurse-submodule
  • git submodule foreach git reset --hard

후자는 하위 모듈 작업 트리 만 재설정하므로 전자는 기본 상위 리포 작업 트리를 재설정한다는 것입니다.
주의해서 사용하십시오.


git <= 2.13의 경우이 두 명령을 결합하면 재귀 서브 모듈로 repos를 재설정해야합니다.

git submodule foreach --recursive git reset --hard
git submodule update --recursive --init

이것은 DEV 패키지 저장소와 LIVE 패키지 저장소가있는 GIT v1.7.1을 실행하는 라이브러리에서 작동합니다. 리포지토리 자체는 프로젝트의 자산을 패키징하는 쉘에 지나지 않습니다. 모든 서브 모듈.

LIVE는 의도적으로 업데이트되지 않지만 캐시 파일이나 사고가 발생하여 저장소가 더러워집니다. DEV에 추가 된 새 하위 모듈도 LIVE 내에서 초기화해야합니다.

DEV의 패키지 리포지토리

여기서 우리는 아직 알지 못하는 모든 업스트림 변경 사항을 가져오고 패키지 저장소를 업데이트합니다.

# Recursively reset to the last HEAD
git submodule foreach --recursive git reset --hard

# Recursively cleanup all files and directories
git submodule foreach --recursive git clean -fd

# Recursively pull the upstream master
git submodule foreach --recursive git pull origin master

# Add / Commit / Push all updates to the package repo
git add .
git commit -m "Updates submodules"
git push   

LIVE의 패키지 리포지토리

여기서는 DEV 저장소에 커밋되었지만 변경 사항을 알 수없는 업스트림 변경 사항을 가져오고 싶습니다.

# Pull changes
git pull

# Pull status (this is required for the submodule update to work)
git status

# Initialize / Update 
git submodule update --init --recursive

모든 하위 모듈을 재설정하는 방법 ( "마스터"분기를 분리하고 유지하지 않는 방법) :

각 'git checkout master && git reset --hard $ sha1'forgit submodule

참고 URL : https://stackoverflow.com/questions/10906554/how-do-i-revert-my-changes-to-a-git-submodule

반응형