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


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 init및git 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.