힘내 하위 모듈 푸시


128

하위 모듈을 수정하면 커밋을 하위 모듈 원점으로 다시 밀어 넣을 수 있습니까, 아니면 복제가 필요한가요? 복제 된 경우 다른 저장소에 복제본을 저장할 수 있습니까?


4
git 2.7 (2016 년 1 월)에서는 한 번만 설정하면 git config push.recurseSubmodules on-demand됩니다. 그렇다면 간단한 git push것만으로 모든 것을 밀어 넣을 수 있습니다 (메인 저장소 및 하위 모듈). 아래에서 편집 한 답변을 참조하십시오 .
VonC

수행하려는 작업에 대한 샘플 코드를 제공하십시오.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

답변:


138

서브 모듈은 여분의 메타 데이터 (gitlink tree entry, .gitmodules file)가있는 다른 저장소 내의 git repo의 복제 일뿐입니다.

$ cd your_submodule
$ git checkout master
<hack,edit>
$ git commit -a -m "commit in submodule"
$ git push
$ cd ..
$ git add your_submodule
$ git commit -m "Updated submodule"

1
예. 푸시하기 전에 동기화 된 로컬 브랜치 (있는 경우)에서 변경 사항을 가져 오는 것을 잊지 마십시오. 예를 들어. gh-pagesgithub repo에 대한 문서화를 위해 브랜치 와 작업 할 때 :)
NiKo

your_submodule을 추가하기 전에 your_submodule을 어떻게 cd 할 수 있습니까? 하위 모듈을 추가하는 가장 좋은 방법은 "add"git 명령을 사용하는 것입니다. 하위 모듈을 추가하는 또 다른 방법이 있습니까?
MrSo

1
@Mr 그래서 서브 모듈이 이미 있다고 생각하고 서브 모듈에서 무언가를 변경하기 위해 서브 모듈에 들어가고 있습니다.
HattrickNZ

108

git1.7.11 이후 ( [ANNOUNCE] Git 1.7.11.rc1릴리스 노트 , 2012 년 6 월)는 다음을 언급합니다.

" git push --recurse-submodules"선택적으로 수퍼 프로젝트에 바인딩 된 서브 모듈의 히스토리를 살펴보고 밀어내는 법을 배웠다.

이 패치--on-demand옵션 후에 수행 될 수 있습니다.

recurse-submodules=<check|on-demand>::

푸시 할 개정에 사용 된 모든 서브 모듈 커밋이 원격 추적 브랜치에서 사용 가능한지 확인하십시오.

  • check를 사용 하면 푸시 할 개정에서 변경된 모든 서브 모듈 커밋이 원격에서 사용 가능한지 점검됩니다.
    그렇지 않으면 푸시가 중단되고 0이 아닌 상태로 종료됩니다.
  • on-demand를 사용 하면 푸시 할 개정에서 변경된 모든 서브 모듈이 푸시됩니다.
    요청시 필요한 모든 수정 사항을 푸시 할 수없는 경우 중단되고 0이 아닌 상태로 종료됩니다.

따라서 (부모 저장소에서) a로 한 번에 모든 것을 푸시 할 수 있습니다.

git push --recurse-submodules=on-demand

이 옵션은 한 수준의 중첩에서만 작동합니다. 다른 하위 모듈 내부의 하위 모듈에 대한 변경 사항은 적용되지 않습니다.


git 2.7 (2016 년 1 월)을 사용하면 간단한 git push로 부모 저장소와 모든 하위 모듈 을 푸시하기에 충분합니다 .

참조 d34141c 커밋 , f5c7cd9 커밋 , (03 년 12 월 2015) f5c7cd9을 커밋 (2015년 12월 3일), 및 b33a15b 커밋 (2015년 11월 17일)에 의해 마이크 크로 ( mikecrowe) .
(의해 병합 - Junio C 하마노 gitster-5d35d72 커밋 2,015 21 십이)

push: recurseSubmodules구성 옵션 추가

--recurse-submodules명령 줄 매개 변수는 몇 시간 동안 존재했지만 그것은 어떤 설정 파일에 해당이 없습니다.

에 해당하는 매개 변수의 스타일에 git fetch따라이 push.recurseSubmodules매개 변수의 기본값을 제공 하도록하겠습니다 .
또한 필요할 --recurse-submodules=no때 명령 줄에서 구성을 재정 의 할 수 있도록 추가 해야합니다.

이것을 구현하는 가장 간단한 방법은와 비슷한 방식으로 push코드를 사용 submodule-config하는 것 같습니다 fetch.

git config문서에는 이제 다음이 포함됩니다 .

push.recurseSubmodules:

푸시 할 개정에 사용 된 모든 서브 모듈 커밋이 원격 추적 브랜치에서 사용 가능한지 확인하십시오.

  • 값이 ' check'인 경우 Git은 푸시 할 개정에서 변경된 모든 서브 모듈 커밋이 서브 모듈의 하나 이상의 원격에서 사용 가능한지 확인합니다. 커밋이 누락되면 푸시가 중단되고 0이 아닌 상태로 종료됩니다.
  • 값이 ' on-demand'이면 푸시 할 개정에서 변경된 모든 서브 모듈이 푸시됩니다. 요청시 필요한 모든 수정 사항을 푸시 할 수없는 경우 중단되고 0이 아닌 상태로 종료됩니다. -
  • 값이 ' no'이면 푸시시 서브 모듈을 무시하는 기본 동작이 유지됩니다.

푸시시 ' --recurse-submodules=check|on-demand|no' 를 지정하여이 구성을 대체 할 수 있습니다 .

그래서:

git config push.recurseSubmodules on-demand
git push

힘내 2.12 (2017 년 1 분기)

git push --dry-run --recurse-submodules=on-demand 실제로 작동합니다.

Brandon Williams ( )의 commit 0301c82 , commit 1aa7365 (2016 년 11 월 17 일)를 참조하십시오 . (의해 병합 - Junio C 하마노 -12cf113 커밋 2,016 16 십이)mbrandonw
gitster

push run with --dry-run푸시가 수동으로 서브 모듈을 푸시하도록 구성된 경우 실제로는 (2016 년 12 월 2.11 Git 2.11 이하) 드라이 런을 수행하지 않습니다.
대신 밀어야하는 모든 하위 모듈이 실제로 원격으로 푸시되고 수퍼 프로젝트에 대한 모든 업데이트는 드라 이런으로 수행됩니다.
이것은 버그이며 드라 이런의 의도 된 동작이 아닙니다.

서브 모듈을 '주문형'으로 재귀 적으로 푸시하도록 구성된 push경우 --dry-run옵션 을 존중하도록 가르치십시오 .
이는 --dry-run드라 이런을 수행 할 때 하위 모듈에 대한 푸시를 수행하는 하위 프로세스에 플래그를 전달하여 수행됩니다 .


그리고 여전히 Git 2.12에서는 최상위 슈퍼 프로젝트를 누르지 않고 서브 모듈을 밀어내는 " --recurse-submodules=only"옵션 있습니다.

참조 225e8bf 커밋 , 6c656c3 커밋 , 14c01bd 커밋 에 의해 (2016년 12월 19일) 브랜든 윌리엄스 ( mbrandonw) .
(의해 병합 - Junio C 하마노 gitster-792e22e 커밋 2,017 31 일월)


이것은 지금 사용할 수 있습니까?
CMCDragonkai

@ CMCDragonkai 예, git-scm.com/docs/git-push 에서 볼 수 있습니다 . 답변을 편집했습니다.
VonC

재귀 커밋이 있습니까?
CMCDragonkai

1
당신은 항상 'git submodule foreach commit'을 할 수 있습니다
reflog

비트 버킷 URL로 .gitmodules 파일을 업데이트해야했습니다.
wclark
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.