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


269

리포지토리에 추가 한 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 reset --hard origin/<branch_name>.
Jerry K.

답변:


208

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


6
git submodule update (--init가 없어도)는 실제로 아무것도 변경하지 않았을 때 서브 모듈 "changes"를 포기하는 데 효과적이었습니다. 서브 모듈 디렉토리로 이동하여 git status가 비어 있으면 재설정 대신 시도하십시오.
절충 DNA

16
git submodule update --init나를 위해 일했다. 없이 --init이 전혀 작동하지 않았다.
Per Lundberg

훌륭한!! 내가 가져온 리포지토리의 하위 모듈을 변경했습니다. 그리고 이것은 그것을 원래 상태로 되돌 렸습니다.
Noitidart

2
reset --hard가 작동하지 않아 로컬 변경으로 인해 하위 모듈을 초기화 할 수 없습니다.
malhal

33
git submodule update -f --init내 경우에는 @markshiz 외에도 .
otiai10

279

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

git submodule foreach git reset --hard

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

git submodule foreach --recursive git reset --hard


7
이것은 각 하위 모듈 디렉토리로 cd하려고 시도하는 것보다 자동화에 훨씬 효과적입니다.
트래비스 카스티요

4
당신은 또한 할 수 있습니다git submodule foreach --recursive git clean -x -f -d
요요

1
내 컴퓨터 (Git 2.22.0을 사용하는 Windows)에서 --recursive 플래그를 사용할 때 두 번째 git 명령 주위에 작은 따옴표가 필요하거나 작동하지 않습니다. git submodule foreach --recursive 'git clean -x -f -d'
aatwo

196

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

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

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


1
유감스럽게도 내 경우에는 (git 서브 모듈에서 로컬 파일을 수정하여) 작동하지 않았다. "update --init"명령이 error: Your local changes to the following files would be overwritten by checkout
튀어 나온다

특정 서브 모듈을 업데이트하려면 다음을 수행하십시오. $ git submodule deinit
-f-

이 방법에 도달 할 때까지 위의 모든 방법을 시도했습니다. 나를 위해,이 내 자식이 "깨끗한"찾고 있어요 유일합니다 (없이 *내 설명 할 수 없습니다). PS1git status -uno
가이 라파 포트

60

글쎄, 나를 위해

git reset --hard

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

git submodule update --init

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


유감스럽게도 submodule update --init내 경우에는 로컬 수정 사항을 되 돌리지 않는 것 같습니다. |
rogerdpack

48

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

2
나에게도 도움이 된 유일한 사람.
Victor Sergienko

하위 모듈이 새 모듈이면 해당 디렉토리 내에 .git 파일이 없습니다. 맞습니까? git 명령이 부모 저장소로 버블 링됩니까?
santiago arizti

1
@jiahut이 작업을 수행 한 후에도 부모로부터 'git status'를 수행 할 때 하위 모듈 옆에 "(새로운 커밋")이 있습니까?
David Doria

1
@DavidDoria git submodule update(new commits)나를 위해 고쳤 습니다.
ubershmekel

31

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

git submodule update -f --recursive

11

다른 사람들이 말했듯이 먼저 이것을 시도하십시오.

git submodule update --init

그래도 작동하지 않으면 서브 모듈 디렉토리로 변경하고 다음 명령을 사용하여 서브 모듈에 변경 사항이 있는지 확인하십시오.

git status

서브 모듈에 변경 사항이 있으면 제거하십시오. "git status"를 실행할 때 변경 사항이 보이지 않는지 확인하십시오.

다음으로 메인 리포지토리로 돌아가서 "git submodule update --init"를 다시 실행하십시오.


9

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

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


7

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

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

3

이것은 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

2

하위 모듈과 함께 전체 저장소의 모든 변경 사항을 삭제하려면 다음을 사용할 수 있습니다.

git restore . --recurse-submodules

리포지토리 및 하위 모듈에서 변경 한 내용이 모두 취소됩니다.


0

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

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

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