자식 서브 모듈의 원격 저장소를 변경하는 방법은 무엇입니까?


722

하위 모듈이있는 git 저장소를 만들었습니다. 하위 모듈 자체에 원격 저장소 경로를 변경하도록 지시 할 수는 있지만 상위 저장소에 하위 모듈의 원격 저장소 경로를 변경하는 방법을 알려주는 방법을 모르겠습니다.

하위 모듈을 삭제하는 것조차 쉽지 않기 때문에 운이 좋지 않고 수동으로 작업 해야하는 경우 놀라지 않을 것입니다.


8
참고 : 힘내 2.25 (Q1 2020)와 함께 제공됩니다 새 명령 "git submodule set-url [--] <path> <newurl>
VonC

답변:


1010

.gitmodulesURL을 업데이트하기 위해 파일 을 편집 한 다음 git submodule sync변경 사항을 수퍼 프로젝트 및 작업 복사본에 반영하도록 실행할 수 있어야합니다.


22
이것은 적어도 1.7.1 또는 1.7.3에서 .git / config를 업데이트하지 않는 것 같습니다.
davidtbernal

6
이전 커밋에 대한 하위 모듈 URL 구성도 업데이트합니까? 예, 이전 커밋을 체크 아웃하면 새 하위 모듈 URL을 가리 킵니까?
maxmelbin

63
사용은 git submodule foreach -q git config remote.origin.url"실제"서브 모듈의 URL을 볼 수
조엘 Purra

10
.git/configgit 2.1.0을 사용하여 업데이트되지 않았습니다 . 나는 갱신에 모두했다 .gitmodules.git/config수동으로 실행하기 전에 git submodule sync --recursive내 서브 모듈은 원격으로 업데이트해야 할 수 있습니다.
desseim

7
이것은의 주요 단계 누락 된 것으로 나타납니다 git submodule update --init --recursive --remote실제로 새 원격으로 저장소를 변경하는
제이슨 Axelson

154

이 명령은 로컬 저장소의 파일을 변경하지 않고 명령 프롬프트 작업을 수행합니다.

git config --file=.gitmodules submodule.Submod.url https://github.com/username/ABC.git
git config --file=.gitmodules submodule.Submod.branch Development
git submodule sync
git submodule update --init --recursive --remote

스크린 샷은 블로그를 참조하십시오 : GIT 서브 모듈 URL / 지점을 동일한 저장소의 다른 URL / 지점으로 변경


8
이것은 효과가 있었지만 변경 사항을 리모컨으로 푸시해야한다는 것을 기억해야했습니다. git add .gitmodules git commit -m "modified submodule URL" git push origin master
skulz00

5
글쎄, 그것은 나를 위해 끔찍한 혼란을 만들었습니다. 명령이 조용히 다운되었지만 실제 하위 모듈 저장소는 여전히 원격이 이전 버전 (이전 URL)이라고 생각합니다. 어쩌면이 명령들은 서브 모듈의 저장소 내에 다른 명령들과 함께 있어야합니까?
Motti Shneor

5
마지막 명령은 약간 극단적입니다 ... 내부에 서브 모듈이있는 서브 모듈이있는 경우 서브 서브 모듈도 원격으로 업데이트되므로 필요한 것은 아닙니다.
Baptiste Wicht

7
Submod를 서브 모듈의 이름으로 교체해야합니다!
Shital Shah

133

간단히 말해서 .gitmodules 파일을 편집 한 다음 다시 동기화하고 업데이트하면됩니다.

git 명령을 통해 또는 직접 파일을 편집하십시오.

git config --file=.gitmodules -e

또는 그냥 :

vim .gitmodules

그런 다음 다시 동기화하고 업데이트하십시오.

git submodule sync
git submodule update --init --recursive --remote

6
git submodule update --init나를 위해 일했고, --remote원격 저장소의 HEAD에 묶는 것처럼 보입니다.
Chaim Eliyah

95

Git 2.25 (Q1 2020)를 사용하여 수정할 수 있습니다.
" Git submodule url changed "및 새로운 명령을 참조하십시오

git submodule set-url [--] <path> <newurl>

원래 답변 (2009 년 5 월, 10 년 전)

실제로, 역할 을 명확히하기 위해 2009 년 4 월에 패치 가 제출되었습니다gitmodule .

따라서 gitmodule 문서 에는 아직 다음이 포함되어 있지 않습니다.

.gitmodules자식-설정 : 자식 작업 트리의 최상위 디렉토리에있는 파일, 요구 사항의 클로 linkgit 일치하는 구문으로 텍스트 파일입니다 1 .
[신규] :
이 파일은 Git에서 관리하므로 프로젝트 하위 모듈의 + 레코드를 추적합니다.
이 파일에 저장된 정보는 프로젝트 구성 파일에 저장된 레코드의 정식 버전을 작성하는 힌트로 사용됩니다.
구성 파일에는 사용자 별 레코드 변경 (예 : 네트워킹 상황으로 인한 서브 모듈 URL의 차이를 설명하기 위해)이 이루어져야하고, 전파 될 레코드 변경 (예 : 서브 모듈 소스의 재배치로 인해)이이 파일에 이루어져야합니다. .

그것은 Jim의 대답을 거의 확인시켜 줍니다.


자식 서브 모듈 튜토리얼을 따르면, git submodule init서브 모듈 저장소 URL을 .git / config에 추가하려면 " " 이 필요합니다 .

" git submodule sync"는 URL 변경시 (특히 하위 모듈의 수가 중요한 경우) 해당 작업을보다 쉽게하기 위해 2008 년 8 월에 추가되었습니다 .
해당 명령을 사용하는 연관 스크립트는 간단합니다.

module_list "$@" |
while read mode sha1 stage path
do
    name=$(module_name "$path")
    url=$(git config -f .gitmodules --get submodule."$name".url)
    if test -e "$path"/.git
    then
    (
        unset GIT_DIR
        cd "$path"
        remote=$(get_default_remote)
        say "Synchronizing submodule url for '$name'"
        git config remote."$remote".url "$url"
    )
    fi
done

목표는 다음과 같습니다. git config remote."$remote".url "$url"


이 컴퓨터에서만 하위 모듈의 URL을 변경하고 싶었습니다. 나는에 기록을 수정할 수 부모 프로젝트 .git/config: 수행하여 git config submodule."$submodule_name".url "$new_url" 되고 또한 여기에 설명 .
joeytwiddle

선택적인 이중 대시는 git submodule set-url [--] <path> <newurl>무엇을합니까?
열중

1
@jeverling 매개 변수와 옵션을 분리하는 데 도움이됩니다. stackoverflow.com/a/1192194/6309
VonC

1
이전 버전 git을 사용하는 Ubuntu 사용자의 경우이 PPA를 사용하여 다음을 업데이트 할 수 있습니다. launchpad.net/~git-core/+archive/ubuntu/ppa
starbeamrainbowlabs

69

나를 위해 일한 것 (Windows에서는 git 버전 1.8.3.msysgit.0 사용) :

  • 새 저장소 경로로 .gitmodules 업데이트
  • ".git / config"파일에서 해당 라인을 제거하십시오
  • ".git / modules / external"디렉토리에서 해당 디렉토리를 삭제하십시오.
  • 체크 아웃 된 서브 모듈 디렉토리 자체를 삭제하십시오 (필요한지 확실하지 않음)
  • 실행 git submodule initgit submodule update
  • 체크 아웃 된 하위 모듈이 올바른 커밋에 있는지 확인하고 해시가 다를 수 있으므로 커밋하십시오.

그 모든 것을 한 후에, 모든 것이 내가 기대했던 상태에 있습니다. 저장소의 다른 사용자가 업데이트 할 때 비슷한 고통을 겪을 것이라고 생각합니다. 커밋 메시지에서 이러한 단계를 설명하는 것이 좋습니다!


2
정말 감사합니다. 이것은 내가 이미 실행 한 후에 나를 위해 일한 유일한 것입니다 git submodule update. 다른 답변을 따르면 ./git/modules/external디렉토리 에있는 내용이 변경되지 않으므로 업데이트를 시도해도 여전히 잘못된 URL을 가져옵니다.
NtscCobalt

이것은 약간 위험한 것으로 보이며 이전 하위 모듈의 기록을 유지하는지 잘 모르겠습니다. 예를 들어, 메인 리포지토리의 오래된 커밋 또는 분기 (서브 모듈을 포함하는 커밋)를 체크 아웃하려면 메인의 이전 커밋과 연결된 OLD 서브 모듈을 가져 오는 것이 확실하지 않습니다. .
Motti Shneor

아니요, 거의 확실하지 않습니다. 첫 번째 단계 후에 모든 단계를 다시 수행해야합니다. 이것은 내가 서브 모듈의 현재 상태를 nuking하는 데 효과적이라고 생각한 것입니다. 이 글을 쓴 후 상황이 바뀌 었는지 모르겠습니다. :)
Ben Hymers

확실하지는 않지만 이전 하위 모듈 기록을 유지 해야하는 경우 실제로 위험 해 보이는 @MottiShneor. 제 경우에는 이것이 효과가있는 유일한 솔루션입니다. 제가 원했던 것은 기본적으로 원래 서브 모듈을 내 포크로 대체하는 것이 었습니다
arainone

1
다음 단계를 따라 발견 그 그렇지 않으면 발생합니다 필요하다 "는 (이 필요한 경우 확실) 서브 모듈 디렉토리 자체 체크 아웃 삭제"자식 서브 모듈 업데이트를 실행할 때 "치명적인 : ... : 아니 자식 저장소를"
PiersyP

10

.git / config 파일을 편집하십시오 . 예를 들어; 당신이있는 경우 "일반" 서브 모듈을 당신은 슈퍼 모듈에서이 작업을 수행 할 수 있습니다 :

git config submodule.common.url /data/my_local_common

이것은 슈퍼 프로젝트에서 영구적으로 사용하지 않고 한 번만 URL을 변경하려는 경우에만 가장 좋은 방법입니다. 예를 들어 디스크의 로컬 복사본에서 하위 모듈을 복제하려고합니다.
Andy

4

git config --file=.gitmodules -e 경로를 업데이트 할 수있는 기본 편집기를 엽니 다

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