2009-04-06 4 views
22

다른 프로젝트를 포함하도록 Git 프로젝트를 설정하려면 어떻게해야합니까?Git을 사용하는 프로젝트 내의 프로젝트

예 : 온라인 매핑 앱을 만들고 있습니다. 우리는 SF에서 의상과 함께 GPS 도구를 개발했습니다. 우리는 동시에 Python Geomapping 스크립트를 다른 관심사와 함께 개발했습니다 (Geomapping에만 관심이 있음). 우리 자신의 핵심 파일은이 둘을 하나로 묶어서 필요한 앱을 위해 빌드합니다.

각 프로젝트는 자체적으로 존재해야합니다. GPS에 관심이있는 사람들은 GPS에만 관심이 있지만 다른 모든 프로젝트를 포함하는 "상위"프로젝트는 프로젝트로 액세스 할 수 있어야합니다.

나는 서브 모듈을 이해하려고 노력했지만 시간이 많이 걸렸지 만 필요한 것에 너무 많은 독립성을 가진 것처럼 보입니다.

또한 가능한 경우 각 프로젝트에 하나 또는 두 개의 겹치는 스크립트가 포함될 수 있으면 좋을 것입니다. 하나의 Git 프로젝트가 'root'의 일부가 아닌 파일을 포함 할 수 있으므로이 파일이 어느 팀에서 업데이트 될 때 모두 이익을 얻을 수 있습니까?

힘내와 함께 할 수 있습니까? 의욕과 함께? 호스트 (GitHub, Gitorious)가 중요합니까?

.git 폴더를 무시하고 Git을 프로젝트 (.svn 폴더를 무시함)를 사용하여 Subversion을 '부모'용으로 사용한다는 생각이 들지만 이는 최후의 수단 일뿐입니다.

편집 : 나는 서브 모듈을 원하지 않는 이유

설명하려면 :

사용자가 다운로드
  1. , 우편은 서브 모듈 (here & here)를 포함하지 않는다. 공동 작업자가 프로젝트를 설정하려고 할 때도 마찬가지입니다. 이것은 쇼 마개입니다.
  2. 서브 모듈은 고정되어 있습니다. 서브 모듈은 가리키고있는 프로젝트의 최신 버전을 (쉽게) 픽업하지 않습니다.
  3. 아래의 환상적인 답변과이 monologue at NoPugs에 지적 된 다른 이유.

Subtree-merging (아래 Paul이 나에게 소개 함) : 병합 된 프로젝트 내에서 [subtree] 소스를 업데이트하기 어렵고 그 소스는 프로젝트의 '루트'폴더. 웹 응용 프로그램이기 때문에 모든 내 페이지가 내부적으로 폴더 내에 링크되어 있어야하며 테스트 및 업데이트가 해당 폴더에서 직접 수행되어야합니다. (희망이 다른 사람에게 명확하고 유용합니다.) '원격 지점'설정을 공부하고 있지만 다른 아이디어는 여전히 환영합니다.

http://book.git-scm.com/5_submodules.html

http://git-scm.org/gitwiki/GitSubmoduleTutorial

+0

내가 git-submodule에 대한 이유 : a) 작동하지 않을 수 있습니다. GIT Bash는 서브 모듈 추가 명령에 매달려 있습니다. b) 서브 모듈을 독립적으로 업데이트해야합니다. 서브 모듈의 최신 버전을 자동으로 가지고있는 것이 좋습니다. c) 서브 모듈에는 실제 코드 또는 포인터가 있습니까? – SamGoody

+0

Paul - 두 번째 방법에 대한 자습서가 있습니까? 나는 GIT를 충분히 어렵다고 생각하고있다. 또한 하위 프로젝트가 상위 프로젝트 내에 로컬로 저장되는 것이 중요합니까 (수퍼 클래스/클래스/하위 프로젝트 1)? – SamGoody

+1

Subtree 메서드는 별도의 하위 디렉터리에 하위 트리 메서드가 있어야하지만 어느 위치 에나있을 수 있습니다. Git은 개별 파일보다는 전체 프로젝트 트리를 추적하므로 모든 파일 레이아웃이 원격 브랜칭 방법으로 작동합니다. 나는 마지막 방법의 글을 모른다. 하위 트리 방법에 대한 링크를 추가했습니다. – Paul

답변

13

은 내가 일한 한 (작은) 프로젝트에 특히 유용 할 서브 모듈을 발견하지 않았습니다 :

+0

너무 많은 시간을 사용해도 두 번째 방법을 사용할 수 없습니다. 브랜치를 설정하고 병합하는 것은 괜찮 았지만, 그 이상으로 길을 잃었습니다. 보다 완벽한 워크 플로를 설명하는 것이 가능합니까? 주제로 질문하고 새 스레드를 시작하는 것이 적절합니까? – SamGoody

+0

할 수없는 일은 무엇입니까? 기본적으로 svn에서 상당히 일반적인 벤더 분기를 만듭니다. (실제로 'vendor branch'에는 두 가지 용도가 있습니다 - 원하는 벤더의 포함 된 repo 또는 특정 벤더의 릴리스 지점 포함). 나는 거의 순수한 액세스없이 여행을하고 있지만 이 일을 위해 더 많이 쓰여졌습니다. – Paul

+0

http://stackoverflow.com/questions/769786/vendor-branches-in-git에서 주제에 대한 새로운 글을 시작했습니다. 제 분명한 좌절감을 표합니다. 매우 감사합니다. – SamGoody

1

자식 - 서브 모듈은 당신이 찾고있는 수 있습니다 무엇을 . 일단 프로젝트를 설정하고 나면 프로젝트 전체를 작업 할 때 거의 모든 명령에 매개 변수를 추가해야하며 구문이 완전히 규칙적이지는 않습니다. 더 많은 서브 모듈을 가진 더 큰 프로젝트에서 작업한다면 더 유리한 결과라고 생각합니다.

는 주 (통합)의 repo에에서 끌어 독립적 인 자식의 repos로 하위 프로젝트를 유지하는 두 가지 가능성이 있습니다

  • 하위 트리를 포함하는 메인의 repo에to bring your external projects into separate subdirectories 병합 사용하여 핵심 파일. 이렇게하면 외부 프로젝트에서 기본 프로젝트를 쉽게 업데이트 할 수 있지만 변경 사항을 외부 프로젝트로 다시 보내려면 복잡합니다. 나는 이것을 프로젝트 종속성을 포함하는 좋은 방법으로 생각하지만, 공유 파일에서는 그렇게 잘 작동하지 않을 것이다. Another simple explanation (link fixed).

  • 는 메인의 repo에서 원격 지점 각 프로젝트를 설정하고 또한 핵심 파일을 포함하여 master (통합) 가지로 각에서 병합합니다. 이렇게하려면 몇 가지 훈련이 필요합니다. 메인 프로젝트의 외부 프로젝트를 변경하는 경우 분기에서 수행 한 다음 마스터로 병합해야합니다. 프로젝트 분기에 병합하지 않으려 고합니다. 이렇게하면 변경 사항을 외부 프로젝트에 쉽게 보낼 수 있으며 Git의 분기를 사용할 수 있습니다.

    공유 스크립트는 외부 파트너가 원격 지점으로 가져 와서 원격 지점으로 푸시 할 수있는 기본 디렉토리의 다른 독립 분기로 처리 될 수 있습니다.

같은 디렉토리에 SVN & 힘내를 실행하려고하면

, 당신은 SVN이 망할 놈의 포인터를 추적하면서 파일 디렉토리를 복사하여 분기 않기 때문에 매우 어려운, 각 시스템에서 분기 사용 할 수 있습니다. 어느 시스템도 자동으로 다른 지점에서 귀하가 만드는 지점을 보지 않습니다. 나는 '해결책'이 가치보다 더 큰 문제라고 생각한다.

+0

git-submodule의 두 링크가 모두 내부 서버 오류를 표시합니다 (코드 500) – hyip

3

나는 내 자신의 github 호스팅 프로젝트와 내가 사용하기를 원하는 외부 UI 라이브러리를 결합하기 위해 git를 사용했다. 이 라이브러리는 sourceforge의 Subversion 저장소에서 호스팅됩니다.

나는 git-submodule과 git-svn을 사용했으며 적절하게 작동했습니다. 단점은 있었다 :

  1. 라이브러리 저장소와 최신 상태로 유지하기 위해, 나는 새가 서브 모듈의 자식 해시 "포인터"를 업데이트 할 것을 약속 수행했다. 이는 git 서브 모듈이 svn : externals과 달리 특정 커밋 ID에 고정되어 있기 때문입니다. 실제로 안정적인 버전을 고정하려는 경우 실제 단점이 아닐 수도 있습니다. WIP 코드로 작업하고있었습니다.

  2. 서브 모듈로 git repo를 처음으로 가져 오려면 "git submodule init"과 함께 추가 단계가 필요합니다. 이것은 당신에게 문제가 아니지만 다른 사람들이 코드를 사용하여 코드를 컴파일/실행/테스트하기 전에이 단계를 수행해야한다는 것을 기억해야합니다.

  3. 명령 줄을 사용하면 git-add를 사용하여 저장소를 쉽게 망칠 수 있습니다. 이는 git add subm<tab>을 입력하여 git add submodule으로 완료되었으므로 자동 완료됩니다. git add submodule/ - 뒤에 슬래시가 표시됩니다. 후행 슬래시를 사용하여 명령을 실행하면 하위 모듈이 깜짝 놀라게되며 포함 된 모든 파일이 대신 추가됩니다. 이것은 git-gui, git add .을 사용하거나 슬래시를 지우는 것만으로도 충분합니다. (내게 그것을 훈련시키기에 충분한 시간을주었습니다)

  4. 서브 모듈로 커밋하면 git rebase -i가 엉망이 될 수 있습니다. 정확한 세부 정보는 잊어 버렸지 만, "더러운"하위 모듈이 있고 리베이스 인터랙티브를 실행하면 특히 나쁩니다.일반적으로 더러운 트리가 있으면 리베이스 할 수 없지만 서브 모듈은 확인되지 않습니다. 리베이스 그룹에 여러 개의 하위 모듈 커밋이 있으면 문제가 발생합니다. 마지막 서브 모듈 해시는 목록의 첫 번째 선택에 커밋되기 때문에 나중에 수정하는 것은 매우 까다 롭습니다. 이 작업은보다 신중한 워크 플로 (즉, 하위 모듈 커밋을 할 때 신중하게 결정할 때 ...)로 처리 할 수 ​​있지만 PITA 일 수 있습니다. 이 설정하는

단계는의 라인을 따라 뭔가했다 : git svn clone https://project.svn.sourceforge.net/svnroot/project/project/trunk

  • 밀어

    1. 실행 "진짜"자식 프로젝트 예컨대하는대로 그 이제 자신의 자식 저장소에 GitHub의
    2. 는 자신의 repo에, 그 밖도이 시간을 git submodule init
    3. git submodule add git://github.com/project subproject
    4. 푸시를 실행합니다.

    다소 많습니다. 당신은 새로운 디렉토리 "subproject"를 가지게 될 것입니다. 귀하의 경우에는 geomapping 라이브러리가 될 것입니다.

    당신이 geomapping 코드를 업데이트해야 할 때마다, 당신은 같은 것을 실행하는 것이다 : 나는 자식 서브 모듈의 작업 흐름에 많은 튜토리얼을 볼 수없는 한

    cd subproject 
    git svn rebase 
    git svn push # this updates the git mirror of the subproject 
    cd .. 
    git add subproject # careful with the trailing slash! 
    git commit -m "update subproject" 
    git push # this pushes the commit that updates the subproject 
    

    을, 그래서 나는 이것이 당신이 결정하는 데 도움이되기를 바랍니다.

  • +0

    좋은 글을 작성하십시오. 저는 서브 모듈을 사용하지 않습니다. 주로 3 점과 4 점이 있기 때문입니다. 나는 당신이 가능한 한 간단하게 만들었다 고 생각합니다. 언젠가 서브 모듈을 직관적으로 다루는 도자기가있을 것입니다. – Paul

    +0

    동의. 일단 그들이 정말로 그냥 svn : pinterned : externals이라는 것을 알게되면 꽤 쉽습니다. submicules를 grok 때까지 gotchas는 UI에 거대한 사마귀지만. – richq

    1

    조금 전에 제가 Externals에 대해 읽었습니다. GIT의 SVN '외부'포트 인 것으로 보입니다.

    그러면 GIT 하위 모듈의 일부 문제가 자동으로 최신 버전으로 업데이트됩니다.

    SVN 외관 또는이 프로젝트에 대한 경험이 없지만 게시 된 다른 어떤 것보다 더 나은 솔루션 일 수 있습니다.

    또는 다음 소프트웨어 (GitHub와 함께 사용할 수있는 것 같습니다). 일부는 고양이 피부하는 또 다른 방법이 될 수 있습니다 : Braid (Softpedia page)

    +0

    링크가 흥미 롭습니다. – richq

    0

    그것은 당신이 어떤 도구가있는 경우 작업하고있는 프로젝트의 종류에 따라 다르 SCM과 상호 작용해야합니다. 예를 들어, Rails는 종종 Capistrano를 사용하여 배포하며, Capistrano는 디렉토리 구조가 저장소의 루트와 관련하여 어떤 모양인지에 대해 특정 가정을합니다. 이 경우 여러 개의 상호 연관된 레일 앱이있는 경우 하위 모듈을 사용해야합니다. 각 앱마다 고유 한 저장소가 있으며 하위 저장소로 각 독립 저장소를 관리하는 더 큰 저장소가 있습니다.

    이러한 종류의 가정을하는 도구가 없더라도 좋은 저장소 설계를 사용하려면 언젠가는 더 큰 프로젝트의 하위 섹션을 사용하려는 약간의 가능성조차있을지라도 독립적 인 프로젝트 내에서 독립적으로 또는 재사용 할 수 있습니다.

    버전 히스토리를 유지하면서 저장소의 일부 하위 항목을 별도의 항목으로 추출하는 것은 어려운 일이므로 계획을 세우는 것이 좋습니다.

    특정 질문에 관해서는 솔직히 말해서 몇 개의 서브 모듈이 이상적 일 수있는 완벽한 예라고 할 수 있습니다.스크립트 공유와 관련하여, 어떤 이유로 그것이 실제로 문제가되는 문제인 경우, 항상 심볼릭 링크를 사용할 수 있습니다.

    +0

    서브 모듈을 포함한 전체 프로그램의 다운로드를 제공하기 위해 어떻게 심볼릭 링크를 사용합니까? "symlink"라는 용어는 저에게 새로운 것이지만 (Win/Mint 사용자) 빠른 Google에서 해결할 수있는 부분이 없습니다. 내 환경은 Python (TurboGears)으로 이동하는 것을 고려하여 PHP입니다. – SamGoody

    +0

    프로그래밍 언어는이 경우에는 관련이 없지만 Windows에는 심볼릭 링크가 없습니다. git을 실행하기 위해서도 symlink가 필요하지만, Windows 용 자식 포트는 기본적으로 msys를 통해 symlink 지원을 얻는다. 프로젝트 A가 프로젝트 B에있는 스크립트를 필요로하지만 별도의 서브 모듈 인 경우 프로젝트 A의 심볼릭 링크를 프로젝트 B의 스크립트에 만들고 심볼릭 링크를 git로 점검 할 수 있습니다. Symlink는 상대적이어야합니다. –

    관련 문제