svn : externals 사용하는 다른 SVN 저장소에서 두 개의 SVN 프로젝트를 사용하고 있습니다.
Git에서 동일한 저장소 레이아웃 구조를 어떻게 가질 수 있습니까?
답변
Git에는 svn : externals와 비슷하지만 정확히 같은 두 가지 접근 방식이 있습니다.
-
하위 트리 병합 은 외부 프로젝트의 코드를 저장소 내 별도의 하위 디렉토리에 삽입합니다. 이 프로세스 는 세부 설정 프로세스가 있으며 리포지토리를 체크 아웃하거나 복제 할 때 자동으로 포함되므로 다른 사용자에게는 매우 쉽습니다. 이것은 프로젝트에 의존성을 포함시키는 편리한 방법이 될 수 있습니다.
다른 프로젝트에서 변경 사항을 가져 오는 것은 쉽지만 변경 사항을 다시 제출하는 것은 복잡합니다. 그리고 다른 프로젝트를 코드에서 병합해야하는 경우 프로젝트 기록이 병합되고 두 프로젝트가 효과적으로 하나가됩니다. -
힘내 하위 모듈 ( manual )은
-r
인수가있는 svn : externals와 같이 다른 프로젝트 저장소의 특정 커밋에 연결됩니다. 하위 모듈은 설정하기 쉽지만 모든 사용자는 하위 모듈을 관리해야하며, 하위 모듈은 체크 아웃 (또는 복제)에 자동으로 포함되지 않습니다.
변경 사항을 다른 프로젝트에 다시 제출하는 것은 쉽지만 그렇게하면 저장소가 변경되면 문제가 발생할 수 있습니다. 따라서 일반적으로 개발중인 프로젝트에 변경 사항을 제출하는 것은 적절하지 않습니다.
답변
” Git 하위 모듈 새 버전 업데이트 ” 에서 언급했듯이 Git 1.8.2 하위 모듈과 동일한 SVN 외부 기능 을 얻을 수 있습니다 .
git config -f .gitmodules submodule.<path>.branch <branch>
이것은 서브 모듈이 브랜치를 따르기에 충분합니다 (서브 모듈 업스트림 repo 의 원격 브랜치의 LATEST 커밋에서와 같이 ). 당신이해야 할 일은 :
git submodule update --remote
하위 모듈이 업데이트됩니다.
자세한 내용은 ” git submodule
최신 추적 “에 있습니다.
기존 서브 모듈을 분기를 추적하는 하나로 변환하려면 : ” 깃 서브 모듈 : 분기 / 태그 지정 “의 모든 단계를 참조하십시오 .
답변
나는 길 (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를 다음 형식으로 설명합니다.
- 저장소의 고유 이름
- 저장소의 상대 경로 (.gitlinks 파일 경로에서 시작)
- git clone 명령에서 사용할 Git 저장소 저장소 브랜치
- 빈 줄이나 #으로 시작하는 줄은 구문 분석되지 않습니다 (주석으로 처리).
마지막으로 루트 샘플 저장소를 업데이트해야합니다.
# 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
자식 재귀 하위 모듈 종속성 문제 에 대해 자세히 알아보십시오 .