2012-05-04 4 views
30

나는 자식 서브 모듈을 아주 좋아합니다. 또한, 나는 자식 서브 모듈이 싫어. 내가 그들을 사랑하는 이유는 의존성 등을 깔끔하게 구분할 수있게 해줄 수있는 방법이다. 나는 그들에게 repo에 대한 특정 커밋을 지적하게한다. 하지만 제 경우에는 다른 프로젝트에서 사용할 라이브러리를 만들고 있으므로 별도의 프로젝트에 보관하고 싶습니다.Force Git 하위 모듈을 항상 최신 상태로 유지하십시오.

그러나이 라이브러리에 대해 매일 작업 할 때 불편을 겪습니다. 포인터 업데이트를 수행하기 위해 내 라이브러리를 사용하여 앱으로 계속 전환해야합니다.

그래서 내가 끊임없이 업데이트하고이 라이브러리에 추가하는 동안 가리키는 Repo의 맨 위에있는 자식 서브 모듈을 가질 수 있습니까?

+0

이 도움을합니까를? http://stackoverflow.com/questions/1777854/git-submodules-specify-a-branch-tag –

답변

18

아니요, 이것은 의도적으로 설계된 동작입니다. 하위 모듈이 다른 저장소의 "현재 헤드"를 가리 키도록하는 방법이 있다면 주 저장소에서 히스토리 버전 (태그가있는 버전과 같은)을 검색하는 것은 불가능합니다. 체크 아웃 할 서브 모듈의 버전을 알 수 없습니다.

그렇다면 git subtree 스크립트에 관심이있을 것입니다. 이것은 워크 플로우와 더 호환 될 수있는 서브 모듈로 작업하는 다른 방법을 제공합니다. 나는 최근에 post on HN에 의해 이것을 상기 시켰습니다.

+2

그래, 알 겠어, 내 부모 repo가 ​​자동으로 서브 모듈 포인터를 자동으로 업데이트하도록하고 싶습니다. 서브 모듈에서 로컬로 커밋 된 변경 사항이 있습니다. 하위 모듈 X가있는 프로젝트 A가있는 경우, 프로젝트 A에서 작업하면서 서브 모듈 X로 들어가면 하위 모듈에서 하나를, 그리고 부모에서 다시 두 번 커밋해야합니다. 많이 변하지 않는 서브 모듈에서 작업하고 있다면 거대한 거래는 아니지만 끊임없이 앞뒤로 가야 할 때, 정말 짜증이납니다 ....그냥 내 로컬 repo 그냥 둘 다 커밋 할 수있을 것 같아요 – Ben

+1

번역 : 하위 모듈에 변경 사항을 커밋 할 때 저를 위해 서브 모듈 포인터 업데이트를 자동으로 커밋하도록 내 로컬 repo에 말하십시오 ... – Ben

+2

당신이 스크립트를 작성할 수 있다고 가정합니다. 하위 모듈에 커밋 할 때 사용하는 모듈은 상위 모듈에서 자동으로 해당 커밋을 만듭니다. 또는 부모 모듈 작업 디렉토리에서 실행되는 스크립트를 작성하여 마지막 부모 프로젝트가 커밋 된 이후에 업데이트 된 모든 하위 모듈에 대한 커밋을 자동으로 생성 할 수 있습니다. –

0

서브 모듈 디렉토리 내에서 자체를 변경하지 않는 이유는 무엇입니까? git repo입니까? 이렇게하면 앱에 항상 라이브러리가 업데이트됩니다.

주의 사항은 :

  1. 당신은 여전히 ​​(응용 프로그램 용) 버전 제어의 변화를 넣어 앱의 repo 내부의 서브 모듈의 변경 사항을 커밋해야합니다.

  2. 이 라이브러리를 사용하는 앱보다 많은 앱이있는 경우, 한 번에 하나의 앱만 최신 상태가되므로이 기능은 작동하지 않습니다. 서브 모듈의 SHA1은 여전히에 기록

    git submodule add -b <branch> <repository> [<path>] 
    

    :

24

나는 "git submodule tracking latest"에 언급, 당신은 자식 1.8.2 (2013 월) 이후 서브 모듈이 지점의 머리를 추적 할 수 있습니다 gitlink (special entry in the index)와 같은 부모의 repo

그러나 git submodule update --remote가 서브 모듈 원격 REPO의 분기의 HEAD 일치하는 SHA1에 해당 항목을 업데이트합니다.

당신은 you can make it follow a branch와 기존의 서브 모듈이 있으면 :

cd /path/to/your/parent/repo 
git config -f .gitmodules submodule.<path>.branch <branch> 

cd path/to/your/submodule 
git checkout -b branch --track origin/branch 
    # if the master branch already exist: 
    git branch -u origin/master master 

cd /path/to/your/parent/repo 
git add path/to/your/submodule 
git commit -m "Make submodule tracking a branch" 
+0

'git submodule update --remote'를 실행하면 서브 모듈이 커밋으로 되돌아 가고 HEAD 레퍼런스를 잃을 때마다 –

+0

'git submodule foreach git pull' 명령이 실행되지 않습니다. –

+0

@MarceloFilho는 서브 모듈을 고려해도 그리 놀라운 일이 아니지만 지점을 체크 아웃하지 않습니다. 원격 브랜치를 따르도록 설정되어 있다면'git submodule update --remote --recursive'만이 필요한 명령입니다. .git 모듈을 점검하여 해당 하위 모듈이 분기를 따르는 지 확인하십시오. – VonC

관련 문제