2011-02-15 5 views
10

두 개의 프로젝트가 있습니다 (A & B). 둘 다 프로젝트 공통을 사용합니다. 나는 서브 모듈을 통해 A & B에 Common을 포함시키고 자한다. 그 이유는 Common에 의존하고있는 각각의 커밋을 A & B에 직접 묶을 수 있기 때문이다.Git 서브 모듈에서 직접 개발할 수 있습니까?

이전에는 팀에서 이와 같은 하위 모듈을 사용하려고했지만, 원활하게 작동하지 못했습니다. 우리는 서브 모듈 자체에서 공통 코드를 개발 중이었습니다. 서브 모듈에서 커밋하는 &하지만 우리는 동일한 프로젝트 (C : \ dev \ A, C : \ dev \ Common) 아래에서 모든 프로젝트를 수행하는 데 많은 문제가있었습니다.

서브 모듈이 어떻게 사용되어야하는지 잘 모르겠지만 서브 모듈에서 공통 코드를 직접 개발할 수 없다면 개발하기가 더 어렵지 않습니까? 누군가 서브 모듈의 적절한 사용법을 설명해 주시겠습니까?

+0

매우 밀접하게 관련된 : [고도로 결합 된 git submodules] (http://stackoverflow.com/questions/3712917/highly-coupled-git-submodules). 나는 실제로 그 설정을 사용하기 시작하지 않았다. (나의 동료는 병합 방법을 간신히 알기 때문에 나를 깜짝 놀라게한다.) 그러나 당신을 도울 수있는 몇 가지 갈고리가있다. – Cascabel

+0

@ 제프롬미 - 우! 동료들과 어디서 왔는지 알아.나는이 작업을 진행하는 것을 조금 주저하고있다. 다만, 프로덕션 지점의 공통 코드에서 버그를 패치 할 수 있다는 점에서 많은 확신을 줄 것이라고 생각한다. 링크 주셔서 감사합니다! – kelloti

답변

6

서브 모듈에서 직접 개발할 수 있습니다 ("true nature of submodules"에서 설명했듯이).
하지만 하위 모듈에서 뭔가를 커밋하고 (어딘가에 게시 할 때마다) 상위 저장소에서 커밋해야합니다.

  • 재귀
     
    A 
        Common 
        (Common could depend itself on other dependencies) 
    B 
        Common 
        ... 
    
    • 또는 직접 (직접 의존성 만)
    을 포함
포함

이제 두 개의 서브 모듈 조직이

 
ParentA 
    A 
    Common 
    Other A dependencies 
ParentB 
    B 
    Common 
    Other B dependencies 

당신이 구조 필수적가없는 한

(사실, Common 경우 Common 및 모든 직접 종속성으로 참조합니다 A 또는 B는 "ParentCommon"에 달려 자체의 종속성을했다) 여기서 Common해야A의 하위 디렉토리 여야합니다. C:\dev\A, C:\dev\Common에 가까운 두 번째 조직을 추천합니다.

사실, 난 ParentA, 나는이 서브 모듈로, 모든 의존성, 직접 및 간접 목록 만 한 깊이 종속을 선호합니다.

어떤 도구가 종속성을 관리하는 시도와 함께, 당신은 여전히에 결정을 내릴 필요가 있기 때문이다

:

  • 의존성 충돌 (AZ1 필요 X에 따라 달라지며 Z2 필요 Y : 버전 Z 프로젝트에서 사용/컴파일 하시겠습니까?AA 반면, Z1을 필요로 X에 의존하는 경우)
  • 종속 오버라이드 (도 ... A 사용 C에 의존 B에 따라 다릅니다 곳 (X2)
  • 종속 사이클을 사용하는 A를 선택!)
+0

'직접 포함'은 서브 모듈을 사용합니까? – kelloti

+0

@kelloti : 예, 하위 모듈은 'ParentCommon'과 같이 나열됩니다. – VonC

4

서브 모듈은 여기에서 의도 한대로 특히 부드럽게 작동하는 것이 아닙니다. 당신은 아마 눈치 챘을 때, (아마도 영원히, 힘내 V1.7 기준) 서브 모듈에서 프로젝트에 대한 변경을 커밋하려면 다음을 수행해야합니다

  1. 는 서브 모듈의 변화를 확인합니다.
  2. 하위 모듈에 커밋하여 새 SHA 해시를 가져옵니다.
  3. 외부 프로젝트의 .gitmodules 파일을 새 해시로 업데이트하십시오.
  4. 외부 프로젝트에 커밋하십시오.

하위 모듈과 외부 프로젝트를 록 스텝으로 개발할 경우이 작업은 번거로울 수 있습니다. 코드베이스를 혼합 할 때 단순함보다 안정적인 소프트웨어 구성을 선호하는 것이 "올바른 방법"이지만 명령 시퀀스는이 경우 병리학 적으로 길다.

터지는 스택 왜하지만, 서브 모듈 와 록 스텝 개발 아마 몇 가지 큰 문제 중 하나를 나타냅니다

  • 당신은 당신의 하위 구성 요소 사이에 명확한 인터페이스를 가지고 있지 않고, 구현 세부 사항은 경계를 넘어 누출.
  • 하위 구성 요소에 대해 잘 생각한 인터페이스가 없으므로보다 흥미로운 문제를 해결할 때 계속 재발견해야합니다.
  • 인터페이스가 안정적이고 고품질이지만 하위 모듈 코드에 대한 품질 보증 프로세스가 좋지 않으므로 다른 작업을 수행하는 동안 계속해서 문제를 해결할 수 있습니다.
  • (A와 B가 다른 것을 계속 변경하는 경우) "공통"코드는 실제로 생각보다 훨씬 작거나 다르게 나누어 져야합니다. 이러한 경우의

아무도 당신의 반드시 해당하지 않지만이는 데있어 끔찍한 록 스텝 서브 모듈 업데이트 워크 플로우를 일으키는 원인이되는 문제들입니다. 서브 모듈은 꽤 잘 작동합니다. 거의은 공유 라이브러리와 헤더 파일을 사용하지만 근원에서 컴파일하기 위해서는 (예 : 이상한 컴파일 플래그가 있어야합니다.) 내 접근 방식은 실제 문제의 근본 원인 인 경우 이러한 문제를 해결하는 것입니다.

그러나 이러한 문제가없는 경우 잘못된 도구 일 수 있습니다. 그것은 내게 말하기가 힘들지만, 이것은 확실히 가능합니다.

+1

즉, 소스 종속성은 관리하기가 어렵지만 소스 (빌드) *의 특정 버전에 의존하는 바이너리 종속성이 더 좋습니다. 어떤 경우에는 Git 외부의 저장소 (예 : Nexus)를 통해 바이너리를 참조해야한다. – VonC

+0

우리의 프로세스가 가지고있는 문제에 상관없이 단순히 프로젝트 A의'a5b2c79'가 Common의'7fc95b6'을 필요로한다는 것을 아는 것은 생산 및 개발 분야를 유지하는 데있어 가치가 있습니다. – kelloti

+0

@kelloti 제 말은, 괜찮아요. 자식의 장점이 너무 강하면, 다른 것을 고쳐야 할 것입니다. a) 코드베이스 수정에 투자하고, 잠금 단계 개발을 피하십시오. 또는 b) 도구를 만들기 위해 일부 후크 나 스크립트 (아마도 Jefromi가 연결된 종류)를 사용하십시오. –

관련 문제