2011-10-27 6 views
0

우리는 별도의 Subversion 저장소에 보관하고 싶은 몇 가지 Zend_Framework 응용 프로그램을 보유하고 있습니다. 그러나 이러한 응용 프로그램은 동일한 데이터베이스 추상화 계층과 여러 개의 동일한 공통 구성 요소를 공유합니다.하나의 설정이 외설 외부와 어떻게 관련이 있습니까? 그래야 하나?

어쨌든 앱간에 공통된 비트를 공유하고 싶습니다. 이제

svn://foo/itg-common/trunk 
svn://foo/itg-common/branches/foo 
svn://foo/itg-common/branches/production 

svn://foo/itg-app/trunk 
svn://foo/itg-app/branches/foo 
svn://foo/itg-app/branches/production 

, 우리는 ITG-공통 저장소에 외관 참조를 위해 ITG-응용 프로그램 저장소를하고 싶습니다처럼 우리가 가진 현재의 생각이 보인다. 문제는 우리가 원하는 것입니다. itg-app/trunk/commonitg-common/trunk, itg-app/branches/foo/common에 연결되어 itg-common/branches/foo 등과 연결될 것입니다. 즉, 일반적인 패턴은 itg-app/$BRANCH/common -> itg-common/$BRANCH입니다.

이제 원칙적으로 이러한 외부를 만들 수 있지만 병합을 시도 할 때마다 문제가 발생합니다. 예 : $/trunk에서 $/branches/production을 병합하면 svn:externals 속성을 덮어 써 $/branches/production/commonitg-common/trunk을 가리 키도록 만듭니다.

의미가 있습니까? 그렇다면이 문제를 해결하는 방법이 있습니까? 그렇지 않으면 왜 안되며 대신 우리는 무엇을해야합니까?

답변

3

의미가 있습니까? 그렇다면이 문제를 해결하는 방법이 있습니까? 그렇지 않으면 왜 안되며 대신 우리는 무엇을해야합니까? 이미 prodigitalson said으로

,이 모델에 따르면 등 자신의 출시주기, 가지, 태그,와, 기본적으로 소프트웨어의 완전히 다른 작품으로 간주됩니다 SVN의 외부, 당신은 몇 가지 트렁크에 고정 해제 외관이 없어야합니다 하지만 태그 나 개정판에 모두 고정시켜야합니다. 이것은 외부 소스의 코드를 사용하는 꽤 제한된 모델이지만 SVN이 지원합니다. 이것에서 벗어나십시오, 당신은 당신 자신에 있습니다. (그에 대한 나의 개인적인 전쟁 이야기는 아래를 참조하십시오.)

다른 저장소를 말하는 경우 다시 생각해 보겠습니다. 현재 프로젝트 나 저장소 루트에 대해 상대적으로 외부를 참조하는 IME는 절대 경로를 사용하는 것보다 훨씬 낫습니다. svn:에서 https:으로 프로토콜을 변경할 수있는 가능성을 고려하십시오. (필자는 이런 일이 회사에서 일어난 것을 보았고 모든 외부를 변경하기 위해 스크립팅에 크게 의존하고 있음에도 불구하고이 전환은 모든 사람들이 악몽을 꾼다는 혼란이었습니다.) 외부에 대한 상대 경로는 간단하지만 더 강력합니다. 단일 저장소.


제가 일하고있는 회사에서 막 비슷한 문제가 발생했습니다. 서로 다른 제품간에 공유되는 많은 코드가 있습니다. 이것은 외부를 통해 이루어지며, 외부에서 참조 된 프로젝트는 외부 자체를가집니다. 어떤 지점에서는 재귀 적 외형의 세 가지 계층으로 나뉘어 있습니다. 우리는 앞으로 더 많은 것이 있다는 것을 이미 알고 있습니다. 이 모든 코드는 끊임없이 연구되고 있으며, 자동 테스팅은 그로부터 벗어나기 때문에 외부 참조가 참조하는 프로젝트의 트렁크를 참조하게하고 모든 반복적 인 외부의 릴리스 관리에는 우리가 감당할 수없는 노력이 필요할 것입니다.그 자체가 다음 고정 해제 외관을 참조하십시오 때, 프로젝트의 외부 부품을 고정하는 것만으로는 충분하지 않습니다 때문에

그러나이 설정에서 프로젝트를 분기는 , 음의 진짜 고통이다. 외부를 통해 다시 외부를 통해, XX 프로젝트를 의미 X를, 프로젝트를 의미, 지점 프로젝트 foofoo'에,해야 할 때마다, 당신은 foo' 지점에서 외부 인 XXfoo' 분기를 필요 X이고 외부는 foo'입니다. foo에 반 다스의 외관을 상상해보십시오. 그 중 절반은 고유 한 외관을 가지고 있으며, 일부는 3 개 또는 그 이상의 층을 반복합니다. 프로젝트 XXX에 대해 잘 모르는 프로젝트를 위해 생성 된 브랜치가 산재 해 있습니다.

우리의 솔루션은 재귀 중 하나 A)foo/branches/externals/foo'/XX를 참조 foo/branches/externals/foo'/X 자체 (<project>/branches/foo'에 의해 참조있어 그들이 foo/branches/externals/foo'/X에 설정 외부 X의 지점) 또는 B라고 어떤 지점 모든 외부 부품을 교체하는 것입니다) . 그러나 foo'을 만들 때이를 설정하는 것은 불가 능할 정도로 복잡하며 어리석은 실수를 범하는 데 충분한 기회를 제공하므로 스크립팅을 사용하여 프로젝트와 외부를 재귀 적으로 강등하고 모든 작업을 수행합니다.

1

앱에서 하나의 레포에 대해서만 외부에 있어야합니다. 나는 이것이 당신의 일반적인 repo의 "생산"지점이라고 가정합니다. 기본적으로 외부를 자체 개발 라이프 사이클과 함께 별도의 프로젝트로 취급합니다.