Subversion 분기 전략


Subversion 분기 전략
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
분기 전략 [닫힘]
내가 현재 일하고있는 회사는 현재의 브랜치 모델에 문제가 있기 시작했으며 지역 사회에 어떤 종류의 분기 전략이 노출되어 있는지 궁금합니다.
상황에 따라 좋은 것이 있습니까? 귀하의 회사는 무엇을 사용합니까? 장점과 단점은 무엇입니까 ??
casperOne이 (가) 건설적이지 않은 것으로 마감 24 Feb '12, 19:53.
현재이 질문은 Q & A 형식에 적합하지 않습니다. 우리는 답변이 사실, 참고 문헌 또는 전문 지식에 의해 뒷받침 될 것으로 기대하지만, 이 질문은 논쟁, 논쟁, 여론 조사 또는 확장 토론을 유도 할 것입니다. 이 질문을 개선하고 다시 열 수 있다고 생각되면 도움말 센터를 방문하여 안내를 받으십시오. 이 질문을 도움말 센터의 규칙에 맞게 수정하려면 질문을 수정하십시오.
17 답변.
좋은 성공과 함께 과거에 사용한 방법은 다음과 같습니다.
/ 트렁크 - 출혈 가장자리. 코드의 다음 주요 릴리스. 주어진 시간에 작동하거나 작동하지 않을 수 있습니다.
/branches/1.0, 1.1 등 안정적인 코드의 분기. 버그를 수정하고 새 릴리스를 안정화하는 데 사용됩니다. 유지 보수 지점 인 경우 해당 시점에 컴파일하고 (해당되는 경우) QA / 출하 준비를해야합니다. 안정화 브랜치의 경우 컴파일이 완료되고 기능이 완료되어야합니다. 새로운 기능을 추가하거나, 리팩터링을하지 않으며, 코드를 정리하지 않아야합니다. 안정화 분기와 유지 보수 분기를 나타내는 사전 접 두부를 추가 할 수 있습니다.
/ branches / cool_feature. 트렁크 (또는 유지 보수 지점)로 만들거나 만들지 않을 수있는 고도의 실험적 또는 파괴적인 작업에 사용됩니다. 코드 컴파일, 작동 또는 기타 정상적으로 작동하는 코드에 대한 보장이 없습니다. 메인 라인 브랜치에 병합하기 전에 가능한 한 최소 시간 동안 지속되어야합니다.
/tags/1.0.1, 1.0.2, 1.1.3a 등. 패키지 된 & amp; 출하 된 출시. 절대로 변하지 않습니다. 원하는만큼의 태그를 만들지 만 변경할 수는 없습니다.
이 문제에 대한 에릭 싱크 (Eric Sink)의 의견을 읽는 것이 좋습니다.
저는 Eric처럼 그가 말하는 "폴더"스타일의 분기를 선호합니다.
브랜드 애플 턴의 스트리밍 라인 : 병렬 소프트웨어 개발을위한 브랜칭 패턴을 참조하십시오. 그것은 중무기이지만 분지에 대한 지식의 폭과 깊이에 관해서는 그것을 능가하는 것을 보지 못했습니다.
우리 저장소는 다음과 같습니다.
/ 트렁크가 당신의 표준, 출혈 가장자리 개발입니다. CI를 사용하므로 항상 테스트를 작성하고 통과해야합니다.
/ branches 이것은 우리가 '승인 된'큰 변화를 두는 곳입니다. 즉, 우리가 알고있는 어떤 것이 트렁크에 들어가지만, 약간의 작업이 필요할 수도 있고 CI를 깨뜨릴 수도 있습니다. 또한 자체 CI 프로젝트가있는 유지 관리 릴리스에서 작업합니다.
/ sandbox 각 개발자는 자신의 샌드 박스와 공유 샌드 박스를 가지고 있습니다. 이는 실제 작업을 수행하지 않을 때 수행하는 "LINQ 공급자를 제품에 추가 할 수 있도록 허용"과 같은 작업을위한 것입니다. 결국 트렁크에 들어갈 수도 있지만 그렇지 않을 수도 있습니다. 하지만 버전 제어가 있습니다. 여기에 CI가 없습니다.
/ 벤더 표준 벤더 브랜치는 우리가 컴파일하는 곳의 프로젝트를위한 것이지만 우리가 유지 관리하는 코드는 아닙니다.
/ ccnet 이것은 CI 태그입니다. CI 서버 만이 여기에 쓸 수 있습니다. Hindsight는 CI, BUILDS 등과 같이 좀 더 일반적인 이름으로 이름을 바꾸라고 말했을 것입니다.
활성 개발을위한 하나의 브랜치 (전문 용어에 따라 / main 또는 master) 각 유지 관리 릴리스마다 하나의 브랜치 -> 모든 주요 개발이 / main으로가는 반면 아주 작은 수정 만 받음 ​​새로운 태스크마다 하나의 브랜치 : Bugzilla / Jira / Rally의 모든 새로운 항목을 작업하는 새로운 지점. 커밋을하고, 자갈 체크섬을 사용하여 변경 사항을 자체 문서화하고, 완료되고 잘 테스트 된 경우에만 "상위"분기로 다시 병합합니다.
첫 번째 : 키스 (간단하게 멍청한 상태로 유지하십시오!)
* 1) 유지할 수있는 버전 유지 - 예 : 서비스 팩, 핫픽스, 필요한 경우 트렁크에 병합 될 수있는 버그 픽스 * 2) major. minor. build. revision.
태그 폴더를 체크 아웃 할 필요는 없습니다. 릴리스 브랜치에서 코딩을 거의하지 않으면 서 병합이 간단 해집니다. 코드 정리 등을하지 마십시오. 태그 폴더를 코딩하지 마십시오. 구체적인 버전 정보를 소스 파일에 넣지 마십시오. 플레이스 홀더 또는 0.0.0.0을 사용하여 빌드 메카니즘을 빌드하고있는 버전 번호로 바꾸십시오. 써드 파티 라이브러리를 소스 컨트롤에 넣지 마십시오 (또한 아무도 STL, MFC 등 라이브러리를 SVN에 추가하지 않습니다 ;-)) 만 하드 코드 된 경로 (절대 경로 및 상대 경로) 대신 환경 변수 사용
최종 품질 보증을 위해 릴리즈가 준비되면 우리는 분기합니다. 품질 보증 프로세스 중에 문제가 발견되면 해당 버그는 지점에서 수정되고 유효성이 확인 된 다음 트렁크에 병합됩니다. 지점이 QA를 통과하면 출시로 태그를 지정합니다. 해당 릴리스의 모든 핫픽스는 또한 분기에 대해 수행되고 유효성 검사가 수행되며 트렁크에 병합 된 다음 별도 릴리스로 태그가 지정됩니다.
폴더 구조는 다음과 같습니다 (1 QA 라인, 2 개의 핫픽스 릴리스 및 트렁크).
야생, 야생, 서쪽 스타일의 git-branches를 사용합니다. 컨벤션으로 정의 된 잘 알려진 이름을 가진 가지가 있지만 우리의 경우 회사의 프로세스 정책 요구 사항을 충족시키기 위해 실제로 태그가 더 중요합니다.
아래에서 Subversion을 사용하는 것을 보았으므로 Subversion Book에서 분기하는 부분을 확인해야한다고 생각합니다. 특히 지점 유지 관리 및 공통 지점 패턴의 "저장소 레이아웃"섹션을 살펴보십시오.
여기서 내가 보지 못하는 대안은 "변화에 맞서기"철학입니다.
트렁크에 "와일드 웨스트"가있는 대신 트렁크가 "현재 릴리스"이면 어떻게 될까요? 이것은 웹 사이트와 같이 한 번에 하나의 응용 프로그램 버전 만 릴리스 될 때 잘 작동합니다. 새로운 기능이나 버그 수정이 필요할 때 해당 변경 사항을 보관하기 위해 지점이 만들어집니다. 종종 수정 프로그램을 개별적으로 릴리스 할 수있게 해주 며 카우보이 코더가 실수로 의도하지 않은 기능을 추가하는 것을 방지합니다. (종종 백도어 - "개발 / 테스트 용")
벤 콜린스 (Ben Collins)의 조언은 어떤 스타일이 자신의 상황에 잘 맞는지 판단하는 데 매우 유용합니다.
Henrik Kniberg의 여러 Agile 팀을위한 Version Control에는 고려해야 할 몇 가지 좋은 점도 있습니다.
우리는 현재 "새 이니셔티브"를위한 한 가지 지 속적인 유지 보수를위한 지회를두고 있는데, "미래의 언젠가는 나올 것"이라는 의미입니다. 또한 현재 두 개의 유지 보수 지점을 운영하고 있는데, 하나는 현재 생산중인 제품과 QA에있는 제품을 수정하는 것입니다.
우리가 보아 왔던 가장 큰 장점은 사용자 요청 및 응급 상황에보다 신속하게 대응할 수 있다는 것입니다. 프로덕션에있는 지점에서 수정을 수행하고 이미 체크인되었을 수있는 추가 항목을 릴리스하지 않고 릴리스 할 수 있습니다.
가장 큰 단점은 지점 간 병합을 많이하게되고 결국 뭔가 잘못되거나 병합 될 가능성이 높아진다는 것입니다. 지금까지 문제는 아니지만 분명히 명심해야 할 것이 있습니다.
이 정책을 수립하기 전에 우리는 일반적으로 트렁크에서 모든 개발 작업을 수행했으며 코드를 공개 할 때만 분기했습니다. 그런 다음 필요에 따라 해당 지점에 대한 수정 작업을 수행했습니다. 그것은 더 간단했지만 유연하지는 않았습니다.
제프 앳 우드 (Jeff Atwood)는 좋은 블로그 게시물에 이렇게 적었습니다. 해당 게시물에 몇 가지 중요한 링크가 있습니다.
Gnat은 분기 전략에서 찾을 수있는 다양한 조언에 대해 이렇게 우수한 분석을 작성했습니다.
분기 전략이 하나도 없으며 다음과 같은 기능을 제공합니다.
팀 크기 제품 및 라이프 사이클 기간 사용중인 기술 (웹, 내장, Windows 응용 프로그램) 소스 컨트롤 힘내, TFS, Hg.
제프 앳 우드의 게시물은 많은 가능성을 무너 뜨립니다. 추가 할 또 다른 개념은 승진의 개념입니다 (Ryan Duffield의 링크에서). 이 설정에서는 dev 브랜치, test bracnh 및 release 브랜치가 있습니다. 릴리스 브랜치에 도달하여 배포 될 때까지 코드를 승격시킵니다.
우리가 일하는 철학은 트렁크를 사이트에 과격한 피해없이 언제든지 밀어 넣을 수있는 상태로 유지하는 것입니다. 이것은 트렁크가 항상 완벽한 상태에 있다고 말할 수는 없습니다. 물론 버그가있을 것입니다. 그러나 요점은 그것을 절대로 부숴 버릴 수 없다는 것입니다.
추가 할 기능이있는 경우 분기하십시오. 디자인 변경, 지점. "오랜 시간이 걸리지 않을 트렁크에서이 작업을 할 수 있습니다."라고 생각한 곳이 너무 많았습니다. 그런 다음 5 시간 후에 나는 물건을 깨뜨리는 버그를 파악할 수 없었습니다. 정말로 내가 갈라 놓았 으면 좋겠다.
트렁크를 깨끗하게 유지하면 버그 수정을 빠르게 적용하고 푸시 할 수 있습니다. 당신은 당신이 편리하게 갈라 놓은 깨진 코드에 대해 걱정할 필요가 없습니다.
이것은 사용중인 버전 제어 시스템에 따라 다릅니다. 각 VCS에는 분기에 대한 다양한 접근 방식이 있습니다.
어떤 VSC를 사용합니까?
Subversion의 경우 Ryan Duffield의 의견에 동의합니다. 그가 언급 한 장은 사용할 시스템에 대한 좋은 분석을 제공합니다.
내가 요청한 이유는 Perforce가 SVN 또는 CVS에서 분기를 생성하는 완전히 다른 방법을 제공한다는 것입니다. 또한 분기에 대한 철학을 전하는 모든 DVCS가 있습니다. 분기 전략은 사용중인 도구에 따라 결정됩니다.
FYI, Svnmerge. py는 SVN에서 분기를 병합하는 것을 지원하는 도구입니다. 자주 사용하면 (10-30 초마다) 커밋됩니다. 그렇지 않으면 도구가 혼란 스러울 수 있습니다.
어떤 분기 패턴을 선택하든 다음과 같이 분기를 2 진 트리 형식으로 유지해야합니다.
하위 노드는 직접 상위 노드와 병합해야합니다. 부모 분기를 사용하여 전체 분기 만 병합하는 것이 좋습니다. 지점 내의 하위 폴더는 병합하지 마십시오. 전체 분기에서 병합하고 선택하는 경우 필요한 경우 체리를 선택할 수 있습니다. 위의 그림에서 다음 분기는 설명을위한 것일 뿐이므로 필요하지 않을 수도 있습니다.

Subversion 분기 전략
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
지속적인 통합을 수행 할 때 가장 좋은 분기 전략은 무엇입니까?
지속적인 통합을 원할 때 가장 좋은 분기 전략은 무엇입니까?
분기 해제 : 트렁크 개발, 각 릴리스마다 지점 유지. Feature Branching : 별도의 분기에서 각 기능을 개발하고 한 번만 병합합니다.
이 두 가지 전략을 함께 사용하는 것이 합리적입니까? 에서와 같이, 당신은 각 릴리스를위한 브랜치를 가지지 만 커다란 기능을위한 브랜치 또한 가지 는가? 이 전략들 중 하나가 지속적인 통합과 잘 어울리는가? 불안정한 트렁크를 사용할 때 지속적인 통합을 사용하는 것이 맞습니까?
11 답변.
대답은 팀의 크기와 소스 제어의 품질 및 복잡한 변경 세트를 올바르게 병합하는 기능에 따라 다릅니다. 예를 들어, CVS 또는 SVN 병합과 같은 전체 분기 소스 제어에서 어려울 수 있으며 첫 번째 모델로 더 나을 수도 있습니다. 반면 IBM ClearCase와 같은 더 복잡한 시스템을 사용하면 더 큰 규모의 팀에서 두 번째 모델 또는이 둘의 조합으로 구성됩니다.
개별적으로 각 지형지 물이 별도의 지점에서 개발되고 지형지 물 모델을 개별 개발자가 수행 한 각 변경에 대한 작업 하위 분기로 분리 할 것입니다. 기능이 안정화되면 트렁크에 병합됩니다. 이 트렁크는 합리적으로 안정적으로 유지되며 모든 회귀 테스트를 항상 통과합니다. 릴리스주기가 끝나고 모든 기능 분기가 병합되면 안정성 버그 수정 및 필요한 백 포트 만 수행하는 릴리스 시스템 분기를 안정화 및 분기하고 트렁크는 다음 릴리스 개발 및 다시 사용하는 동안 새로운 기능 분기를 위해 분기하십시오. 등등.
이 트렁크는 항상 최신 코드를 포함하고 있지만 중요한 변경 사항 및 기능 병합에 대해 안정적인 레이블 (태그)을 작성하여 안정적인 상태로 유지 관리 할 수 ​​있습니다. 기능 분기는 지속적인 통합으로 빠르게 진행되는 개발이며 개별 작업 하위 분기는 종종 지형지 물에서 새로 고침하여 모든 사람이 동일한 기능을 동시에 작동하도록 유지하면서 동시에 다른 기능을 사용하는 다른 팀에 영향을주지 않습니다.
동시에 이전 버전의 제품 또는 최신 출시 버전에 머물러있는 고객을 위해 백 포트, 지원 및 버그 수정을 제공 할 수있는 릴리스 분기 집합을 역사를 통해 얻을 수 있습니다. 트렁크와 마찬가지로 릴리스 분기에 지속적인 통합을 설정하지 않고 모든 회귀 테스트 및 기타 릴리스 품질 제어를 통과 할 때 조심스럽게 통합됩니다.
어떤 이유로 두 가지 기능이 서로 종속되어 있고 서로 변경해야 할 필요가있는 경우 동일한 기능 분기에서 개발하거나 기능이 주기적으로 안정적인 코드 부분을 트렁크에 병합 한 다음 변경 사항을 새로 고치는 기능을 요구할 수 있습니다 트렁크 지점간에 코드를 교환하는 트렁크. 또는 두 기능을 다른 기능과 분리해야하는 경우 기능 분기를 분기하고 기능간에 코드를 교환하는 데 사용할 수있는 공통 분기를 만들 수 있습니다.
위 모델은 50 명의 개발자와 소스 제어 시스템을 사용하는 팀에서는 CVS 나 SVN과 같은 적절한 분기 기능과 병합 기능이 없으므로별로 의미가 없습니다. 이 전체 모델을 설치, 관리 및 통합하는 악몽으로 만듭니다.
나는 내가 매일 매일하는 직업에 많이 의존하기 때문에이 주제가 정말 흥미 롭다고 생각한다.
나는 Mark Shuttleworth가 기존의 CI를 뛰어 넘어 깨끗한 본부를 지키는 모델을 제안했음을 기억한다. 나는 그것에 대해 여기에 올렸다. 크루즈 컨트롤에 익숙해지기 때문에 여기에서 작업 지점과 CI에 관해 블로그를 작성했습니다. 그것은 플라스틱 SCM으로 그것을 수행하는 방법을 설명하는 단계별 지침서입니다. 마지막으로 CI에 대한 Duvall의 책에서 CI에 관한 주제 중 일부를 발견했습니다.
당신이 흥미있는 링크를 찾길 바랍니다.
나는 개인적으로 안정된 트렁크를 가지며 기능을 분기하는 것이 훨씬 더 깔끔하다는 것을 알았다. 그런 식으로 테스터 등은 하나의 "버전"을 유지하고 트렁크에서 업데이트하여 코드 완성 기능을 테스트합니다.
또한 여러 개발자가 서로 다른 기능을 수행하는 경우 모두 별도의 분기점을 보유한 다음 완료되면 트렁크에 병합하고 테스터가 여러 지점으로 전환하여 다양한 기능을 테스트하지 않고 테스트 할 기능을 보낼 수 있습니다.
추가 보너스로, 자동으로 제공되는 통합 테스트의 일부 수준이 있습니다.
각 개발자가 매일 트렁크 / 메인 라인에 맡기는 핵심 원칙 중 하나를 기억한다면 지속적 개발과 함께 전략을 사용할 수 있다고 생각합니다.
필자는 CI에 관한이 책을 읽었으며, 저자들은 배포에 의한 분기가 선호하는 분기 전략임을 제안합니다. 나는 동의해야한다. CI를 사용할 때 기능별로 분기하는 것은 나에게 의미가 없습니다.
나는 왜 내가 이런 식으로 생각하는지 설명하려고 노력할 것이다. 3 명의 개발자가 각각 지사를 가지고 기능을 수행한다고 가정 해보십시오. 각 기능을 완료하는 데 며칠 또는 몇 주가 소요됩니다. 팀이 지속적으로 통합되고 있는지 확인하려면 최소한 하루에 한 번씩 본사에 맡겨야합니다. 이 작업을 시작하자마자 기능 분기를 만드는 이점이 사라집니다. 변경 사항은 다른 개발자의 변경 사항과 더 이상 분리되지 않습니다. 그렇다면 왜 처음부터 지형지 물을 만들지 않아도됩니까?
릴리스별로 분기를 사용하면 분기 간 병합 (항상 좋은 점)이 필요하며 모든 변경 사항이 최대한 빨리 통합되고 (올바르게 수행 된 경우) 항상 코드 기반이 항상 릴리스 될 수 있도록 보장합니다. 릴리스에 의한 브랜칭의 아래쪽은 변경 사항을 상당히 조심해야한다는 것입니다. 예 : 대규모 리팩토링은 점진적으로 수행해야하며 다음 릴리스에서 원하지 않는 새 기능을 이미 통합 한 경우 기능 토글 링 메커니즘을 사용하여 숨겨야합니다.
이 주제에 대한 의견이 여러 개 있습니다. 다음은 CI와의 분기 기능인 블로그 게시물입니다.
앱의 여러 버전을 유지 관리해야하는 경우에는 출시 분기가 매우 유용하며 꼭 필요한 경우도 있습니다.
피쳐 브랜치 또한 매우 편리합니다. 특히 한 개발자가 커다란 변화에 대해 작업해야하는 경우, 다른 개발자가 새 버전을 출시하는 경우에 특히 유용합니다.
두 가지 메커니즘을 모두 사용하는 것은 매우 좋은 전략입니다.
SVN의 책에서 흥미로운 링크.
나는 최근에 git을 사용할 때이 모델을 좋아하게되었다. 귀하의 질문에 "svn"태그가 붙어 있지만, 여전히 그것을 사용할 수 있습니다.
연속적인 통합은이 모델에서 "개발"브랜치 (또는 당신이 무엇이라고 부르는 지)에서 어느 정도 발생 할 수 있습니다. 그러나 미래의 릴리스에 대한 기능 브랜치를 장기간 실행하면 코드에 일어나는 모든 변화를 고려하기가 어렵습니다. 당신이 정말로 그것을 원 하든지간에 문제가 남아 있습니다. Martin Fowler는 그렇습니다.
지속적인 통합은 분기 전략을 결정하는 어떤 요소도되어서는 안됩니다. 분기 방식은 팀, 개발중인 시스템 및 사용 가능한 도구를 기반으로 선택해야합니다.
라고 한 .
CI가 두 가지 접근 방식 모두에서 사용할 수없는 이유는 없습니다. 당신이 그러한 접근 방식을 아주 잘 조합한다고 생각한다면 두 가지 방식 모두 불안정한 트렁크로 완전히 이해할 수 없습니다.
이 모든 것은 다이어그램을 가져온 페이지의 네 번째 질문 인 blogs. collab / subversion / 2007 / 11 / branching-strat /
원칙을 이해하는 한 최상의 지침을 항상 다시 작성할 수 있습니다. 당신이 원칙을 이해하지 못한다면 모범 사례는 상충되는 외부 요건 때문에 분열되기 훨씬 전에 당신을 데려 갈 것입니다.
링크를 읽으십시오. 기본 사항을 얻은 다음에는 Henrik Kniberg가 쓴 다음 기사를 읽으십시오. Mainline Model과 지속적인 통합을 연결하는 데 도움이 될 것입니다.
우리 팀을 시작했을 때 우리는 원래 시스템을 개발 한 공급 업체로부터 릴리스 기반 전략을 물려 받았습니다. 고객이 여러 가지 개발 된 기능을 릴리스에 포함하지 말 것을 요청할 때까지 작동했습니다 (f. y.i.
250k 라인의 코드,
2500 파일, 스크럼 (XP SDLC 포함)).
그런 다음 기능 기반 분기를 살펴 보았습니다. 이것은 또한 한동안 효과가있었습니다. 회귀 테스트 과정이 2 주 이상 걸릴 것이라는 점을 깨달았을 때까지 2 개월이 걸렸습니다. 출시 된 것이 무엇인지에 대한 불확실성과 함께 거대한 불편을 낳았습니다.
순수 SC 전략의 마지막 "못을 박는 것"은 안정적인 트렁크 2 개가 있어야한다고 결정했을 때였습니다. 생산에는 ST, UAT 및 회귀 분석 테스트 바이너리가 포함되어야합니다 (출처뿐만 아니라 CC).
이로 인해 기능 및 릴리스 기반 SC 전략 간의 하이브리드 전략을 고안하게되었습니다.
그래서 우리에게는 트렁크가있다. 스프린트 지점에서 분기하는 모든 스프린트 (복잡하지 않은 사용자의 경우 스프린트는 복잡성에 기반한 가변 출력의 시간 절약형 개발 작업입니다.) 스프린트 지점에서 기능 분기를 만들고 병렬 개발을 시작합니다. 일단 기능이 완료되고 시스템 테스트를 거친 후이를 배포하려는 의도가 생기면 스프린트 지점에 병합됩니다. 일부 스프린트는 여러 스프린트 (일반적으로 복잡한 스프레드)를 통해 플로팅 될 수 있습니다. 일단 스프린트가 끝나면 기능이 완료됩니다. 우리는 스프린트 분기를 "회귀"로 "이름을 바꿉니다"(이것은 CruiseControl이 재구성없이이를 다시 선택할 수있게 함). cc 내장 EAR에서 회귀 / 통합 테스트가 시작됩니다. 모든 것이 끝나면 생산 단계에 들어갑니다.
즉, 기능 기반 분기는 시스템 테스트 및 UAT 기능 개발에 사용됩니다. 스프린트 분기 (실제로는 릴리스 분기)는 온 디맨드 기능과 통합 테스트 기능을 선택적으로 병합하는 데 사용됩니다.
이제는 커뮤니티에 대한 질문입니다. CruiseControl의 많은 지점과 재구성 오버 헤드에서 개발이 이루어지기 때문에 지속적인 통합을 수행하는 데 분명히 문제가 있습니다. 누군가 제안하고 충고 할 수 있습니까?
내가 보는 방식대로 집중할 수있는 지점이 한정되어 있습니다. 테스트, 코드 품질 메트릭 및 빌드와 함께 실행하는 많은 흥미로운 것들이 필요하기 때문에 보고서가 너무 많으면 정보를 놓칠 수 있습니다.
분기 할 때와 수행 할 작업은 일반적으로 팀의 크기와 개발중인 기능의 크기에 따라 다릅니다. 나는 황금률이 ​​있다고 생각하지 않는다. 피드백을 조기 / 자주 얻을 수있는 전략을 사용하고 기능의 맨 처음부터 품질 관련성이 있는지 확인하십시오. 품질 비트는 팀이 발전하면서 자동화 할 때 팀이 구축중인 대규모 기능 세트를 위해 브랜치를 배치 할 경우 팀의 품질에도 영향을 주어야 함을 의미합니다.
ps 어디서 접근 했습니까? - 그 그래프가 모든 옵션을 대표한다고 느끼지 않습니다.
업데이트 1 : 내가 황금률이 ​​아니라고 말한 이유를 확장합니다. 기본적으로 상대적으로 소규모 팀의 경우 믹스 방식을 사용하는 것이 가장 좋습니다. 지형도 작성 점은 오랜 시간 동안 팀의 일부가 계속해서 더 작은 지형지 물을 추가 할 경우 만들어집니다.
나는 당신이 사용하는 도구가 여기 큰 요인이라고 생각합니다.
Subversion을 사용하는 경우, 옵션 1을 고수하고 지점에서 해제하십시오. GIT를 사용하고 있다면, 옵션 2가 잘 작동 할 것입니다.

Subversion 분기 전략
버전 제어 시스템의 기능 중 하나는 변경 사항을 별도의 개발 라인으로 격리하는 기능입니다. 이 선을 분기라고합니다. 브랜치는 컴파일러 오류 및 버그가있는 주요 개발 라인을 방해하지 않으면 서 새로운 기능을 시험하기 위해 자주 사용됩니다. 새로운 기능이 충분히 안정되자 마자 개발 브랜치가 메인 브랜치 (트렁크)에 병합됩니다.
버전 제어 시스템의 또 다른 기능은 특정 버전 (예 : 릴리스 버전)을 표시 할 수 있기 때문에 언제든지 특정 빌드 또는 환경을 다시 만들 수 있습니다. 이 과정을 태그 지정이라고합니다.
Subversion은 분기 나 태깅을위한 특별한 명령을 가지고 있지 않지만 소위 "값싼 사본"을 사용합니다. 값싼 복사본은 Unix의 하드 링크와 비슷합니다. 즉, 저장소에서 전체 복사본을 만드는 대신 특정 트리 / 개정을 가리키는 내부 링크가 만들어집니다. 결과적으로 가지와 태그는 매우 빠르게 생성되며 저장소에서 거의 공간을 차지하지 않습니다.
분기 또는 태그 만들기.
프로젝트를 권장 디렉토리 구조로 가져온 경우 분기 또는 태그 버전을 만드는 것이 매우 간단합니다.
그림 4.52. 분기 / 태그 대화 상자.
작업 사본에서 분기 또는 태그로 복사 할 폴더를 선택한 다음 TortoiseSVN → Branch / Tag 명령을 선택하십시오. .
새 분기의 기본 대상 URL은 작업 복사본의 기반이되는 원본 URL입니다. 해당 URL을 지점 / 태그의 새 경로로 편집해야합니다. 그래서 대신.
당신은 지금 같이 사용할 수 있습니다.
이전에 사용한 이름 지정 규칙을 기억할 수없는 경우 오른쪽의 버튼을 클릭하여 저장소 브라우저를 열면 기존 저장소 구조를 볼 수 있습니다.
중간 폴더.
대상 URL을 지정하면 마지막 폴더까지의 모든 폴더가 이미 존재해야하며 그렇지 않으면 오류 메시지가 나타납니다. 위의 예제에서 Release_1.10 태그를 만들려면 URL svn. collab / repos / ProjectName / tags /가 있어야합니다.
그러나 아직 존재하지 않는 중간 폴더가있는 URL에 대해 분기 / 태그를 만들려면 대화 상자 맨 아래에 중간 폴더 만들기 옵션을 선택할 수 있습니다. 해당 옵션이 활성화되면 모든 중간 폴더가 자동으로 생성됩니다.
이 옵션은 오타가 발생하지 않도록 기본적으로 비활성화되어 있습니다. 예를 들어 대상 URL을 svn. collab / repos / ProjectName / tags / Release_1.10 대신 svn. collab / repos / ProjectName / Tags / Release_1.10으로 입력하면 옵션을 사용하지 않으면 오류가 발생하지만 옵션을 사용하면 폴더 태그가 자동으로 만들어지고 태그 및 폴더 태그 폴더로 끝납니다.
이제 복사 원본을 선택해야합니다. 여기에 세 가지 옵션이 있습니다.
새 분기는 HEAD 개정에서 저장소에 직접 복사됩니다. 작업 복사본에서 데이터를 전송할 필요가 없으며 지사가 매우 빠르게 생성됩니다.
저장소의 특정 개정판.
새 분기는 저장소에 직접 복사되지만 이전 개정을 선택할 수 있습니다. 지난 주에 프로젝트를 릴리스 할 때 태그를 잊어 버린 경우 유용합니다. 개정 번호가 기억 나지 않으면 오른쪽의 버튼을 클릭하여 개정 로그를 표시하고 거기에서 개정 번호를 선택하십시오. 다시 작업 복사본에서 데이터가 전송되지 않고 지점이 매우 빠르게 생성됩니다.
새로운 지사는 로컬 작업 복사본과 동일한 복사본입니다. 일부 파일을 WC의 이전 버전으로 업데이트했거나 로컬 변경을 수행 한 경우 바로 그 내용이 사본에 포함됩니다. 당연히 이러한 종류의 복잡한 태그는 이미 존재하지 않는 경우 WC에서 저장소로 데이터를 다시 전송하는 작업을 포함 할 수 있습니다.
작업 복사본을 새로 생성 된 브랜치로 자동 전환하려면 작업 복사본을 새 브랜치 / 태그로 전환 확인란을 사용하십시오. 그러나 그렇게한다면 먼저 작업 복사본에 수정 사항이 포함되어 있지 않은지 확인하십시오. 이 경우 변경하면 스위치가 전환 될 때 지점 WC에 병합됩니다.
작업 복사본에 svn : externals 속성에 포함 된 다른 프로젝트가있는 경우 이러한 외부 객체는 분기 / 태그 대화 상자의 맨 아래에 나열됩니다. 각 외부에 대해 대상 경로와 소스 URL이 표시됩니다.
새 태그가 항상 일관성있는 상태인지 확인하려면 모든 외부 항목을 검사하여 개정판을 고정 시키십시오. 외부를 검사하지 않고 그 외부 참조가 향후 변경 될 수있는 HEAD 개정을 가리킨다면 새 태그를 체크 아웃하면 외부 및 태그의 HEAD 개정이 더 이상 컴파일되지 않을 수 있습니다. 따라서 태그를 만들 때 외부 참조를 명시 적으로 수정하는 것이 좋습니다.
외부는 지점 / 태그의 소스에 따라 현재 HEAD 개정판이나 작업 카피 BASE 개정판에 자동으로 고정됩니다.
표 4.1. 고정 된 개정판.
외관 외부.
외부 프로젝트에 외부 객체가 포함되어 있다면 태그가 추가되지 않습니다! 직접적인 자식 인 외부 만 태그 할 수 있습니다.
확인을 눌러 새 사본을 저장소에 적용하십시오. 로그 메시지를 제공하는 것을 잊지 마십시오. 사본은 저장소 내부에서 작성됩니다.
작업 사본을 새로 생성 된 브랜치로 전환하지 않는 한 브랜치 또는 태그를 작성해도 작업 사본에는 영향을 미치지 않습니다. WC에서 브랜치를 작성하더라도 변경 사항은 트렁크가 아닌 새 브랜치로 커밋되므로 WC는 트렁크에 대해 수정 된 것으로 표시 될 수 있습니다.
가지 또는 태그를 만드는 다른 방법.
작업 복사본이 없어도 지점이나 태그를 만들 수 있습니다. 이를 수행하려면 저장소 브라우저를여십시오. 폴더를 새 위치로 끌 수 있습니다. 사본을 만들 때 드래그하는 동안 Ctrl 키를 누르고 있어야합니다. 그렇지 않으면 폴더가 복사되고 이동하지 않습니다.
마우스 오른쪽 버튼으로 폴더를 드래그 할 수도 있습니다. 마우스 버튼을 놓으면 컨텍스트 메뉴에서 폴더를 이동하거나 복사할지 여부를 선택할 수 있습니다. 물론 지점이나 태그를 만들려면 이동하지 말고 폴더를 복사해야합니다.
또 다른 방법은 로그 대화 상자입니다. 예를 들어 로그 대화 상자를 표시 할 수 있습니다. 트렁크에서 개정판을 선택하고 (맨 위 또는 이전 개정판의 HEAD 개정판), 오른쪽 마우스를 클릭하고 개정판에서 분기 / 태그 작성을 선택하십시오. .
체크 아웃 또는 전환하려면.
. 그것은 (정말로) 질문이 아닙니다. 체크 아웃이 저장소의 원하는 지점에서 작업 디렉토리, TortoiseSVN → 스위치로 모든 것을 다운로드하는 동안. 변경된 데이터 만 작업 복사본으로 전송합니다. 좋은 네트워크로드, 인내심에 대한 좋은. :-)
새로 생성 된 가지 또는 태그를 처리하려면 여러 가지 방법이 있습니다. 할 수있는 일 :
TortoiseSVN → 체크 아웃하면 빈 폴더에서 새로 체크 아웃됩니다. 로컬 디스크의 어느 위치에서나 체크 아웃 할 수 있으며 리포지토리에서 원하는만큼 많은 작업 복사본을 만들 수 있습니다.
현재 작업 사본을 저장소에서 새로 작성한 사본으로 전환하십시오. 프로젝트의 최상위 폴더를 다시 선택하고 TortoiseSVN → 스위치를 사용하십시오. 컨텍스트 메뉴에서.
다음 대화 상자에서 방금 작성한 브랜치의 URL을 입력하십시오. Head Revision 라디오 버튼을 선택하고 OK를 클릭하십시오. 작업 복사본이 새 분기 / 태그로 전환됩니다.
스위치는 업데이트와 마찬가지로 작동하여 로컬 변경 사항을 무시하지 않습니다. 아직 커밋되지 않은 작업 복사본에 대한 모든 변경 사항은 스위치를 수행 할 때 병합됩니다. 이 문제가 발생하지 않게하려면 전환하기 전에 변경 사항을 커밋하거나 작업 복사본을 이미 커밋 된 수정본 (일반적으로 HEAD)으로 되돌려 야합니다.
트렁크 및 지점에서 작업하고 싶지만 새로 계산 된 비용을 원하지 않는 경우 Windows 탐색기를 사용하여 다른 폴더에서 트렁크 체크 아웃 사본을 만든 다음 TortoiseSVN → 스위치를 사용할 수 있습니다. 그 복사본을 새 지점으로 복사하십시오.
그림 4.53. 스위치 대화 상자.
Subversion은 태그와 브랜치를 구별하지 않지만 일반적으로 사용되는 방식은 약간 다릅니다.
태그는 일반적으로 특정 단계에서 프로젝트의 정적 스냅 샷을 만드는 데 사용됩니다. 따라서 개발을 위해 일반적으로 사용되지는 않습니다. 즉 지점이 무엇인지에 대한 것이기 때문에 처음에는 / trunk / branches / tags 저장소 구조를 권장했습니다. 태그 개정 작업은 좋은 생각이 아니지만 로컬 파일이 쓰기 보호되어 있지 않으므로 실수로이 작업을 중단하지 않아도됩니다. 그러나 / tags /가 들어있는 저장소의 경로를 커밋하려고하면 TortoiseSVN이 경고합니다.
이미 태그를 추가 한 릴리스를 추가로 변경해야 할 수도 있습니다. 이를 처리하는 올바른 방법은 태그에서 새 분기를 먼저 만들고 분기를 커밋하는 것입니다. 이 지점에서 변경 사항을 수행 한 다음이 새 지점에서 새 태그를 만듭니다. Version_1.0.1.
브랜치에서 작성한 작업 카피를 수정하고 커밋하면 모든 변경 사항이 트렁크가 아닌 새 브랜치로 이동합니다. 수정 사항 만 저장됩니다. 나머지는 싼 사본으로 남아 있습니다.

Subversion 분기 전략
이 문서는 Apache. x "1.7 버전의 Subversion? 을 설명하기 위해 작성되었습니다. 다른 버전의 Subversion을 사용하는 경우 svnbook /을 방문하고 사용중인 Subversion 버전에 해당하는이 설명서의 버전을 참조하십시오.
일반적인 분기 패턴.
분기 및 svn 병합에는 여러 가지 용도가 많이 있으며이 절에서는 가장 일반적인 방법을 설명합니다.
버전 관리는 소프트웨어 개발에 가장 많이 사용되기 때문에 프로그래머 팀이 사용하는 가장 일반적인 분기 / 병합 패턴 중 두 가지를 빠르게 살펴볼 수 있습니다. 소프트웨어 개발을 위해 Subversion을 사용하지 않는다면이 섹션을 건너 뛰십시오. 처음으로 버전 관리 기능을 사용하는 소프트웨어 개발자 인 경우이 패턴은 숙련 된 사람들이 모범 사례로 간주하기 때문에주의를 기울여야합니다. 이 프로세스는 Subversion에만 국한되지 않습니다. 모든 버전 제어 시스템에 적용 할 수 있습니다. 여전히 Subversion 용어로 설명하는 것이 도움이 될 수 있습니다.
분기 해제.
대부분의 소프트웨어에는 코드, 테스트, 릴리스, 반복과 같은 일반적인 수명주기가 있습니다. 이 프로세스에는 두 가지 문제점이 있습니다. 첫째, 개발자는 새로운 기능을 계속 작성해야하며 품질 보증 팀은 소프트웨어의 안정 버전을 테스트하는 데 시간을 할애해야합니다. 소프트웨어가 테스트되는 동안 새로운 작업을 중단 할 수 없습니다. 둘째, 팀은 거의 항상 이전 버전의 소프트웨어를 지원해야합니다. 최신 코드에서 발견 된 버그는 출시 된 버전에도 존재할 가능성이 큽니다. 고객은 주요 새 릴리스를 기다리지 않고 버그 수정을 원합니다.
버전 관리가 도움이되는 곳은 다음과 같습니다. 일반적인 절차는 다음과 같습니다.
개발자는 모든 새로운 작업을 트렁크에 위탁합니다. / trunk : 새로운 기능, 버그 수정 등 일상적인 변경이 커밋됩니다.
트렁크는 “ 릴리스 ” 지점으로 복사됩니다. 팀이 소프트웨어 출시 준비가되었다고 생각하면 (예 : 1.0 릴리스) / trunk가 /branches/1.0에 복사 될 수 있습니다.
팀은 계속해서 병행합니다. 한 팀은 릴리스 지점에 대한 엄격한 테스트를 시작하고 다른 팀은 / trunk에서 새로운 작업 (예 : 버전 2.0)을 계속합니다. 두 위치에서 버그가 발견되면 수정 사항은 필요에 따라 앞뒤로 이식됩니다. 그러나 어떤 시점에서 그 프로세스조차 중지됩니다. 지점은 릴리스 직전 최종 테스트를 위해 고정 된 †is입니다.
분기가 태그 지정되고 해제됩니다. 테스트가 완료되면 /bags/1.0.0이 /tags/1.0.0에 참조 스냅 샷으로 복사됩니다. 태그는 고객에게 패키지로 제공됩니다.
분기는 시간이 지남에 따라 유지됩니다. 버전 2.0에서는 작업이 / trunk에서 계속되지만 버그 수정은 / trunk에서 /branches/1.0으로 계속 포팅됩니다. 충분한 버그 수정이 축적되면 관리자는 1.0.1 릴리스를 결정할 수 있습니다. /branches/1.0은 /tags/1.0.1에 복사되고 태그는 패키지되고 릴리스됩니다.
소프트웨어가 완성됨에 따라이 전체 프로세스가 반복됩니다. 2.0 작업이 완료되면 새로운 2.0 릴리스 분기가 생성, 테스트, 태그 지정되고 결국 릴리스됩니다. 몇 년 후 저장소는 “ maintenance ” 모드의 여러 릴리스 지점과 최종 출하 버전을 나타내는 여러 태그로 끝납니다.
피쳐 브랜치.
지부 (feature branch)는이 장 (Sally가 / trunk에서 계속 작업하는 동안 작업 해 왔던 것)에서 가장 중요한 예제 인 분기의 일종입니다. / trunk의 안정성을 방해하지 않고 복잡한 변경 작업을하기 위해 만든 임시 분기입니다. 릴리스 분기 (영원히 지원되어야 할 수도 있음)와 달리 기능 분기는 태어나 잠시 동안 사용 된 다음 트렁크로 다시 병합 된 다음 궁극적으로 삭제됩니다. 그것들은 유한 한 유용성을 가지고 있습니다.
다시 말하지만, 프로젝트 정책은 기능 분기를 만드는 것이 적절한시기와 관련하여 광범위하게 다릅니다. 일부 프로젝트는 기능 분기를 전혀 사용하지 않습니다. / trunk에 대한 커밋은 모두 무료입니다. 이 시스템의 장점은 simple†"아무도 분기 또는 합병에 대해 배울 필요가 없다는 것입니다. 단점은 트렁크 코드가 종종 불안정하거나 사용할 수 없다는 것입니다. 다른 프로젝트는 극단적 인 지점을 사용합니다. 변경 사항이 트렁크에 직접 적용되지 않습니다. 가장 사소한 변경조차도 수명이 짧은 지점에서 작성되고 신중하게 검토되어 트렁크에 병합됩니다. 그런 다음 분기가 삭제됩니다. 이 시스템은 항상 안정적이고 사용 가능한 트렁크를 보장하지만 엄청난 처리 오버 헤드가 발생합니다.
대부분의 프로젝트는 중간 정도의 접근 방식을 취합니다. 그들은 일반적으로 / trunk가 항상 회귀 테스트를 컴파일하고 통과한다고 주장합니다. 기능 브랜치는 많은 수의 불안정한 커밋을 변경해야하는 경우에만 필요합니다. 엄지 손가락의 좋은 규칙은이 질문을하는 것입니다. 개발자가 며칠 동안 일을하고 큰 변화를 한꺼번에 다뤘 으면 (즉 트렁크가 결코 불안정 해지지 않도록) 검토하기에는 너무 큰 변화가 될까요? 그 질문에 대한 답이 예, 그렇다면 변화는 기능 분과에서 개발되어야합니다. 개발자가 지점에 대한 점진적 변경을 커밋함에 따라 동료가 쉽게 검토 할 수 있습니다.
마지막으로, 업무가 진행됨에 따라 트렁크와 동기화되는 †in에 기능 지점을 유지하는 방법에 대한 문제가 있습니다. 앞서 언급했듯이 몇 주 또는 몇 달 동안 지사에서 일할 큰 위험이 있습니다. 트렁크 변경 사항이 두 줄의 개발 차이가 너무 커서 트렁크에 다시 분기를 병합하는 악몽이 될 수도 있습니다.
이 상황은 분기에 대한 트렁크 변경 사항을 정기적으로 병합하여 피하는 것이 가장 좋습니다. 정책을 세우십시오 : 일주일에 한 번 지난 주 트렁크 변경 사항을 지점에 병합하십시오.
결국 “ 동기화 된 ” 기능 브랜치를 트렁크에 다시 병합 할 준비가되면 브랜치에 대한 최신 트렁크 변경 사항의 최종 병합을 수행하는 것으로 시작하십시오. 이것이 끝나면 지사와 트렁크의 최신 버전은 지사가 변경된 경우를 제외하고 완전히 동일합니다. 그런 다음 --reintegrate 옵션으로 다시 병합합니다.
이 패턴에 대한 또 다른 생각은 분기에 대한 트렁크의 주간 동기화가 작업 복사본에서 svn update를 실행하는 것과 유사하다는 점입니다. 마지막 병합 단계는 작업 복사본에서 svn commit을 실행하는 것과 유사합니다. 어쨌든 작업 복사본은 무엇이지만 매우 얕은 사설 지사가 또 있을까요? 한 번에 하나의 변경 사항 만 저장할 수있는 지점입니다.
Ben Collins-Sussman, Brian W. Fitzpatrick 및 C. Michael Pilato가 Subversion을 사용하여 버전 관리 (Subversion 1.7)를 읽었습니다.

Comments

Popular posts from this blog

스톡 옵션의 단기 자본 이익

Forexcopy 상인

내 외환 거래 전략