2013-07-29 2 views
4

함께 병합해야 할 여러 Git repos를 사용하고 있습니다.여러 개의 Git 리포지토리를 태그로 병합

git remote add fork1 ... 
git remote add fork2 ... 
git fetch fork1 
git fetch fork2 
git merge fork1/master fork2/master 

이 잘 좋은 모든,하지만 난 각각의 원격 사용하여 태그의 커밋 특정를 당길 수 있도록하고 싶습니다 : 워크 플로는 다음과 같이 보일 것이다

git merge fork1/v1.0.0 fork2/v2.1.0 

이 결코해야 모든 repo가 ​​하나의 하위 폴더에 한정된 변경 사항을 갖기 때문에 병합 충돌이있을 수 있지만 문법 병합으로 인해 전체 트랜잭션이 원자 적으로 실패하게됩니다.

문제은 (는) 태그 참조입니다. this blogpost (광산 아님)에 설명 된 것처럼 모든 태그는 설명 할 수 없듯 글로벌 네임 스페이스에 덤프됩니다. fork1/v1.0.0을 말할 수있는 방법이 없습니다. 단지 v1.0.0 일뿐입니다. 여러 개의 저장소가 동일한 태그를 갖고 있으면, 서로 스쿼시됩니다.

this answer 다음으로이 문제를 해결하기 위해 refspec을 사용하려고합니다. 지금까지, 나는 다음과 같이 왔어요 :

이은 fork1의 v1.0.0 태그를 만드는 의도 된 효과가
git fetch fork1 refs/tags/*:refs/tags/fork1/* 

fork1/v1.0.0로 도착합니다. 불행하게도, 이 비 네임 스페이스로 도착합니다. v1.0.0; git fetch은 태그 매핑 섹션에서 두 배의 줄을 인쇄하고, git merge v1.0.0은 여전히 ​​끌어온 태그와 병합합니다. 어디서나 refspecs에 대한 좋은 문서를 찾을 수 없습니다. (Git's documentation on the topic은 쓸데없이 쓸모 없습니다.)

어떻게 여러 저장소의 태그가 서로 충돌하지 않도록 할 수 있습니까?

나는이 바보 같이 생각한다면 다른 워크 플로 제안에 대해서도 열려 있습니다. 공유 구성 요소와 구조를 보유하고있는 하나의 코어 저장소와 코어의 전체 복제본 인 코드 리포지토리가 있습니다. 나의 현재 계획은 각 모듈이 코어에 대한 원격 포인터 (공유 된 부분을 최신으로 유지하기 위해)와 의존하는 다른 모듈에 대한 원격 포인터를 갖는 것이다. 공유 비트는 동일하기 때문에 병합되며 모듈 비트는 독립적이므로 병합됩니다. 여기에 따라야 할 또 다른 패턴이 있습니까? (나는 (a) 나는 그들에 대해 좋은 것을 결코 들어 본 적이 없기 때문에, 그리고 (b) 공유 된 부분이 프로젝트 디렉토리 구조의 최상위 레벨이기 때문에 서브 모듈을 피해 왔기 때문에 Repo 구조가 매우 어색하게 만든다.)

또한 심판/태그를 포기하지 않고 심판/태그 /은 fork1에은 fork1의 태그를 드롭 할

git fetch fork1 refs/tags/*:refs/tags/fork1/* --no-tags 

이 :

+0

자동 또는 반복 할 필요가있는 것이 있습니까? 아니면 일회성 행사입니까? – andyg0808

+0

반복 가능하고 자동화 됨. 모듈은 별도의 팀에서 관리 할 예정이며 향후 언제든지 서로 다른 버전의 코어와 코어에 의존하도록 변경할 수 있어야합니다. 관련된 명령을 CI 서버의 구성에서 쉽게 파생시킬 수 있기를 바랍니다. – jfmatt

답변

5

그것은 함께 --no-tags를 사용하여 작동합니다.

관련 문제