문제

동료와 저는 릴리스/SCM 시스템에서 태그의 가치와 사용에 대해 논쟁을 벌이고 있습니다. 우리는 Stackoverflow 커뮤니티를 찾고 있으며 문제를 해결하는 데 도움이되는 그들의 생각을하고 있습니다.

한쪽은 태그가 릴리스 관리에 귀중한 추가 사항이라고 주장합니다. 사용의 예 : 우리는이 릴리스에 사용되는 코드 스냅 샷 인 새 태그 (1.0 호기)를 만듭니다. 이 태그는 준비된 분기 여야합니다. 버그를 수정 해야하는 경우 태그 사본을 새 지점으로 만들 수 있습니다 (1.1 호출). 버그 수정이 거기에갑니다. 이 수정 사항은 메인 데브 브랜치가 버그 수정을받을 수 있도록 트렁크로 다시 병합 될 수 있습니다. 마지막으로 1.1이 릴리스되고 태그 1.1이 자동으로 생성됩니다. 이주기는 계속됩니다. 태그의 주요 장점은 어떤 이유로 든 버전 1.0을 다시 릴리스 해야하는 경우 누구에게도 변경되지 않았다는 확신으로 태그 1.0을 릴리스 할 수 있다는 것입니다. 또한 "릴리스 태그 1.0"이라는 말은 "수정이없는 원래 1.0 인 Branch 1.0의 릴리스 개정 1"이라고 말하는 것보다 깨끗합니다.

다른 쪽은 태그가 특히 CVS의 태그처럼 작용하는 글로벌 개정판과의 전복과 같은 시스템에서는 귀중한 이점을 제공하지 않는다고 주장합니다. 또한, 전복은 태그에 커밋 할 때만 경고를합니다. 실제로는 멈추지 않습니다. 그들의 방법은 트렁크에서 개발되고 있으며 릴리스되면 1.0이라는 분기를 만듭니다. 트렁크에서 버그 수정을 계속할 수 있으며 버그 수정을 생산에 다시 릴리스 해야하는 경우 1.0 분기 및 1.0을 다시 릴리스합니다. 어느 시점에서, 아마도 트렁크의 주요 수정 또는 기능 후에는 1.1을 출시하고 만들 것입니다. 사이클이 계속됩니다. 원래 1.0 버전을 해제 해야하는 경우 Branch 1.0 개정 1을 확인해야합니다.

분명히 두 가지 방법이 작동합니다. 어떤 방법이 선호되는지에 대한 커뮤니티의 생각을 듣고 싶습니다.

편집 : "최고의"방식이 기본 SCM 시스템에 달려 있다고 걱정합니다. 답변을 위해 전복에 정착하거나 가능한 경우 SCM Agnostic을 유지하십시오.

도움이 되었습니까?

해결책

SCM의 비수적 관점에서, a 꼬리표 개정과는 매우 다릅니다.

둘 다 같은 방식으로 구현 될 수 있으며, 둘 다 "타임 라인"을 나타내지 만 목표는 다릅니다.

  • 태그는 an을 나타냅니다 불변 모든 파일이 고유 한 ID로 참조되는 상태. 이름입니다 많은 것을 대표합니다 그러나 주로 안정적인 상태, ...)
  • 개정은 커밋 거래를 나타냅니다 (모든 SCM에 그 사람이있는 것은 아닙니다, 특히 '파일 별 접근법'을 가진 오래된 것들). 모든 커밋은 "안정적인"상태를 나타내지 않습니다 ( "Compile"또는 "Execute"에서와 같이). 그들은 세계사의 새로운 요소 일뿐입니다.

SVN의 문제점은 개정, 태그 및 브랜치가 모두 동일하게 구현된다는 것입니다.
그러나 나는 여전히 태그가 사용되는 옵션을 선호합니다. "읽기 전용"지점.

다른 팁

내 의견으로는 태그가 유용합니다. 프로젝트의 어느 시점에서 프로젝트의 어느 시점에서 버그 나 변화를 발견하고 이전 릴리스에 있는지 알고 싶습니다. 성능과 실제로 코드 개발에서 효율성을 측정하기 위해 코드를 한 릴리스에서 다른 릴리스로 비교 해야하는 이유가 있습니다.

물론, 당신이 그것을 망칠 수있는 기회가 있지만, 항상 취소 할 수 있습니다. 실제로는 이유가 없으며 미래에 유용 할 수있는 몇 가지 이유가 있습니다. 나에게 그것은 쉬운 일이 아닙니다.

나는 당신이 또한 가지를 사용하고 개발을 수행해야한다는 데 동의하지만 실제로 무언가를 출시 할 때마다 태그를 만들어냅니다.

예, 태그를 사용하고 싶습니다.

태그를 특정 개정의 레이블 또는 이름으로 생각하십시오. 제작 릴리스이든 심지어 임시 QA 릴리스에 관계없이 프로젝트에서 중요한 이정표를 태그하는 것이 내 경험에 매우 도움이됩니다. 당신은 종종 시간을 거슬러 가서 특정 릴리스의 소스 코드를보고 싶을 것입니다.

릴리스시 분기되면 언제든지 생산에 출시 된 개정판을 파악할 수 있지만 태그 만 보는 것과 비교할 때 이것은 일종의 고통입니다. 릴리스 브랜치를 사용하지 않으면 특정 빌드를 만드는 데 사용 된 개정판을 쉽게 잃어 버릴 수 있습니다.

SVN의 문제는 태그와 가지의 구별을 흐리게한다는 것입니다. 누구나 항상 태그에 최선을 다할 수 있으므로 고정/불변성이 보장되지는 않습니다. PVC와 같은 다른 VC에서는 "태그"는 변경할 수 없습니다. 팀 컨벤션을 채택하여 태그에 대한 커밋을 방지하거나 커밋 후크를 사용하여 태그에 대한 커밋을 방지 할 수도 있습니다.

새 기준선을 만들 때 태그 (레이블)를 사용합니다. 우리는 일주일에 한 번 그렇게하지만 일부 팀은 하루에 여러 번 그렇게합니다.

요점은 항상 새로운 기준선이 안정적인지 확인하는 것입니다. 따라서 빌드만이 아니라 전체 테스트 수영을 통과하는 빌드, 몇 시간의 자동 테스트 및 잠재적으로 수동 탐색 적 탐색 적 탐색 적 탐색도 있습니다.

그런 다음 기준선은 다음 반복하는 동안 모든 작업에 대한 출발점으로 사용됩니다. 모든 새로운 작업은 기준선에서 시작하는 새로운 지점으로, 안정된 것으로 알려져 있으므로 작업 자체 내부에서 깨지기 쉬워야합니다. .

일반적으로 우리는 다른 모든 지점의 통합 지점 인 메인 브랜치 (또는 SCM 풍미에 따라 트렁크 또는 마스터)에 태그 (레이블) 만 넣습니다.

공식 제품을 출시 할 때 "릴리스 브랜치"를 만듭니다. 따라서 새로운 개발은 "메인"에 남아있는 동안 만 수정 사항을 받게됩니다. 그런 다음 이러한 "유지 보수 분기"(한 번에 한두 번만)에도 태그가 지정 될 수 있습니다.

나는 태그에 대해 "개정의 멋진 이름"이라고 생각하고 싶습니다. 나는 항상 그런 식으로 그들에 대해 생각했고, IIRC는 그저 그저입니다. 그러나 당신이 말했듯이, 그들은 실제로 (저렴한) 트렁크/* to tags/fancy-name/입니다.

솔직히, 나는 최적의 결과를 위해 두 가지 전략을 결합하여 출시시 태그와 분기입니다. 태그를 1.0.0, 분기 1.0 메인이라고합니다. 버그 수정은 분기에 들어가고 버그 픽스 릴리스는 다시 태그입니다 (1.0.1은 특정 지점에서 1.0 메이어를 별명으로 만들기위한 태그로 5 월 5 일을 할 수 있습니다.)

그러나 전복의 태그와 가지가 실제로 같은 것이라는 것을 잊지 마십시오. 저렴한 사본입니다. 그들 사이의 유일한 차이점은 당신/ 당신의 팀 속성의 의미론이므로 사람들이 하나의 미용 방법에 동의하고이를 고수하게하는 데 거의 요약됩니다 (예 : 태그로의 커밋을 허용하지 않을 수 있습니다. 릴리스 코디네이터 등)

두 번째 접근 방식에서 볼 수있는 문제는 다음과 같습니다. 즉, 실제로 다른 코드 기반을 참조하는 1.0과 다른 1.0이있을 수 있습니다.

프로젝트 소스 코드 (및 실행 파일)의 불변의 스냅 샷은 구조화 된 테스트 또는 필드 사용에 관계없이 모든 종류의 테스트를 수행하는 데 매우 중요합니다. 구조화 된 테스트의 경우 앞으로 몇 달 또는 몇 년 동안 참조 될 수있는 데이터를 만들 것입니다. Murphy 's Law는 그 데이터를 다시 방문 할 때마다 그 데이터에서 어떤 코드에서 왔는지 알아야하며 소스 코드의 특정 스냅 샷을 인용하는 데 어려움을 겪지 않으면 소스 코드가 무엇을 상응하는지 확신 할 수 없을 것입니다. 그 테스트 데이터.

누군가가 나에게 몇 번이나 와서 "이 마이크로 컨트롤러 코드가 작동하지 않습니까? 도와 줄 수 있습니까?" 그리고 나는 그들에게 "어떤 버전을 사용하고 있습니까?" 그리고 그들은 좋은 릴리스 관리를하지 않기 때문에 "나는 확실하지 않다"고 말합니다 (최소한 장치에 스티커를 넣는 것은 실시간으로 쿼리 될 수있는 EEPROM에 버전 설정 정보를 넣는 것이 좋습니다). > :(

SVN에서 태그 사용과 개정 추적의 기술적 차이는 NIL입니다. SVN의 구현이 단순히 저렴한 사본이며 "구조 공간"을 기울이는 방법에 따라 태그 사용을 최소화합니다.

진짜 차이는 언제옵니다 의사 소통 대규모 개발자 팀의 특정 기준. 개정 추적은 오류의 원인이 될 수있는 추가 추상화 계층을 제공합니다. 그리고 우리 모두가 알고 있듯이, 50 명 이상의 개발자를 다룰 때, 모든 오류의 원인은 혼란과 시간의 영역이 될 것입니다. 장황한 태그는 그 혼란을 제거하고 기준선의 목적이 무엇인지에 대한 의심을 제거 할 수 있습니다.

나는 두 가지 접근법을 결합했다. 릴리스 할 때마다 태그를 표시하십시오. 태그는 변경되지 않아야하므로 "1.0.0"태그의 존재는 1.0.0으로 다른 것을 해제하지 않아야한다는 표시기입니다.

동시에, 1.0.0을 할 시간이되었을 때, 나는 그것을 1.0 지점에 넣었다. 따라서 흐름은 다음과 같습니다. 분기 트렁크는 1.0으로,이 새로운 1.0을 1.0.0으로 태그하고 배포하십시오. 그런 다음 1.0 지점에서 버그 수정을 수행 할 수 있습니다 (현재 트렁크에있을 수있는 1.1- 표적화 된 개발과 혼합되지 않도록). 트렁크로 병합되었습니다. 고정 1.0의 각 릴리스는 1.0 지점에서 1.0.x로 태그됩니다. 이것은 기본적으로 우리가 Perforce와 함께 사용하는 접근 방식이며, 이는 실제로 전복과 매우 유사합니다. (답변을 읽으면 Vincent의 추천과 사실상 동일하다고 생각합니다)

개정 번호가 있기 때문에 태그가 중복되는 것에 대한 의견에 관한 한 --- 그 범위는 범위를 지정한다는 점을 제외하고는 대체로 사실입니다. 당신은 누군가에게 /svn/proj1/tag/1.0.0을 보라고 합리적으로 요청할 수 있으며 즉시 일관된 작업 공간을보고 있습니다. 개정 X를 보라고 요청하면 먼저 개정 X를보고 (say)/svn/proj1/trunk/makefile을 확인하고/svn/proj1/trunk/@x를 추론해야합니다. 그들은보고 있어야합니다. 개정 X가 PROJ1 및 PROJ2에서 파일을 터치하면 어떻게됩니까? 물론 사악하지만 엄밀히 말하면/svn/proj1/trunk/@x를 말해야합니다. 그리고 개정 번호 목록은 어디에 저장됩니까? 1.0.0이 개정 x라는 것을 어떻게 알 수 있습니까? 리포지토리에서만 결정하는 것이 가능해야합니다.

git과 같은 시스템에서 태그와 브랜치는 여전히 기본적으로 동일합니다 (객체 데이터베이스에 대한 참조). 협약 그 태그 심판은 변하지 않으며, 분기 심판은 (그리고 바람직하게는 변화는 어떻게 변화하는지에 대한 구체적인 제약으로) Perforce에는 또한 "레이블"이 있으며, 이는 변경리스트와 독립적으로 파일 개정 세트를 그룹화하는 방법입니다. 이는 본질적으로 태그이지만 더 혼란 스럽습니다. 역사적으로 우리는 버전을 식별하기 위해 사용해야하는 지점의 이름으로 자격을 갖춘 Changelist 번호 (전복 개정 번호와 동일)를 사용했습니다. 둘은 거의 어떤 식 으로든 거의 동일하므로 여기서는 tmtowtdi를 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top