자식 서브 모듈과 자식 클론


18

GitHub에서 오픈 소스 프로젝트를 진행 중입니다.

하위 디렉토리 / Vendor가 있으며 여기에는 여러 외부 라이브러리 의 사본 이 있습니다. 프로젝트의 원래 관리자는 가끔이 디렉토리를 최신 외부 라이브러리 사본으로 업데이트했습니다.

한 개발자가이 복사본git submodule 로 대체 할 수있는 풀 요청을 보냅니다 .

그리고 그것이 좋은 아이디어인지 아닌지를 고려하고 있습니다.

힘내 하위 모듈 장점 :

  • 서브 모듈은 유사한 시나리오를 위해 특별히 설계되었습니다
  • 다음 업데이트 동안 덮어 쓸 공급 업체에 대한 실수로 커밋 할 가능성을 제거합니다.

힘내 하위 모듈

  • git 서브 모듈은 관리자에서 프로젝트를 복제 / 풀 할 사람으로 복잡성을 밀어 넣는 것처럼 보입니다 (프로젝트 작업을 시작하기 위해 복제 한 후 필요한 추가 단계 : "git submodule init", "git submodule update"

이것에 대한 당신의 의견은 무엇입니까?

하나 더. 이 문제는 외부 의존성이 매우 제한된 소규모 라이브러리입니다. 지금은 빌드 도구가 너무 과도하다고 생각합니다.


4
또는 git clone --recursive서브 모듈 명령을 수행 한 다음 수행 할 필요 가 없습니다. 다른 사람은이 성가신 것을 언급하지 않았습니다. 내가 아는 대부분의 사람들은 하위 모듈이 README에서 이것을 광고합니다.
Levi Morrison

답변:


9

서브 모듈에 대한 대안은 git subtree 입니다. 이를 통해 git submodule최종 사용자에게 복잡성을 미루지 않고도 이점을 얻을 수 있습니다. 타사 저장소는 기본 프로젝트 트리에 병합되지만 다음과 같은 방식으로 메타 데이터가 저장됩니다.

  • 흥미로운 변경이 이루어진 경우 나중에 타사 저장소를 추출하십시오.
  • 타사 리포지토리에서 새 업데이트 병합 덮어 쓰지 말고 )

하위 모듈을 이해하기에 정교하지 않은 Git 사용자의 경우 하위 트리 접근 방식으로 프로젝트 복제본을 다른 복제본보다 어렵지 않게 만들 수 있습니다. 설명서의 간단한 설명 :

서브 트리를 사용하면 서브 프로젝트를 기본 프로젝트의 서브 디렉토리에 포함시킬 수 있습니다 (선택적으로 서브 프로젝트의 전체 히스토리 포함).

예를 들어 라이브러리의 소스 코드를 응용 프로그램의 하위 디렉토리로 포함 할 수 있습니다.

서브 트리는 동일한 태스크를위한 서브 모듈과 혼동되어서는 안됩니다. 하위 모듈과 달리 하위 트리는 리포지토리에 특별한 구성 (.gitmodule 파일 또는 gitlink와 같은)이 필요하지 않으며 리포지토리의 최종 사용자가 특수한 작업을 수행하거나 하위 트리의 작동 방식을 이해하도록 강요하지 않습니다. 서브 트리는 원하는 방식으로 프로젝트와 커밋, 분기 및 병합 할 수있는 서브 디렉토리입니다.

하위 모듈을 사용하여 직장에서 프로젝트를 설정했으며 모든 사람의 복제본에서 하위 모듈을 최신 상태로 유지하는 데 어려움이있었습니다. 최근에 어디서나 하위 트리를 사용하기로 변경했으며 이러한 문제가 사라졌습니다.

git-subtree는 git/contrib디렉토리의 일부이며 별도로 설치해야합니다.


4

하위 모듈 사용의 한 가지 단점은 Github (및 기타 여러 서비스)의 tarball 또는 zip 아카이브에 하위 모듈의 소스가 포함되어 있지 않다는 것입니다. 즉, 아카이브는 자체 포함되어 있지 않습니다. 이는 저장소가 작고 JavaScript 라이브러리에 따라 정적 HTML 사이트와 같은 빌드 스크립트가 실제로없는 경우 문제가됩니다.


3

서브 모듈을 사용하기에 이상적인 장소입니다. 저장소의 크기와 복잡성을 줄이고 외부 라이브러리를 새 버전으로 쉽게 업데이트 할 수 있습니다.

사용 방법을 파악하기 어렵지 않고 이러한 상황에서 일반적으로 사용되므로 프로젝트의 README에서 하위 모듈과 수행 할 작업을 사용하고 사람들이 알아낼 수 있어야한다는 메모를 작성하십시오. 밖으로. 하위 모듈이있는 저장소를 처음 발견했을 때 10 ~ 15 분 안에 시작하여 실행 한 이후로 무엇을 해야할지 파악하는 데 아무런 문제가 없었습니다.


1
이에 대한 부록으로, 응용 프로그램을 초기화하지 못하면 하위 모듈이 초기화되었는지 확인하고 적절하지 않은 오류 메시지를 제공 할 수 있습니다.
Jonathan Rich

1
하위 모듈 파일이없는 zip 아카이브에 대한 Lekensteyn의 답변을 참조하십시오. 즉, 공개적으로 코드를 제공하는 경우 하위 모듈이 최선의 방법은 아니지만 복제가 보장되는 개인 코드에는 적합합니다. 그렇지 않으면 하위 트리를 선호하십시오.
엔지니어

3

서브 모듈을 사용하면 코드를 로컬로 변경할 수 없으며 외부 저장소에 대한 종속성이 생성됩니다. 당신이 확실 경우 것입니다 결코 라이브러리를 사용자 정의 또는 지방 버그 수정을 만들고 싶어하지 않으며 확신 할 수있는 외부 서버는 것입니다 항상 당신은 그들이 길을 가야하는 것입니다 새 복사본을 복제 할 때 사용할 수 있습니다.

간단히 말해서-단순히 라이브러리를 사용하고 싶습니까 아니면 코드베이스의 일부로 간주합니까? 코드가 '귀하의'코드가 아닌 경우 왜 설치해야하는 것이 아니라 버전 관리 상태입니까?


6
서브 모듈은 로컬 변경을 방해하지 않습니다. 반대로, 변경 사항을 추적하고 다른 프로젝트에서 라이브러리의 다른 버전 (비틀기 또는 라이브러리 릴리스)을 사용할 수 있습니다.
Steve Fallows
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.