함께 병합해야 할 여러 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
이 :
자동 또는 반복 할 필요가있는 것이 있습니까? 아니면 일회성 행사입니까? – andyg0808
반복 가능하고 자동화 됨. 모듈은 별도의 팀에서 관리 할 예정이며 향후 언제든지 서로 다른 버전의 코어와 코어에 의존하도록 변경할 수 있어야합니다. 관련된 명령을 CI 서버의 구성에서 쉽게 파생시킬 수 있기를 바랍니다. – jfmatt