하위 디렉토리에 하위 모듈을 어떻게 추가합니까?


310

~/.janus/하위 모듈이 많은 자식 저장소 가 있습니다. 에 하위 모듈을 추가하고 ~/.janus/snipmate-snippets/snippets/싶지만 디렉토리 git submodule add <git@github.com:...>에서 실행할 때 snipmate-snippets다음 오류 메시지가 나타납니다.

You need to run this command from the toplevel of the working tree.

그래서 질문은 : snipmate-snippets디렉토리에 서브 모듈을 어떻게 추가 합니까?


서브 모듈 명령을 위해 git repo의 루트 디렉토리로 이동하는 것은 더 이상 필요하지 않습니다 (곧). 아래 답변을
VonC

3
git submodule add -b <branch> <url> <relative_path_4m_root>
parasrish

답변:


438

당신은 가서 ~/.janus실행 :

git submodule add <git@github ...> snipmate-snippets/snippets/

서브 모듈 (또는 일반적으로 git)에 대한 자세한 정보가 필요한 경우 ProGit 이 매우 유용합니다.


그렇지 않으면 HEAD를 추가 할 때 분기를 추가하는 것이 좋습니다
.git

1
나를 위해 이것이 원인이었습니다 'subprojects' already exists in the index (하위 프로젝트를 디렉토리 이름으로 사용했습니다) . 대신에 도움이 무엇인지는 VonC의 일을 아래에 대답, 즉이며 cd subprojects다음과 git submodule add <get@github …>경로없이.
Hi-Angel

83

git1.8.4 (2013 년 7 월) 를 시작 하면 더 이상 루트 디렉토리로 돌아갈 필요가 없습니다.

 cd ~/.janus/snipmate-snippets
 git submodule add <git@github ...> snippets

( Bouke Versteegh의 코멘트 는 사용하지 않는 것이 /.같이 snippets/.: snippets충분하다)

commit 091a6eb0feed820a43663ca63dc2bc0bb247bbae 참조하십시오 :

하위 모듈 : 최상위 요구 사항 삭제

새로운 rev-parse --prefix옵션을 사용하여 서브 모듈 명령에 제공된 모든 경로를 처리하여 저장소의 최상위 레벨에서 실행해야한다는 요구 사항을 제거하십시오.

상대 서브 모듈 URL의 해석은 " remote.origin.url"의 구성 여부에 따라 달라 지므로 git submodule add작업 트리의 최상위 레벨이 아닌 경우 " " 에서 상대 URL을 명시 적으로 차단 하십시오.

서명자 : John Keep

커밋 12b9d32790b40bf3ea49134095619700191abf1f에 따라 다름

이렇게하면 ' git rev-parse리포지토리의 지정된 서브 디렉토리에서 호출 된 것처럼 작동하며, 인쇄되는 파일 경로 앞에는 작업 트리 맨 위에서 전체 경로가 접두어로 붙습니다 .

이것은 cd작업 트리의 맨 위로 가고 싶지만 명령 줄에서 사용자가 제공 한 상대 경로를 처리해야하는 쉘 스크립트에 유용합니다 .


큰 감사합니다! 후행 /.이 필요하지 않다는 것을 알았습니다 .git 은 디렉토리 스 니펫을 만들지 않습니다.
Bouke Versteegh

@BoukeVersteegh 재미있는. 더 많은 가시성을 위해 답변에 귀하의 의견을 포함 시켰습니다.
VonC

git 버전 2.7.4에 있지만 여전히이 오류 메시지가 나타납니다 Relative path can only be used from the toplevel of the working tree. 내가하고있는git submodule add ../../../functest
FlyingAura

@ user3426358 예, 예상됩니다 : 루트 폴더뿐만 아니라 기본 리포지토리의 하위 폴더에서 git submoduel add 기능을 수행하는 것에 대한 위의 대답입니다. 서브 모듈 원격 저장소를 상대 경로로 참조하는 것은 아닙니다 . 그렇게하면 오류 메시지가 나타납니다.
VonC

@ user3426358 그리고 그 오류 메시지 ( " Relative path can only be used from the toplevel of the working tree")는 원래 질문 ( " ")의 내용 이 아닙니다 .You need to run this command from the toplevel of the working tree
VonC

17

비슷한 문제가 있었지만 GUI 도구를 사용하여 코너에 섰습니다.

파일이 몇 개있는 하위 프로젝트가 있었으므로 지금까지 자체 git repo를 확인하는 대신 복사했습니다. 하위 폴더에 리포지토리를 만들고 커밋, 푸시 등을 할 수있었습니다. 그러나 부모 저장소에서 하위 폴더는 하위 모듈로 취급되지 않았으며 파일은 여전히 ​​부모 저장소에 의해 추적되고 있습니다.

이 혼란을 피하기 위해 Git에게 하위 폴더 추적을 중단하도록 지시 해야했습니다 (파일을 삭제하지 않고).

proj> git rm -r --cached ./ui/jslib

그런 다음 거기에 하위 모듈이 있다고 말해야했습니다 (현재 git에서 추적중인 것이 있으면 할 수 없습니다).

proj> git submodule add ./ui/jslib

최신 정보

이를 처리하는 이상적인 방법은 몇 가지 단계를 더 포함합니다. 이상적으로 기존 리포지는 부모 git 모듈이없는 자체 디렉토리로 이동하여 커밋 및 푸시 한 다음 다음과 같은 하위 모듈로 추가됩니다.

proj> git submodule add git@bitbucket.org:user/jslib.git ui/jslib

그것은 표준 복제 단계를 포함하는 하위 모듈로 git repo를 복제 할뿐만 아니라 하위 모듈을 작동시키기 위해 git이 대신하기 위해 더 모호한 구성 단계를 수행합니다. 가장 중요한 차이점은 실제 git dir이 어디에 있는지에 대한 경로 참조를 포함하는 .git 디렉토리 대신 간단한 .git 파일을 거기에 배치한다는 것입니다. 일반적으로 상위 프로젝트 루트 .git / modules / jslib.

당신이 이런 식으로 일을하지 않으면 그들은 당신을 위해 잘 작동하지만, 당신이 부모를 저지르고 밀고 나자마자 다른 개발자가 그 부모를 잡아 당길 때, 당신은 그들의 삶을 훨씬 더 힘들게 만들었습니다. 자체 .git dir을 포함하는 dir의 하위 폴더에 전체 .git dir이 있으면 시스템에있는 구조를 복제하기가 매우 어렵습니다.

따라서 git add submodule은 이동, 푸시, 가장 깨끗한 옵션입니다.


16

구성 파일을 수동으로 편집하는 이상한 점을 공유하는 사람들에게는 다음을 추가 (또는 수정)해도 트릭이됩니다.

.git / config (개인 구성)

[submodule "cookbooks/apt"]
    url = https://github.com/opscode-cookbooks/apt

.gitmodules (커밋 된 공유 구성)

[submodule "cookbooks/apt"]
    path = cookbooks/apt
    url = https://github.com/opscode-cookbooks/apt

뿐만 아니라이 참조 - .gitmodules 및 서브 모듈에서 .git / config에 지정 사이의 차이점은 무엇입니까?


2

.vim 스크립트에 대한 Vundle 업데이트를 사용하여 코너에 자신을 그렸습니다. DEST하위 모듈이 포함 된 디렉토리의 경로입니다. 이 작업을 수행 한 후 수행git rm -r $DEST

DEST='path'; for file in `ls ${DEST}`; do git submodule add `grep url ${DEST}/${file}/.git/config|awk -F= '{print $2}'` ${DEST}/${file}; done

건배

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