중첩 된 Git 리포지토리?


181

Git 리포지토리를 중첩 할 수 있습니까? 나는 가지고있다:

 /project_root/
 /project_root/my_project
 /project_root/third_party_git_repository_used_by_my_project

그것은 이해가됩니까 로컬에서 모든 관리를 쉽게하기 위해 또는 내가 관리해야 할 별도로 제 3 자 하나?git init/add/project_rootmy_project

답변:


159

submodules 라는 Git 기능을 찾고있을 것 입니다. 이 기능은 기본 저장소 내에 중첩 된 종속 저장소를 관리하는 데 도움이됩니다.


43
상대 git 초보자로서,이 블로그 / 튜토리얼이 chrisjean.com/2009/04/20/ 을 이해하는 것이 더 쉽다는 것을 알았 습니다.… 헬퍼 쉘 스크립트의 컨텍스트를 갖는 대신 git에만 집중하면 더 간단한 접근법이 필요합니다. 읽는 것이 더 쉽다는 것을 알았습니다.
John K

4
chrisjean.com 블로그는 블로그를 따라 온 것에 근거한 최신 기사가 아닙니다. Greg의 wiki 포스트는 조금 더 복잡 할 수 있지만, git 초보자로서 나는 단순함보다 정확한 것을 선호합니다.
sage

블로그는 현재 잘 작동하는 것 같고, 불행하게도 세이지에게는 의견에 대한 34 개의 찬성 투표가 블로그 기사에 가치가 있다는 데 동의 한 것으로 보입니다. 명확성과 작업 별 조언을 위해 정확성을 희생 할 필요는 없습니다. 그것을 읽은 후에 저자는 이미 약간의 연구를 했고 kernel.org 위키 페이지뿐만 아니라 실제 Git 문서를 읽었을 것입니다 . 완전히 맥락화 된 예제에서 블로그 작성자의 Git 지향 설명은 많은 개인에게 매우 도움이 될 것 같습니다 ...
Matthew Weber

13
위에서 언급 한 chrisjean 링크가 죽었다는 BTW. 업데이트 된 링크는 chrisjean.com/git-submodules-adding-using-removing-and-updating
sprksh

35

써드 파티 라이브러리를 별도의 저장소에 배치하고 서브 모듈을 사용하여 라이브러리를 기본 프로젝트와 연관 ​​시키십시오. 다음은 연습입니다.

http://git-scm.com/book/en/Git-Tools-Submodules

리포지토리를 분할하는 방법을 결정할 때 보통 수정 빈도를 기반으로 결정합니다. 타사 라이브러리이고 변경 사항 만 최신 버전으로 업그레이드하는 경우 기본 프로젝트와 확실히 분리해야합니다.


22

완전성을 위해 :

또 다른 해결책이 있습니다. 하위 트리 병합 .

하위 모듈과 달리 유지 관리가 더 쉽습니다. 일반적인 방법으로 각 저장소를 작성합니다. 기본 저장소에있는 동안 다른 저장소의 마스터 (또는 다른 브랜치)를 기본 디렉토리의 디렉토리에 병합하려고합니다.

$ git remote add -f OtherRepository /path/to/that/repo
$ git merge -s ours --no-commit OtherRepository/master
$ git read-tree --prefix=AnyDirectoryToPutItIn/ -u OtherRepository/master
$ git commit -m "Merge OtherRepository project as our subdirectory"`

그런 다음 다른 저장소를 디렉토리로 가져 와서 업데이트하려면 서브 트리 병합 전략을 사용하십시오.

$ git pull -s subtree OtherRepository master

나는 수년간이 방법을 사용하고 있는데, 그것은 효과가있다 :-)

하위 모듈과 비교하는 것을 포함 하여이 방법에 대한 자세한 내용은이 git howto doc 에서 찾을 수 있습니다 .


자식 책에 대한 하위 트리 병합 참조가 더 이상 작동하지 않습니다. 현재 이것은 링크 인 것으로 보입니다 : git-scm.com/book/en/v2/…
ericx

18

당신은 추가 할 수 있습니다

/project_root/third_party_git_repository_used_by_my_project

/project_root/.gitignore

이렇게하면 중첩 된 리포가 상위 리포지토리에 포함되지 않으며 독립적으로 작업 할 수 있습니다.

그러나 사용자가 부모 리포지토리에서 git clean -dfx를 실행하면 무시 된 중첩 리포지토리가 제거됩니다. 다른 방법은 폴더를 심볼릭 링크하고 심볼릭 링크를 무시하는 것입니다. 그런 다음 git clean을 실행하면 symlink가 제거되지만 'nested'저장소는 실제로 다른 곳에 상주하므로 그대로 유지됩니다.



5

요약.

자식 저장소를 중첩 할 수 있습니까?

예. 그러나 기본적으로 git은 .git중첩 저장소 의 폴더를 추적하지 않습니다 . Git에는 중첩 리포지토리 (읽기)를 관리하도록 설계된 기능이 있습니다.

로컬로 모든 것을 쉽게 관리하기 위해 git init / git init를 추가하거나 / project_root를 추가하는 것이 합리적입니까? 아니면 my_project와 타사를 별도로 관리해야합니까?

git에 중첩 리포지토리를 관리하는 기능이 있기 때문에 아마도 의미가 없습니다. 힘내 중첩 된 저장소가 관리하는 기능을 기본적으로 제공 submodule하고 subtree.

여기 에 주제에 대한 블로그가 있으며 여기에 각각의 장단점을 다루는 SO 질문 이 있습니다.


2

프로젝트 당 하나의 저장소를 사용합니다. 이렇게하면 내역을 쉽게 찾아 볼 수 있습니다.

또한 사용중인 타사 라이브러리의 버전을 사용하여 프로젝트 저장소에 체크인합니다.

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