문제

이름이 4개인 프로젝트가 있다고 가정해 보겠습니다. 핵심, , , 감독자.종속성 트리는 다음과 같습니다.

Super ---> Core
       |-> A -> Core
       |-> B -> Core

나는 각 프로젝트가 독립형이기를 원합니다. 즉, 각 프로젝트를 자체적으로(물론 각각의 종속성을 포함하여) 체크아웃하고 컴파일할 수 있기를 원합니다.

각 프로젝트를 저장소에 매핑한 다음 하위 모듈을 사용하여 종속성을 참조하는 방법을 고려했지만 해당 접근 방식에는 다음과 같은 문제가 있습니다.

  1. 체크아웃할 때 감독자 모든 종속성을 포함하여 결국 세 개의 복사본이 생성됩니다. 핵심.
  2. 하위 모듈은 완전히 독립적이므로 이 세 복사본 각각은 다른 버전을 가리킬 수 있습니다. 핵심 그러면 그건 엉망이 될 거예요.

그래서...뭔가 빠졌나요?내가 git 하위 모듈을 오해했거나 잘못 사용했나요?이 문제에 대한 다른 해결책이 있습니까(바이너리 종속성을 사용하는 것 제외)?

도움이 되었습니까?

해결책

방금 git 하위 모듈로 우선적 인 종속성이 부족하다는 것을 발견했습니다.

Super가 코어에 의존하면 코어의 의존성은 A와 B가 코어와 함께 "재정의"해야합니다.

모방하는 유일한 방법은 당신이 한 방식대로 슈퍼 프로젝트를 만드는 것입니다.
그리고 A와 B의 하위 모듈 코어를 제거합니다.
(수퍼는 이제 a '와 b', a 'a', b '가 핵심이없는 b'에 달려 있음)

다른 팁

Git 리포지토리는 각 저장소가 특정 목적을위한 독립형 엔티티 인 방식으로 상당히 원자력이어야합니다. 프로젝트 A와 B를 결합하는 것 외에 슈퍼 프로젝트의 목적은 무엇입니까? 고유 한 것이 없다면 (즉, A, B 또는 Core가 아닌 파일) 상당히 중복됩니다.

편집 : git 서브 모듈은 내가 일한 한 곳에서 특히 고통 스럽기 때문에 텍스트 파일을 통해 종속 리포지션을 추적하는 자체 종속성 시스템을 설정합니다. 우리는 그것을 설정하여 항상 특정 커밋이 아니라 지점의 헤드를 추적합니다.

우리는 모든 프로젝트가 다음과 같은 슈퍼 프로젝트의 일부인 것처럼 모든 프로젝트를 설정할 수있었습니다.

Super
|-A
|-B
|-Core

프로젝트는 상대 경로를 사용하여 서로를 참조합니다. ../A/include.h. Repo A를 확인하면 작동하지 않으면 다음과 같이 작업하기위한 또 다른 "슈퍼"리포를 만들어야합니다.

AWorking
|-A
|-Core

편집하다 GIT 에서이 동작의 또 다른 이유는 루트 리포 디렉토리 위에있는 것을 추적 할 수 없기 때문입니다 (예 : 폴더가 포함 된 폴더 위에있는 폴더 위) 같은 저장소에.

여기서 문제는 GIT 디자인과 해결하려는 문제 사이의 불일치라고 생각합니다.

git은 나무를 추적하는 데 좋습니다. 프로젝트 간의 의존성 관계는 그래프를 형성 할 수 있습니다. 나무는 그래프이지만 그래프가 반드시 나무 일 필요는 없습니다. 문제는 그래프를 효과적으로 표현하는 방법이므로 트리는 작업에 가장 적합한 도구가 아닙니다.

다음은 작동 할 수있는 접근 방식입니다.

GIT 프로젝트에는 .gitModules 디렉토리가 있으며,이 디렉토리는 커밋이 의존 할 수있는 프로젝트, 발견 할 수있는 곳 및 프로젝트 내부의 경로를 삽입 할 것으로 예상되는 "힌트"를 기록하는 .gitModules 디렉토리가 있습니다. ( http://osdir.com/ml/git/2009-04/msg00746.html )

일련의 프로젝트 에서이 정보를 읽는 스크립트를 추가하고 각 프로젝트의 .gitModules 파일에서 발견 된 힌트를 해당 프로젝트를 실제로 배치 한 파일 시스템의 위치에 맵핑 한 다음 GIT가 기대하는 경로에서 상징적 링크를 추가 할 수 있습니다. 각 프로젝트의 실제 파일 시스템 위치에 대한 하위 모듈을 확인합니다.

이 접근법은 상징적 링크를 사용하여 트리 곰팡이에서 벗어나 그래프를 작성합니다. GIT Repos에 링크를 직접 녹화하면 개별 프로젝트에 기록 된 로컬 설정과 관련된 상대 경로가 있으며 프로젝트는 원하는 것처럼 '완전히 독립적'이되지 않습니다. 따라서 Symlinks를 동적으로 빌드하는 스크립트.

나는이 접근법이 바람직하지 않은 방식으로 GIT를 방해 할 수 있다고 생각합니다. 왜냐하면 우리는 하나의 것을 찾을 것으로 예상되는 길을 가져 와서 다른 것을 대신 거기에 넣었 기 때문입니다. 어쩌면 우리는 Symlink 경로를가 디자 노르 할 수 있습니다. 그러나 이제 우리는 그 길을 두 번 쓰러 뜨리고 건조를 위반하고 있습니다. 이 시점에서 우리는 또한 하위 모듈을 사용하는 척에서 멀어졌습니다. 우리는 각 프로젝트의 다른 곳에 의존성을 기록하고 git이 기대하는 것들에 대해 .gitmodules 파일을 남겨 둘 수 있습니다. 따라서 우리는 우리 자신의 파일과 같이. 우리의 스크립트는 거기를보고 가서 상징 링크를 만들 것입니다.

흠, 나는 자체 가벼운 패키지 형식으로 Ad-Hoc 패키지 관리 시스템을 설명했을 것입니다. :)

Megamic의 제안은 나에게 git 하위 모듈을 잘 사용하는 것 같습니다. 우리는 그래프가 아닌 세트를 추적하는 것만 다루고 있으며 세트는 나무에 쉽게 맞습니다. 한 레벨의 깊은 나무는 본질적으로 부모 노드와 어린이 노드 세트입니다.

당신이 지적했듯이, 그것은 당신의 질문에 명시된 문제를 완전히 해결하지 못합니다. 우리는 다음과 같은 두 가지 유형의 "This와 함께 작동합니다"에 관심이있을 수 있습니다. . "이 프로젝트 버전 세트를 사용하여 전체 시스템을 성공적으로 테스트했습니다"라는 자체 빌드 설정에서 사용 된 문장.

Megamic의 답변 해결 (2)이지만 (1) 우리는 여전히 프로젝트가 그들의 종속성이 무엇인지 알려주기를 원합니다. 그런 다음 (1)의 정보를 사용하여 (2)로 녹화 할 수있는 버전 세트를 계산할 수 있습니다. 이것은 자체 도구를 보증하기에 충분한 문제로 패키지 관리 시스템으로 돌아갑니다. :)

내가 아는 한, 대부분의 우수한 패키지 관리 도구는 특정 언어 또는 운영 체제 사용자를 위해 만들어집니다. 루비 월드의 'gem'패키지는 번들러를 참조하고 데비안 세계의 '.deb'패키지에 대한 APT를 참조하십시오.

누구든지 'Polyglot'에 적합한 좋은 언어 중립적, OS- 중립 솔루션을 알고 있다면 ( http://blog.heroku.com/archives/2011/8/3/polyglot_platform/ ) 프로그래밍 프로젝트, 나는 매우 관심이있을 것입니다! 나는 그것을 질문으로 게시해야합니다.

다음과 같이 일관성을 관리할 수 있다고 생각합니다.모든 "핵심" 라이브러리에서 동일한 이름을 가진 "참조" 분기 또는 일련의 태그를 정의합니다(참고:귀하의 예에는 "Core" 라이브러리가 하나만 있습니다.그런 다음 하위 프로젝트(A, B,...)의 개발자에게 가능한 한 빨리 "Core"의 참조 버전으로 정기적으로 업그레이드하도록 지시하십시오.

빌드를 실행하기 전에 "Core(s)"가 A, B, C...에서 일관되게 사용되는지 쉽게 확인할 수 있습니다.깨끗하고 재귀적인 "수퍼" 최상위 체크아웃에서 다음 세 가지 명령을 실행하면 됩니다.

# 1.  Switch to the reference version (= "Force" consistency where need be)
git submodule foreach --recursive 'git checkout [origin/]reference || true'

# 2a. Show which inconsistencies you just forced; terse output
git status -s; git submodule foreach --recursive git status -s 2>/dev/null

# 2b. Same but verbose output
git submodule; git submodule foreach --recursive git submodule

# 3. Switch back to versions individually defined by sub-projects 
git submodule update --recursive

위의 "간결한 출력" 명령 2a는 Core의 "참조" 버전을 사용하지 않는 하위 프로젝트를 강조합니다.

접근 방식을 쉽게 확장하여 차이점을 표시하고, 업그레이드를 강제하거나 원하는 다른 작업을 수행할 수 있습니다.

공유 하위 모듈을 하드 링크를 사용하여 클론으로 전환하는 작은 유틸리티 작업이 작동 할 수 있습니다.

여기에서 내 전체 솔루션을 읽을 수 있습니다.https://stackoverflow.com/a/10265084/84283

나는 당신이 이미 발견 한 이유 때문에 하위 모듈로 종속성 트리를 맵핑하지 않을 것입니다.

하위 모듈은 주어진 지점의 주어진 개정을 추적하므로 일관된 모듈 세트의 스냅 샷을 제공하는 데 유용합니다.

따라서 프로젝트에 특정 버전의 다른 모듈 세트가 하나의 단위로 추적되어야하는 경우 하위 모듈로 함께 그룹화 할 수 있습니다. 그런 다음 서로 다른 버전의 모듈 세트를 태그하여 프로젝트의 기록을 제공 할 수 있습니다. 여기서 각 태그는 시점에서 호환 가능한 모듈의 어떤 버전을 보여줍니다.

 tags/
     release1/ 
           |-> A@1.0
           |-> B@1.1
           |-> C@1.2
     release2/
           |-> A@2.0
           |-> B@1.3
           |-> C@1.5

적어도 내가 그들을 이해하는 방법이지만, git이있는 대부분의 것들과 마찬가지로 아마도 그보다 훨씬 더 많은 것이있을 것입니다. 종속성 관리 측면에서, 내가 말할 수있는 것은 다른 방법을 찾는 것 뿐이며, 하위 모듈이 있거나없는 Git이 내가 이해할 수 있도록 설계된 것이 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top