25

중앙 집중식 SCM 시스템에서 GIT로 전환하고 있습니다. 좋아, 내가 어느 것을 인정할 것이다, 그것은 Visual SourceSafe이다. 그래서 Git 명령어와 워크 플로우의 학습 곡선을 넘어서서, 현재 내가 직면하고있는 가장 큰 문제는 여러 저장소의 단일 또는 일부 특성과 관련하여 현재 저장소를 Git으로 마이그레이션하는 방법이다.전통적인 n 계층 설계에서 여러 프로젝트가있는 Git 저장소에 대한 베스트 프랙티스

나는이 질문을 여러 가지 방법으로 묻는 것을 보았지만 일반적으로 기본적인 것 ... "저급 라이브러리를 공유하려는 응용 프로그램이 있습니다."그리고 미리 준비된 응답은 항상 "별도의 저장소 사용"이며//이 패턴을 언제/왜 사용해야하는지에 대한 많은 설명없이 "Git submodules 사용하기"(그것이 무엇을 극복합니까, 그것은 무엇을 제거합니까?) 지금까지 제한된 지식/Git에서 읽은 것에서는 서브 모듈 자체가있을 수 있습니다 특히 Git을 처음 접한 사람에게 악마가 싸울 수 있습니다.

그러나 아직 뻔뻔스럽게 묻는 질문은 "각 계층이 자체 프로젝트 인 기존의 n 계층 개발 (UI, 비즈니스, 데이터 및 공유 도구)이있을 때, 하나 또는 여러 개의 저장소를 사용합니까? " 거의 항상, 새로운 '기능'이 추가되면 코드가 각 레이어을 통해 리플 (ripple)을하기 때문에 나에게 명확하지 않습니다.

Git과 관련된 문제를 복잡하게하기 위해 우리는 개발자의 관점에서보다 관리하기 쉬운 프로젝트/구성 요소를 만들기 위해이 프레임 워크를 '프레임 워크'에 복제했습니다. 이 토론의 목적을 위해 전체 '제품'을 나타내는 이러한 프로젝트/레이어 '타히티'컬렉션을 호출 할 수 있습니다.

우리 셋업의 마지막 '레이어'는 타히티를 맞춤형/확장하는 클라이언트 웹 사이트/프로젝트를 추가 한 것입니다.

/Clients 
    /Client1 
    /Client2 

/UI Layer 
    /CoreWebsite (views/models/etc) 
    /WebsiteHelper (contains 'web' helpers appropriate for any website) 
    /Tahiti.WebsiteHelpers (contains 'web' helpers only appropriate for Tahiti sites) 

/BusinessLayer (logic projects for different 'frameworks') 
    /Framework1.Business 
    /Framework2.Business 

/DataLayer 
    /Framework1.Data 
    /Framework2.Data 

/Core (projects that are shared tools useable by any project/layer) 
    /SharedLib1 
    /SharedLib2 

우리는 여러 프로젝트와 전통적인 n 계층 디자인에 확장 한 방법을 설명 후, 나는 당신이 만든 어떤 결정에 어떤 경험을 찾고 있어요 : 같은 폴더 구조에서이 대표하는 최고의 보일 수 있습니다 비슷한 상황 (심지어 간단한 UI, 비즈니스, 데이터 분리 모두 당신이 사용했던 것)과 당신의 결정 때문에 더 쉽고/힘들었습니다. 서브 모듈에 약간의 고통이있을 수있는 방법에 대한 예비 시험에 내가 맞습니까? 혜택을받을 가치가있는 것보다 더 많은 고통이 있습니까?

내 직감은 Tahiti ('클라이언트 프로젝트'를 제외한 모든 프로젝트)에 대한 하나의 저장소에 대한 것이고 각 클라이언트에 대한 하나의 저장소입니다. 내가 생각하는 전체 타히티 소스는 < 10k 파일이어야합니다. 다음은 개인의 프로젝트/파일 '대'기능 '의 역사를 추적 할, 심지어 우리의 사업 분리와 힘내에서 즉, 내 추론 (그리고 나는 비판 환영)

  • 그것은 나에게 보인다' 기능 '은 항상 여러 프로젝트에 걸쳐 있습니다.
  • 핵심 사이트에서 코딩 된 '기능'은 거의 항상 핵심 웹 사이트와 모든 프로젝트에 '프레임 워크'(예 : CoreWebsite, Framework1.Business, Framework1.Data)를 최소한으로 적용합니다.
  • 기능은 여러 프레임 워크 (우리가 구현하는 기능의 10 %가 CoreWebsite, Framework1.Business, Framework1.Data, Framework2.Business, Framework2.Data)에 걸쳐 있다고합니다. 비슷한 방식으로 기능을 1 또는 2로 변경해야 할 수도 있습니다. 더 많은 SharedLib 프로젝트 및/또는 'UI 웹 사이트 도우미'프로젝트.
  • 클라이언트의 사용자 지정 코드를 변경하면 거의 항상 해당 리포지토리에서만 로컬이므로 '전체 기능 변경 집합'이 무엇인지 확인하기 위해 다른 구성 요소에 대한 변경 내용을 추적 할 필요가 없습니다.
  • 기능이 전체 범위를보기 위해 프로젝트에 걸쳐 있다고 가정 할 때 각 프로젝트가 자체 저장소 인 경우 리포지토리의 모든 코드 변경을 분석하는 것이 어려울 것으로 보입니까?

미리 감사드립니다.

+0

우리는 똑같은 문제를 겪고 있으며, [git subtree] (https://github.com/git/git/blob/master/contrib/subtree/git-subtree.txt)를보고 그 중 의존성. – Sardathrion

답변

12

별도의 저장소를 수행하는 것이 가장 좋은 이유는 변경 사항과 변경 집합을 구분하기 때문입니다. 누군가 다른 사람에게 영향을 미치지 않는다고 말하는 클라이언트 프로젝트를 변경하면 다른 사람이 전체 코드 기반을 업데이트 할 이유가 없습니다. 그들은 단순히 그들이 관심있는 프로젝트에서 변경 사항을 얻을 수 있습니다.

힘내 서브 모듈은 서브 버전의 외관과 같습니다. git 저장소를 설정하여 각각이 별도의 레이어가되도록 한 다음 하위 모듈을 사용하여 보유하고있는 다양한 계층 구조에 필요한 프로젝트를 포함 할 수 있습니다.

그래서 예를 들면 경우 :

/Core -- It's own git repository that contains it's base files (as you had outlined) 
    /SharedLib1 
    /SharedLib2 

/UI Layer -- Own git repository 
    /CoreWebsite 
    /WebsiteHelper 
    /Tahiti.WebsiteHelpers 
    /Core -- Git Submodule to the /Core repository 
    /SharedLib1 
    /SharedLib2 

이것은/코어 저장소에 대한 업데이트는 UI 계층 저장소로 가져되도록합니다. 또한 공유 라이브러리를 업데이트해야하는 경우 5-6 개 프로젝트에서 공유 라이브러리를 업데이트 할 필요가 없습니다.

+1

"공유 라이브러리를 업데이트해야하는 경우 5-6 개 프로젝트에서 수행 할 필요가 없다는 것을 의미합니다."... 모든 프로젝트 대신 코어를 가져올 수 있다는 것을 의미합니까? 귀하의 예제에서/Core 실제 폴더는 하드 디스크의/UI Layer 아래에 실제로 존재합니까 (/ Core 루트에 살고있는 것 이외에)? 그것이 (그리고 하위 모듈 인 경우) 자체 .git 폴더가 있습니까? – Terry

+1

예,/Core는/"UI Layer"아래에 살며 자체 .git 폴더입니다./Core를 가지고 싶지 않다면,/Core_Load/Core 폴더에서 수행하고, 커밋하고,/Core로 푸시 할 수 있습니다. 거기에서 레포. – Koby

+1

그러나 시스템의 다른 폴더에'''/ Core''가있는 경우, 예를 들어''/ UI Layer 2''에서 사용하고 있기 때문에, 다른 하나를 당겨서 변경 사항을 확인해야합니다. .. @ 코비, 아마도 당신의 대답에 힌트를 포함;) – Kjellski