Git 서브 모듈의 대안?


83

나는 Git 서브 모듈을 사용하는 것이 내 개발 워크 플로에서 다소 번거 롭다고 생각합니다. Git 하위 트리와 Gitslave에 대해 들었습니다.

  • 여러 저장소 프로젝트를위한 더 많은 도구가 있으며 어떻게 비교합니까?
  • 이러한 도구를 Windows에서 실행할 수 있습니까?

3
Git 하위 트리 병합 전략 또는 Avery Pennarun의 git-subtree 에 대해 이야기하고 있습니까? 두 가지는 근본적으로 동일하지 않습니다.
kynan


3
비공식적 인 gitslave 포크를 참조하십시오 . 2.0.2 이후로 원본보다 더 활동 적이기 를 바랍니다.
Joel Purra

1
또한이 자식-subrepo은 .
huggie

답변:


101

귀하에게 가장 적합한 것은 귀하의 필요, 욕구 및 워크 플로우에 따라 다릅니다. 그들은 어떤 의미에서 반동 형적이며, 일부는 특정 작업에 다른 것보다 사용하기가 훨씬 쉽습니다.

  • gitslave수퍼 프로젝트와 같은 시간에 하위 프로젝트를 제어하고 개발할 때 유용하며 일반적으로 모든 저장소에 태그, 분기, 푸시, 풀 등을 동시에 지정하려는 경우에 유용합니다. gitslave는 내가 아는 창에서 테스트 된 적이 없습니다. perl이 필요합니다.

  • git-submodule 은 하위 프로젝트를 제어하지 않거나 하위 프로젝트가 변경 되더라도 특정 개정판에서 하위 프로젝트를 수정하려는 경우 더 좋습니다. git-submodule은 git의 표준 부분이므로 Windows에서 작동합니다.

  • git-subtree 는 git의 기본 제공 하위 트리 병합 전략에 대한 프런트 엔드를 제공합니다. 단일 저장소 "통합"git 히스토리를 선호 할 때 더 좋습니다. 하위 트리 병합 전략과 달리 다른 (디렉토리) 트리의 변경 사항을 원래 프로젝트로 다시 내보내는 것이 더 쉽지만 gitslave 또는 git-submodule 에서처럼 자동이 아닙니다.

  • repo 는 이론적으로 gitslave와 유사하지만 내가 찾은 비 안드로이드 작업에 대해서는 잘 문서화되어 있지 않습니다. Google Android 개발 모델 전용이며 기본적으로 소수의 git 명령 만 지원하며 (임의의 명령을 실행할 수 있음) 제한된 기본 지원은 예를 들어 중앙 집중식 저장소를 지원하지 않습니다. 가지가 상당히 어려워 보입니다.

  • kitenet의 mr 는 여러 버전 제어 시스템을 사용하는 경우 사용하고 싶지만 가장 낮은 공통 분모 접근 방식으로 인해 git 전용 슈퍼 프로젝트에 대해 대부분 제한됩니다. 임의의 명령을 실행하는 방법이 있지만 잘 통합되어 있지 않습니다.


7
참고 자식 - 서브 트리 이 대답이 힘내 서브 트리 병합되지 전략에 (한 바와 같이)을 지칭 에이버리 Pennarun의 자식 - 서브 트리 근본적으로 동일하지 않다. 후자는 하위 트리에서 변경 사항을 다시 기여할 수 있도록 명시 적으로 설계되었습니다.
kynan

3
큰 고장! @kynan이 언급했듯이 "subtree merge"와 git-subtree를 구별하기 위해 수정 된 것을보고 싶습니다.
BrianTheLion

1
@Tobu : 임의의 명령을 실행할 수있는 mr의 능력을 통합 된 git 명령 지원과 동일하게 고려하지 않습니다. 나는 여기서 mr run git config ...특정 명령을 이름으로 별칭을 지정하는 구성 파일 방법 과 같 거나 아마도 (더 나쁜) 것에 대해 이야기하고 있다고 가정하고 있습니다 . 물론, man 페이지를 읽었을 때 즉시 드러나지 않았던 일부 mr 기능을 알고 있다면 그것에 대해 알고 싶습니다.
Seth Robertson

4
@kynan : 귀하의 의견 외에. Avery의 Pennarun의 git-subtree는 이제 git 1.7.11 이상에서 사용할 수 있음을 지적하고 싶습니다.
slatunje

1
@sealTrip : git/contrib. sudo make install install-doc prefix=/usr libexecdir=/usr/lib/git-coreGit 소스 트리 에서 Ubuntu에 설치합니다 ( 패키지 된 Git 에서는 작동 하지 않음 ).
kynan

1

저는 현재 타사 라이브러리와 관련된 것이 아니라 개발을 위해 하위 모듈을 사용합니다. 특히 병합 또는 리베이스 충돌의 원인 인 경우 하위 모듈을 사용하여 생활을 더 쉽게 만들 수있는 몇 가지 방법이 있습니다. ls-tree를 찾아 하위 모듈의 충돌에 관련된 2 개의 커밋을 가져옵니다. 이것은 아마도 사람들이 다루기 가장 어려운 부분 일 것입니다. 지금은 스크립팅으로 작업하기가 훨씬 쉬워집니다. 향후 버전의 Git은이를 처리하기위한 더 나은 기본 지원을 제공해야합니다.

도움이 되었기를 바랍니다.


0

다양한 언어로 종속성이있는 프로젝트에서 Git 하위 모듈을 사용할 때 비슷한 문제가 발생했습니다. 이를 처리하기 위해 우리는 Git 하위 모듈과 유사한 기능을 갖지만 성가신 워크 플로없이 선언적 버전 제어 Git 종속성을 제공하는 MDLR ( "Modular")이라는 도구를 구축하고 오픈 소스했습니다. GitHub 저장소 의 지침 / 다운로드를 통해이를 설치하고 종속성을 관리 할 수 ​​있습니다.


이 문제는 좋지 않은 것 같습니다 : github.com/exlinc/mdlr/issues/16
rjdkolb

0

일부 사용 사례의 경우 다음 두 가지 간단한 접근 방식을 각각 좋아했습니다.

  • 중첩 된 저장소. 소프트웨어 프로젝트에 각 플러그인이 자체 하위 디렉토리에있는 플러그인 메커니즘이있는 경우 이러한 플러그인 디렉토리를 git 무시하고 로컬 파일 시스템에서 각 플러그인을 자체 git 저장소로 만드는 것이 좋습니다. 이렇게하면 모든 파일이 단일 디렉토리 트리를 형성하지만 다른 git 저장소에서 관리됩니다. git을 혼동하지 않습니다.

  • 패키지 별 저장소. 일종의 소스 코드 패키지 관리 시스템 (gem / bundler, npm, pear 등)을 사용하는 소프트웨어 프로젝트의 경우 재사용 된 코드를 별도의 git 저장소에 넣은 다음 소스 패키지를 만드는 것이 합리적 일 수 있습니다. 그런 다음 패키지 관리 도구를 사용하여 상위 프로젝트에 설치합니다. 상위 프로젝트의 git 저장소에는 필요한 패키지 및 해당 버전에 대한 참조 만 포함되며, 이러한 패키지의 실제 코드는 다른 모든 패키지 및 외부 라이브러리와 마찬가지로 git 무시됩니다. 위에서 제안한 중첩 된 저장소와 비교하면, 설치할 패키지 버전을 지정할 수 있으므로보다 정교한 접근 방식입니다.

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