SVN : Git에서 외부와 동등한가?


177

svn : externals 사용하는 다른 SVN 저장소에서 두 개의 SVN 프로젝트를 사용하고 있습니다.

Git에서 동일한 저장소 레이아웃 구조를 어떻게 가질 수 있습니까?


Git 서브 모듈을 살펴 봐야한다 . 당신이 찾고있는 것을 거의 정확하게 허용해야합니다.
foxxtrot

7
지난 4 년 동안 누구든지 이것에 대한 새로운 해답을 가지고 있습니까, 아니면 오늘날 자식 세계가 동일합니까?
DougW

4
@DougW 예, 아래에 새로운 답변이 있습니다 : git submodule이제 svn:external2013 년 3 월부터 에뮬레이션 할 수 있습니다 .
VonC

최신 버전의 Git 에 대해서는 공식 Git 문서에서 Git 서브 모듈 에 대해 읽어 보길 권한다 .
Bulki S Maslom

답변:


134

Git에는 svn : externals와 비슷하지만 정확히 같은 두 가지 접근 방식이 있습니다.

  • 하위 트리 병합 은 외부 프로젝트의 코드를 저장소 내 별도의 하위 디렉토리에 삽입합니다. 이 프로세스세부 설정 프로세스가 있으며 리포지토리를 체크 아웃하거나 복제 할 때 자동으로 포함되므로 다른 사용자에게는 매우 쉽습니다. 이것은 프로젝트에 의존성을 포함시키는 편리한 방법이 될 수 있습니다.
    다른 프로젝트에서 변경 사항을 가져 오는 것은 쉽지만 변경 사항을 다시 제출하는 것은 복잡합니다. 그리고 다른 프로젝트를 코드에서 병합해야하는 경우 프로젝트 기록이 병합되고 두 프로젝트가 효과적으로 하나가됩니다.

  • 힘내 하위 모듈 ( manual )은-r인수가있는 svn : externals와 같이 다른 프로젝트 저장소의 특정 커밋에 연결됩니다. 하위 모듈은 설정하기 쉽지만 모든 사용자는 하위 모듈을 관리해야하며, 하위 모듈은 체크 아웃 (또는 복제)에 자동으로 포함되지 않습니다.
    변경 사항을 다른 프로젝트에 다시 제출하는 것은 쉽지만 그렇게하면 저장소가 변경되면 문제가 발생할 수 있습니다. 따라서 일반적으로 개발중인 프로젝트에 변경 사항을 제출하는 것은 적절하지 않습니다.


17
참고로, 이제 svn : externals를 사용하여 특정 개정판을 지정할 수 있습니다 (1.5 또는 1.6 이후로 생각하십니까?)
Nate Parsons

9
참고로, git 서브 모듈은 자동으로 관리되고 커밋 될 수 있습니다. git은 .gitignore 파일처럼 커밋 할 수있는 .gitmodules 파일을 만듭니다. 자세한 내용은 [ git-scm.com/book/en/Git-Tools-Submodules] 를 참조하십시오.
mikijov

5
@NateParsons 항상로 정확한 개정 번호를 지정할 수 svn:externals있었습니다. 개정판 1.5에서는 구문이보다 유연한 형식으로 변경되었습니다. 추가 된 것은 상대 URL 주소 지정이었습니다.
David W.

@NateParsons하지만 git 서브 모듈로 수정을 생략 할 수 있습니다 ...> _>
Trejkaz

외관 : 나는 SVN과 마찬가지로 자식 서브 모듈 단일 파일 수 없습니다 생각
user1911091

38

" Git 하위 모듈 새 버전 업데이트 " 에서 언급했듯이 Git 1.8.2 하위 모듈과 동일한 SVN 외부 기능 을 얻을 수 있습니다 .

git config -f .gitmodules submodule.<path>.branch <branch>

이것은 서브 모듈이 브랜치를 따르기에 충분합니다 (서브 모듈 업스트림 repo 의 원격 브랜치의 LATEST 커밋에서와 같이 ). 당신이해야 할 일은 :

git submodule update --remote

하위 모듈이 업데이트됩니다.

자세한 내용은 " git submodule최신 추적 "에 있습니다.

기존 서브 모듈을 분기를 추적하는 하나로 변환하려면 : " 깃 서브 모듈 : 분기 / 태그 지정 "의 모든 단계를 참조하십시오 .


과 같은 부분 점검을 할 수 있습니까 svn:externals?
nowox

예 @nowox, 당신은 스파 스 체크 아웃을 할 수 있습니다 (자식 1.7+ stackoverflow.com/a/2372044/6309 ) (서브 모듈에 관련된 stackoverflow.com/a/17693008/6309 )
VonC

불행하게도 모든 스파 스 체크 아웃 관련 답변 ... 어떤 예 :( 나는 이것에 대한 요점 예를 작성하려고합니다을주지 않을
nowox

여전히 문제가 있습니다. 하나의 작은 부분 만 필요한 저장소의 전체 히스토리를 가져와야합니다. 필자의 경우 2GB보다 100kB입니다. 물론 사용할 수는 --depth있지만 실제로 문제를 해결하지는 못합니다.
nowox

@nowox 사용 사례가 무엇인지 정확하게 설명하는 새로운 질문을하는 것이 가장 좋습니다. 2GB 저장소가 하위 모듈인지 또는 하위 모듈이있는 기본 저장소인지, 정확히 추출해야하는 것이 무엇인지 전혀 모르겠습니다.
VonC

3

나는 길 (git links) 도구 의 저자입니다

문제에 대한 대체 솔루션이 있습니다- 길 (git links) 도구

복잡한 자식 리포지토리 종속성을 설명하고 관리 할 수 ​​있습니다.

또한 git 재귀 서브 모듈 종속성 문제에 대한 솔루션을 제공합니다 .

다음 프로젝트 종속성이 있다고 가정하십시오. 샘플 git 저장소 종속성 그래프

그런 다음 .gitlinks리포지토리 관계 설명으로 파일을 정의 할 수 있습니다 .

# Projects
CppBenchmark CppBenchmark https://github.com/chronoxor/CppBenchmark.git master
CppCommon CppCommon https://github.com/chronoxor/CppCommon.git master
CppLogging CppLogging https://github.com/chronoxor/CppLogging.git master

# Modules
Catch2 modules/Catch2 https://github.com/catchorg/Catch2.git master
cpp-optparse modules/cpp-optparse https://github.com/weisslj/cpp-optparse.git master
fmt modules/fmt https://github.com/fmtlib/fmt.git master
HdrHistogram modules/HdrHistogram https://github.com/HdrHistogram/HdrHistogram_c.git master
zlib modules/zlib https://github.com/madler/zlib.git master

# Scripts
build scripts/build https://github.com/chronoxor/CppBuildScripts.git master
cmake scripts/cmake https://github.com/chronoxor/CppCMakeScripts.git master

각 줄은 git link를 다음 형식으로 설명합니다.

  1. 저장소의 고유 이름
  2. 저장소의 상대 경로 (.gitlinks 파일 경로에서 시작)
  3. git clone 명령에서 사용할 Git 저장소 저장소 브랜치
  4. 빈 줄이나 #으로 시작하는 줄은 구문 분석되지 않습니다 (주석으로 처리).

마지막으로 루트 샘플 저장소를 업데이트해야합니다.

# Clone and link all git links dependencies from .gitlinks file
gil clone
gil link

# The same result with a single command
gil update

결과적으로 필요한 모든 프로젝트를 복제하고 적절한 방식으로 서로 연결합니다.

하위 링크 리포지토리의 모든 변경 사항이있는 일부 리포지토리의 모든 변경 사항을 커밋하려면 단일 명령으로 수행 할 수 있습니다.

gil commit -a -m "Some big update"

풀, 푸시 명령은 비슷한 방식으로 작동합니다.

gil pull
gil push

Gil (git links) 도구는 다음 명령을 지원합니다.

usage: gil command arguments
Supported commands:
    help - show this help
    context - command will show the current git link context of the current directory
    clone - clone all repositories that are missed in the current context
    link - link all repositories that are missed in the current context
    update - clone and link in a single operation
    pull - pull all repositories in the current directory
    push - push all repositories in the current directory
    commit - commit all repositories in the current directory

자식 재귀 하위 모듈 종속성 문제 에 대해 자세히 알아보십시오 .


1
게시물의 맨 위에 자신이 작성자라는 고지 사항을 명시해야합니다 gil.
Daniel Kamil Kozar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.