git 하위 모듈을 다른 저장소로 어떻게 바꾸나요?


96

git 서브 모듈을 다른 git repo로 어떻게 바꾸나요?

특히, 하위 모듈이 있습니다.

  • 에있는 ./ExternalFrameworks/TestFramework자식의 repo에 그 포인트git@github.com:userA/TestFramework.git
  • 이제를 가리키고 싶습니다 git@github.com:userB/TestFramework.git.

문제는 여기 에 설명 된 방법으로 하위 모듈을 삭제 한 다음 명령을 사용하여 다시 추가한다는 것입니다.

git submodule add git@github.com:userB/TestFramework.git

이 오류가 발생합니다.

A git directory for 'ExternalFrameworks/TestFramework' is found locally with remote(s):
  origin    git@github.com:userA/TestFramework.git
If you want to reuse this local git directory instead of cloning again from
  git@github.com:userB/TestFramework.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.

답변:


123

하위 모듈의 위치 (URL)가 변경된 경우 간단히 다음을 수행 할 수 있습니다.

  1. .gitmodule새 URL을 사용하도록 파일 수정
  2. 저장소에서 하위 모듈 폴더 삭제 rm -rf .git/modules/<submodule>
  3. 작업 디렉토리에서 하위 모듈 폴더 삭제 rm -rf <submodule>
  4. 운영 git submodule sync
  5. 운영 git submodule update

더 자세한 정보는 다른 곳에서 찾을 수 있습니다.


4
또한 주목할 가치가 있습니다. 다른 사용자 (이미 하위 모듈을 초기화 한)가 업데이트를 받으면 새 하위 모듈이 작동하기 전에 "git submodule sync"를 한 번 수행해야합니다.
joseph.hainline 2013

2
이것은 나를 위해 작동하지 않았습니다. 내 하위 모듈은이 후에도 여전히 이전 URL을 가리 켰습니다. 이유는 무엇입니까?
Arne

34
@Arne 아마도 당신의 서브 모듈이 제대로 초기화되지 않았을 것입니다. 나는 rm -rf .git/modules/<submodule>그것이 나를 위해 일하기 전에해야했다.
David Braun

@DavidBraun git submodule syncrm -rf .git/modules/<submodule>제공 하지만 @Arne과 동일한 문제 가 fatal: Not a git repository: ../.git/modules/<submodule>있습니다. 팁이 있습니까? 내가 처음을 통해 서브 모듈을 생성 git submodule add https://<submodule-url>... 망할 놈의 문서에 따라
acannon828

1
그 후 모듈의 디렉토리로 cd하고 내가 원하는 브랜치를 git 체크 아웃 한 다음 git pull을해야했습니다.
Nicolas Raoul 2014

34

먼저, 편의를 위해 여기에 이미 언급 한 방법으로 현재 하위 모듈을 삭제 합니다.

  • .gitmodules파일 에서 관련 섹션 삭제
  • 에서 관련 섹션 삭제 .git/config
  • 실행 git rm --cached path_to_submodule(후행 슬래시 없음)
  • 이제 추적되지 않은 하위 모듈 파일 커밋 및 삭제

이제 --name플래그가 있는 새 하위 모듈을 추가합니다 . 이렇게하면 git .git/config에 하위 모듈 에 대해 참조 할 대체 이름이 제공 되어 이전 기록에서 여전히 작업하고 싶은 하위 모듈과의 충돌을 해제 할 수 있습니다.

따라서 다음을 입력하십시오.

git submodule add --name UpdatedTestFramework git@github.com:userB/TestFramework.git

예상 한 경로에 하위 모듈이로드됩니다.


2
이 방법은 효과가 있지만 Tim의 방법만큼 깨끗하지는 않습니다.
joseph.hainline 2013 년

4
이것은 나를 위해 일했지만 나는 또한 삭제해야했습니다 .git/modules/<path_to_submodule>.
Nate

1
에 대한 참조를 감사합니다 --name. 이 문제를 둘러싼 문제를 인식하지 못했고이 옵션을 사용할 때까지 하위 모듈을 교체 할 수 없었습니다 (답변 감사).
aknuds1

이것은 나를 위해 일한 유일한 방법 이었지만 동일한 디렉토리 이름을 유지하고 싶었습니다. 올바른 경로를 체크 아웃하고 모듈 이름을 원하는 이름으로 만들었지 만 작업 디렉토리 이름은 새 저장소 이름이었습니다. 따라서 같은 이름을 원하면 URL 끝에 다음과 같이 지정해야합니다. git submodule add --name old-name-to-keep git@github.com:userB/new-repository.git old-name-to-keep
rgb

8

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

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

5

나를 위해 이것을 고친 것은 하위 모듈이 아닌 git repo의 루트에 있었으며

rm -rf .git/modules/yourmodule

그러면 정상적으로 추가 할 수 있습니다.


3

내가 찾은 가장 쉬운 방법은 다음과 같습니다.

git rm -rf [submodule_dir]
git submodule add --name new_[submodule_name] [new_submodule_url] [submodule_dir]

.gitmodules수동으로 수정하는 아이디어가 마음에 들지 않았습니다 . 나는 또한 그것에 대해 약간의 블로그 포스트 를 썼다 .


2

이 복제본에 대해서만 원격 URL을 변경하려면 다음 을 수행하십시오 .

git config submodule."$submodule_name".url "$new_url"

이것은 .gitmodules상위 프로젝트 의 파일에 영향을주지 않으므로 다른 개발자에게 전파되지 않습니다.

여기서는 "사용자 별 레코드 변경 사항"으로 설명 됩니다 .

git submodule sync다시 기본 URL로 재설정되므로실행 하지 마십시오 .

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