자식 서브 모듈 이름 바꾸기


156

자식 서브 모듈 디렉토리의 이름을 바꾸는 쉬운 방법이 있습니까? ( 삭제 하고 새로운 대상 이름으로 다시 추가 하는 전체 동작을 수행 하는 것 제외).

그리고 우리가있는 동안 부모 디렉토리에서 단순히 다음을 수행 할 수없는 이유는 무엇입니까? git mv old-submodule-name new-submodule-name


6
.gitmodules하위 모듈을 이동할 때 더 이상 수동으로 업데이트 할 필요가 없습니다 . 아래 내 답변을
VonC


힘내 모듈이 너무 복잡합니다. npm간단한 작동 방식을 보여줍니다. 언젠가 ... 어쩌면 ... 누군가 ... 재 작성할 것입니다 ...
Rolf

@VonC의 대답은 오늘날의 전체 이야기가 아닙니다. 실제로 .gitmodules가 변경되지만 모듈 이름이 아닌 경로의 이름 만 변경됩니다. 당신은 수정 .gitmodules에 추가 편집을 필요로하는과 '자식 서브 모듈 동기화'전체 과정을 완료
zertyz

@zertyz : [submodule "name_of_submodule"] 속성은 Git 내부 이름입니다. 혼동하지 않기 위해 이름을 바꿀 수 있지만 레이블 일뿐입니다.
MKesper

답변:


101

다음 워크 플로가 작동하는 것을 발견했습니다.

  • .gitmodule 업데이트
  • mv oldpath newpath
  • git rm oldpath
  • git add newpath
  • git submodule sync

참고 :이 방법은 2018 버전의 GIT에서 인덱스 및 .gitmodule을 올바르게 업데이트하지 않습니다.

참고 : VonC답변git mv oldpath newpath 에서 지적했듯이 지금 바로 할 수 있습니다 . (최신 버전의 git을 사용하고 있는지 확인하십시오)


22
자기 메모 : git add newpath슬래시를 사용하지 마십시오
atomules

10
이러한 워크 플로에서는 하위 모듈로 사용하는 하위 디렉토리에 대한 심볼릭 링크 만 만듭니다. Symlink는 전역 하위 모듈 기능의 일부입니다. 이는 이름이 바뀐 서브 모듈을 사용하는 저장소를 복제 할 때 다음 오류로 끝날 수 있음을 의미합니다. 있음을 의미합니다. 경로 'your-oldpath'에 대한 .gitmodules에 서브 모듈 맵핑이 없습니다. oldpath (* git rm oldpath ) 를 제거한 후 사용 자식 서브 모듈 추가 REPO-URL을하는 newpath을 대신 자식 추가하는 newpath "의 * 완료되면, 자식 상태가이 같은 표시됩니다 : 이름 :. oldpath는 -> newpath을
베르트랑

5
이 솔루션은 git add 명령을 사용할 때 하위 모듈이 아닌 간단한 디렉토리로 하위 모듈이 프로젝트에 포함 되었기 때문에 작동하지 않습니다. try $ mv submodule-oldpath ~ / 다른 위치 $ git rm submodule-oldpath $ git submodule submodule-repository-URL submodule-newpath 추가 bcachet.github.io/development/2012/05/25/rename-git-submodule
Mahmoud Adam

3
작업 트리에 문제가 있으면 편집 할 수도 있습니다. .git/modules/SUBMODULE/configworktree 있는 경우 올바른 디렉토리를 다시 가리 키도록 파일을 .
Vincent Ketelaars

3
이것은 git과 함께 작동하지 않았습니다 2.13.1. 그러나 단순히 git mv old new매력처럼 작동합니다. 변경 사항을 완료하기 위해 git commit 만하면됩니다.
사용자

226

Git1.8.5 (2013 년 10 월)는 프로세스를 단순화해야합니다 . 간단히 :

git mv A B

" git mv A B", 서브 모듈 A을 이동할 때 작업 트리.gitmodules재배치하고 파일 의 경로를 조정하는 방법을 배웠 습니다 .


커밋 0656781fadca1 에서 더 많은 것을보십시오 :

현재 git mv서브 모듈에서 " "를 사용 하면 서브 프로젝트의 작업 트리가 슈퍼 프로젝트의 작업 트리로 이동합니다. 그러나 서브 모듈의 경로 설정 .gitmodules은 그대로 유지됩니다. 이는 현재 작업 트리와 일치하지 않으며 올바른 path -> name mapping(와 같은 statusdiff) 에 의존하는 git 명령이 이상하게 작동합니다.

"하자 git mv"단지 서브 모듈의 작업 트리를 이동뿐만 아니라 업데이트하지 않음으로써 여기에 도움 " submodule.<submodule name>.path로부터"설정 .gitmodules파일 및 단계를 모두.
이것은 .gitmodules파일을 찾을 수 없을 때 발생 하지 않으며이 서브 모듈에 대한 섹션이 없을 때만 경고를 발행합니다. 이는 사용자가 .gitmodules파일 없이 일반 gitlink를 사용 하거나 "git mv"명령을 실행하기 전에 이미 경로 설정을 직접 업데이트 했기 때문입니다 (이 경우 경고 mv는 사용자 에게 해당 작업을 수행했음을 경고 합니다). 발견되고 병합 충돌이 포함 된
경우에만 명령이 실패하고 사용자에게 다시 시도하기 전에 충돌을 해결하도록 지시합니다..gitmodulesmv


자식 git mv모듈 git 2.9 (2016 년 6 월)가 개선 됩니다 :

Stefan Beller ( )의 commit a127331 (2016 년 4 월 19 일)을 참조하십시오 . ( 주니 오 C 하마노 합병) --stefanbeller
gitster9cb50a3 커밋 2,016 29 사월)

mv: 중첩 하위 모듈 이동 허용

" git mv old new"가 디렉토리 내의 서브 디렉토리로 존재하는 서브 모듈의 경로를 old/올바르게 조정하지 않았습니다 .

그러나 서브 모듈은 .gitmodules파일에 대한 업데이트뿐만 아니라 git 디렉토리에 대한 링크도 업데이트해야 합니다.


자기 자신에 대한 참고 사항 : 1.8.4에서 이것을 시도하면 fatal: source directory is empty, source=my_source, destination=my_destination. 1.8.5에 안정적인 릴리스가 있으면 다시 시도하십시오.
체크섬

@checksum 그러나 1.8.5는 적어도 몇 시간 동안 안정적인 릴리스를 제공합니다.) github.com/git/git/releases/tag/v1.8.5
VonC

우분투 저장소에 Git v.1.7.5가 있기 때문에 소스 코드에서 Git 버전 1.8.5.GIT를 빌드해야했습니다. 소스 코드에서 Git을 빌드하는 방법
Maksim Dmitriev

2
@ MaksimDmitriev 그러나 stackoverflow.com/a/20918469/6309 에서 언급 한 ppa (개인 패키지 아카이브)는 어떻습니까?
VonC

2
git mv는 내 컴퓨터 에서이 목적으로 작동하지 않습니다.
Alexander Dyagilev


11

위의 제안 중 일부를 시도했습니다. 나는 뛰고있어:

$ git --version
git version 1.8.4

하위 모듈을 초기화 해제하고 디렉토리를 제거하고 새 하위 모듈을 만드는 것이 가장 좋습니다.

git submodule deinit <submodule name>

git rm <submodule folder name>

git submodule add <address to remote git repo> <new folder name>

적어도 그것이 저에게 가장 효과적이었습니다. YMMV!


7

이름을 바꿀 수 없으므로 먼저 제거 deinit하고 다시 추가해야합니다.

따라서 제거한 후 :

git submodule deinit <path>
git rm --cached <path>

다음에서 참조를 다시 확인하고 제거 할 수도 있습니다.

  • .gitmodules
  • .git/config
  • .git/modules/<name>각 폴더에는 config참조를 유지하는 파일 이 있으므로 참조 폴더를 (백업하는 것이 가장 좋습니다) 에서 제거하십시오.worktree

그런 다음 리포지토리에 대한 변경 사항을 커밋하여 변경 사항을 준비하십시오.

git commit -am 'Removing submodule.'

다음을 통해 미해결 문제가 없는지 다시 확인하십시오.

git submodule update
git submodule sync
git submodule status

이제 자식 서브 모듈을 다시 추가 할 수 있습니다 :

git submodule add --name <custom_name> git@github.com:foo/bar.git <my/path>

또한 실제로 오늘입니다
Alexey

질문 제목은 잘못된 것이며, 이름이 아닌 경로와 관련이 있습니다.
Max Robbertze

3

.gitmodules 파일을 편집하여 서브 모듈의 이름을 바꾸고 서브 모듈 디렉토리의 이름을 바꾸십시오.

git submodule sync나중에 해야 할 것 같지만 지금 확인해야 할 입장이 아닙니다.


이것은 새로운 서브 모듈 이름이 이름 변경이 아닌 새로운 커밋으로 발생하게합니다. 그러나 아마도 이것이 있어야하는 방법입니까?
Lars Tackmann

1
@Lars : 이전 서브 모듈 디렉토리도 제거하십시오!
Cascabel

3

MacOs : VonC 솔루션 을 사용 하여 하위 모듈 폴더 Common를 소문자 로 변경하려면 다음을 수행하십시오.

git mv Common common

나는 얻다

치명적 : '공통'이름 바꾸기 실패 : 잘못된 인수

해결책-임시 폴더 이름을 사용하고 두 번 이동하십시오.

git mv Common commontemp
git mv commontemp common

그게 다야 :)

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