git 하위 모듈과의 충돌을 어떻게 관리합니까?


127

여러 하위 모듈을 참조하는 git superproject가 있고 나머지 프로젝트 구성원이 작업 할 수 있도록 워크 플로를 잠그려고합니다.

이 질문에 대해 내 슈퍼 프로젝트가 호출 supery되고 하위 모듈이라고 가정 subby합니다. (다음은 내가하려는 작업을 단순화 한 것입니다 ... 실제로 버전에 브랜치를 사용하지는 않지만 질문으로 레이아웃하는 것이 가장 쉬울 것이라고 생각했습니다.)

내 마스터 분기 에는 하위 모듈로 참조되는 git 프로젝트 supery의 태그 v1.0subby있습니다. 의 분기 supery라는 one.one및 태그에 포인트로 서브 모듈의 참조를 변경 v1.1subby.

이러한 각 분기 내에서 문제없이 작업 할 수 있지만 one.one분기의 변경 사항으로 분기 를 업데이트하려고하면 master충돌이 발생하고 해결 방법이 없습니다.

기본적으로 분기 git pull . master에서 잠시 실행 subby하면 추가 하위 모듈이 생성되는 것처럼 보입니다.

가져 오기 / 병합하기 전에 분기 git submodule에서 원하는 응답을 얻습니다 one.one.

$ git checkout master
$ git submodule
qw3rty...321e subby (v1.0)
$ git checkout one.one
$ git submodule
asdfgh...456d subby (v1.1)

하지만 풀 후에 실행하면 추가 하위 모듈이 추가됩니다 git submodule.

$ git pull . master
Auto-merged schema
CONFLICT (submodule): Merge conflict in subby - needs qu3rty...321e
Automatic merge failed; fix conflicts and then commit the results.

$ git submodule
qw3rty...321e subby (v1.0)
asdfgh...456d subby (v1.1)
zxcvbn...7890 subby (v1.1~1)

원치 않는 하위 모듈 참조를 삭제 / 무시하고 충돌 및 변경 사항을 커밋하려면 어떻게합니까? 아니면 git pull내 하위 모듈을 무시하는 원본과 함께 사용할 수있는 매개 변수 가 있습니까?

답변:


23

나는 그 정확한 오류를 전에 보지 못했습니다. 그러나 나는 당신이 직면하고있는 문제에 대해 추측합니다. 의 masterone.one브랜치에 하위 모듈에 supery대한 다른 참조 가 포함되어 있기 때문에 git의 subby변경 사항을 병합 할 때 .NET 의 브랜치에서 유지하고 추적해야하는 master참조 v1.0또는 v1.1추적을 알 수 없습니다 .one.onesupery

이 경우 원하는 참조를 선택하고 해당 변경 사항을 커밋하여 충돌을 해결해야합니다. 이것이 바로 reset 명령으로 수행하는 작업입니다 .

이것은 프로젝트의 다른 분기에서 다른 버전의 하위 모듈을 추적하는 까다로운 측면입니다. 그러나 하위 모듈 참조는 프로젝트의 다른 구성 요소와 같습니다. 두 개의 다른 분기가 연속적인 병합 후에도 동일한 각 하위 모듈 참조를 계속 추적하는 경우 git은 향후 병합에서 병합 충돌을 일으키지 않고 패턴을 해결할 수 있어야합니다. 반면에 스위치 하위 모듈이 자주 참조하면 많은 충돌을 해결해야 할 수도 있습니다.


1
질문에 대해 약간의 빛을 비춰 주셔서 감사합니다. 그것은 지금 나에게 완전히 의미가 있으며 reset 명령은 위의 내 상황에서 완벽하게 작동합니다. 그러나 마스터 브랜치에서 서브 모듈 참조를 받아들이고 현재 브랜치의 서브 모듈에 대한 참조를 버리는 명령은 무엇입니까? 정상적인 충돌을 처리하는 방법을 알고 있지만 3 일 동안 웹을 수색 한 후 rm -r 이외의 코드 예제를 찾을 수 없습니다. 그리고 저는 예제가 존재하지 않는 이유가 있다고 생각하기 시작했습니다. 서브 모듈은 모든 전환을 관리해야하는 슈퍼 프로젝트에서 지금까지 추상화되었습니다.
Tyler

26
드디어! 답변! 나는했다 added by us: ../Mono.Cecilgit status있지만 git addgit rm실패했습니다 Mono.Cecil: needs merge, pathspec 'Mono.Cecil/' did not match any files그냥 빈 폴더와 자식 만 정말 핸들 파일 때문에. git checkoutMono.Cecil: needs merge, error: you need to resolve your current index first, git submodule updateSkipping unmerged submodule Mono.Cecil하고 git checkout master Mono.Cecil마침내 그것을 고정. 기본 문제 : git status제안이 잘못되었으므로 분기를 선택하고 checkout!
IBBoard

6
IBBoard의 명령이이 상황에 나를 도와 @ - 나는 노력 git checkout --ours SUBMODgit add SUBMOD다른 사람,하지만 마지막으로하고 git checkout master SUBMOD충돌을 해결했습니다. 이 코멘트는 아마 대답하지 코멘트해야 ... :)
콜린 D 베넷

89

글쎄, 그것은 기술적으로 서브 모듈과의 충돌을 관리하지는 않지만 (예 : 이것을 유지하지만 저것은 아님) 계속 작업하는 방법을 찾았습니다 ... 내가해야 할 일은 내 git status출력에 주의를 기울이고 서브 모듈을 재설정하는 것입니다.

git reset HEAD subby
git commit

그러면 서브 모듈이 pre-pull 커밋으로 재설정됩니다. 이 경우 정확히 내가 원했던 것입니다. 그리고 하위 모듈에 적용되는 변경 사항이 필요한 다른 경우에는 표준 하위 모듈 워크 플로 (마스터 체크 아웃, 원하는 태그 풀다운 등)로 처리합니다.


나에게 이것은 충돌하는 모듈의 상태를 "둘 다 수정 됨"에서 "삭제됨"으로 변경하는 것처럼 보입니다.
Matt Zukowski 2011 년

4
대신 병합 된 분기의 하위 모듈을 유지하는 것이 좋습니다. git reset <merged-branch> subby
Edward Anderson

1
대답에 규정 된대로 나를 위해 작동합니다 .. git reset HEAD 경로 / to / submodule / dir
estoy dec

56

나는이 질문에 대한 답변으로 약간 어려움을 겪었으며 유사한 SO 게시물 의 답변에도 많은 운이 없었 습니다 . 그래서 이것이 저에게 효과적이었습니다. 제 경우에는 하위 모듈이 다른 팀에서 유지 관리되었으므로 충돌은 마스터의 다른 하위 모듈 버전과 제가 작업중인 프로젝트의 로컬 분기에서 발생했습니다.

  1. 실행 git status-충돌이있는 하위 모듈 폴더를 기록해 둡니다.
  2. 현재 분기에서 마지막으로 커밋 된 버전으로 하위 모듈을 재설정합니다.

    git reset HEAD path/to/submodule

  3. 이 시점에서 하위 모듈의 저장소에서 최신 버전으로 업데이트 할 수있는 충돌없는 버전의 하위 모듈이 있습니다.

    cd 경로 / 대상 / 하위 모듈
    git 하위 모듈 foreach git pull origin SUBMODULE-BRANCH-NAME
  4. 이제 그렇게 할 수 commit있고 다시 일할 수 있습니다.


16

먼저 서브 모듈에서 참조 할 해시를 찾으십시오. 그런 다음 실행

~/supery/subby $ git co hashpointerhere
~/supery/subby $ cd ../
~/supery $ git add subby
~/supery $ git commit -m 'updated subby reference'

그것은 내 서브 모듈을 올바른 해시 참조로 가져오고 더 이상 충돌하지 않고 내 작업을 계속하는 데 도움이되었습니다.


1
아니면 그냥 git checkout --theirs (or --ours) subby
Bachi

@Bachi : git checkout --theirs 및 --ours는 하위 모듈에 영향을주지 않습니다.
Edward Anderson

1
이렇게하면 충돌이 해결되지만 <hashpointerhere>를 결정하는 것은 쉽지 않습니다. 충돌의 양쪽에서 체크 아웃 된 서브 모듈 커밋을 확인하는 쉬운 방법을 모르겠습니다. subby에서 체크 아웃 한 커밋은 병합 커밋에서 적절하지 않은 병합의 양쪽과 다를 수 있습니다.
Edward Anderson

@nilbus 사실입니다. git 하위 모듈 작업은 우리가 우려했던 것 중 하나 였기 때문에 그만두고 실제로 원하는 커밋을 말하기가 매우 어려웠습니다. 우리는 composer (php)를 패키지 관리자로 사용했는데, 리포지토리를 특정 해시로 잠그는 잠금 파일을 생성하기 때문에 실제로 좋아합니다. 그러나 여러 저장소 내에서 node_modules를 사용하고 있기 때문에 여기저기서 충돌하는 모듈이 발생합니다. 이후 우리는이 작업을 관리하기 위해 npm으로 전환했지만 이는 완전히 다른 웜 캔이기도합니다.
hellatan

12

나는 git rebase -i origin/master지점 에이 문제가 있었다 . 마스터 버전의 하위 모듈 참조를 가져오고 싶었으므로 간단히 다음을 수행했습니다.

git reset master path/to/submodule

그리고

git rebase --continue

그것은 나를 위해 문제를 해결했습니다.


3
이것은 나를 위해 일했습니다. 나는 아직도 그들이 서브 모듈을 손상시키기 위해 무엇을했는지 알아
내고있다

3

이 토론에서 도움을 얻었습니다. 제 경우에는

git reset HEAD subby
git commit

나를 위해 일했습니다 :)


2

내 부모 디렉토리에서 나는 다음을 본다.

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Unmerged paths:
(use "git reset HEAD <file>..." to unstage)
(use "git add <file>..." to mark resolution)

그래서 방금 했어요

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