2008-10-01 5 views
2

이 게시물을 여기에 게시하면 (How do you manage database revisions on a medium sized project with branches?) 분기를 사용하고 개발, 배포 및 프로덕션으로 웹 프로젝트에서 작업하는 것이 가장 좋습니다. 로컬 사본 포함).소스 코드 관리 전략 - 분기, 태그 지정, 분기 등 - 웹 응용 프로그램의 경우

우리는 "릴리스"그 자체가 없습니다 : 기능이 눈에 띄게 커지면 라이브 테스트를합니다 (필요한 테스트를 마친 후 등). 그렇지 않으면 몇 분 일괄 처리하고 " 편안한 ", 살다. 목표는 끊임없이 이동하는 사이트가 사용자를 조금 불안하게 만드는 경향이 있기 때문에 한 달에 한두 번 정도 배포하지 않는 것입니다. 여기

우리가 그것을 할 방법, 그리고 (현재 SVN을 사용하지만, 자식로 전환을 고려) 종류의 취성 느낌 :

  1. 두 "가지"-로 표시 STAGE 주어진 발표와 함께 DEV 및 STAGE TRUNK
    • 개발자는 모든 변경 사항을 트렁크의 사본을 확인하고 (단지 투표처럼 : 일찍 그리고 자주) 자주 코드 확인,
    • 개발자가 로컬로 작동 그것을 위해 지점을 생성
    • 개발자 인 경우 안심하고 완전히 망가지지 않고 DEV와 병합하고 개발 현장에 배치하십시오.
    • 변경 사항이 완료 될 때까지 3-4 단계를 반복하십시오.
    • 변경 분기를 STAGING과 병합하고 스테이지 사이트에 배포하십시오. 예상 최종 테스트를 수행하십시오.
    • 은 일정 기간 후, TRUNK으로 STAGE 주어진 개정을 표시하고

이제 트렁크는

  • 병합 TRUNK가 동기화를 유지하기 위해 아래 DEV 다시 변경 살고 일부를 밀어 이 단계들 중 상당 부분은 손으로 흔들어 놓은 상태에서 매우 복잡하며, 실제로는 (TRUNK -> DEV는 항상 깨지기 쉽지 않습니다.) 그래서 나는 더 나은 방법이 있다고 상상해야합니다.

    생각하십니까?

  • 답변

    2

    분기 편리합니다, 당신은 지속적인 통합 작업을 할 시험의 충분한 몸이 없습니다. 프로그래밍 작업이 너무 커서 예측 가능한 방식으로 완료 할 수없는 상점에서 분기점 미친 개발을 보는 경향이 있습니다. 따라서 관리부는 출시 직전까지 어떤 기능을 제공할지 결정하기를 기다리고 싶어합니다. 그런 종류의 작업을 수행하는 경우 분산 된 버전 제어를 사용하는 것이 좋습니다. 모든 작업 디렉토리는 자연스럽게 지사이며 다른 사람을 해치지 않고 먹을 수있는 모든 지역 체크인 및 지역 기록을 가져옵니다. 트렁크 외부의 다른 개발자와도 병합 할 수 있습니다.

    내 취향은 우리가 다음 릴리스 태그 릴리스 후보 지점으로 불안정한 트렁크에서 작업 할 때, 그리고 다음 긴급 패치 스트림이되는. 그런 시스템에서, 당신은 거의 3 개 이상의 브랜치를 가지지 않습니다 (마지막 릴리즈, 현재 릴리스 후보, 불안정한 트렁크). 이 작업은 TDD를 수행하고 불안정한 트렁크에 CI가있는 경우 작동합니다. 모든 작업을 세분화하여 원하는만큼 자주 코드를 전달할 수 있어야합니다 (일반적으로 작업은 1-2 일만 걸릴 수 있으며 기능을 구성하는 다른 모든 작업없이 다시 열 수 있어야합니다). 따라서 프로그래머는 작업을 수행하고 트렁크를 체크 아웃하고 작업을 수행하고 모든 테스트가 통과 할 때마다 동기화하고 체크 인합니다. 불안정한 트렁크는 릴리스 후보로 분기 할 때 항상 사용할 수 있으며 (모든 테스트가 통과하면) 릴리스가 비 이벤트가됩니다.

    전반적으로 더 나은 수단 : 적은 지점, 짧은 작업, 해제 짧은 시간, 더 많은 테스트.

    1

    TRUNK-> DEV의 최종 영향을 최소화하기 위해 "parent"환경 STAGE에서 "child"환경 "DEV"를 개발자 분기로 더 자주 병합하는 "rebase" 더 이상 필요하지 않을 것입니다.

    즉, STAGE에서 수행 된 모든 작업 (한 번에 프로덕션으로 이동해야 함)은 DEV 및 사설 개발 부서에서 가능한 한 일찍 병합되어야합니다. 그렇지 않은 경우 후기 병합 병합은 항상 고통 스럽습니다.

    그러나 위의 병합 워크 플로가 너무 불편하므로 릴리스 (새 TRUNK) 직후 최신 DEV를 기반으로 REBASE 분기를 제안합니다. 리베이스 TRUNK-> DEV는 TRUNK-> REBASE가되어 모든 문제가 해결 된 다음 DEV-> REBASE를 병합하여 현재의 모든 dev가 새로운 업데이트 된 시스템과 호환되는지 확인합니다. REBASE에서 DEV (그리고 사적인 dev 브랜치) 로의 최종적인 병합은 프로세스를 완료 할 것이다.
    지점의 요점은 다른 현재 개발 노력과 함께 수행 할 수없는 개발 노력을 격리하는 것입니다. TRUNK-> DEV가 너무 복잡하여 현재 DEV와 호환되지 않는 경우에는 격리시켜야합니다. 따라서 'REBASE'지점 건의안.

    +0

    내가 두 번째 시나리오는 svn1.4 이하에 있기 때문에, 미리 1.5 SVN 더 편리하다고 지적 것, 그래서 자주 병합은 더 복잡, 역사는 기록되지 않습니다 병합 할 것. – VonC

    0

    내가 SVN을 사용하는 상점에서 일하고 있습니다. 우리가 C++ 개발을하는 동안 버전 관리는 꽤 보편적입니다.다음은 우리의 접근 방법입니다. 귀하가 접근 할 수있는 것이 무엇인지 결정할 수 있습니다. 우리

    는 모든 개발은 지점에서 발생합니다. 우리는 모든 버그와 모든 기능에 대해 분기합니다. 이상적으로, 해당 지점은 오직 하나의 기능에 대해서만 사용되지만 때로는 의미가없는 경우도 있습니다. 작업이 완료, 테스트 및 "준비"때

    우리는 트렁크에 변경 사항을 병합합니다. 우리 규칙은 어떤 시점에서도 트렁크가 코드를 깨뜨리지 않아야한다는 것입니다. 태그 그대로 릴리스 지점이 생성됩니다 깨진 코드가 고정 트렁크에 그것의 방법을 찾아야 경우는 우선 순위 기능을 모두 수행과 병합 될 때 1

    자료가 만들어집니다. 태그를 사용하면 필요한 경우 셰이프 샷을 검색 할 수 있습니다. 지사는 이전 버전 지원을 허용합니다. 릴리즈 된 버전의 버그 수정은 해당 릴리즈의 브랜치로 분기하여 수행됩니다. 모두 정상이면 변경 사항이 릴리스의 분기점으로 병합되고 원할 경우 트렁크까지 통합됩니다. 당신이 작업이 제 시간에 완료되지 않을 것으로 예상하는 경우