문제

나의 질문은 방법에 대해서는 Git 손잡이를 가지:때마다 당신을 지점에서 commit,이 가지 않을 것 받는 변화에서 부모점하지 않는 한 당신 그것을 해야합니다.

그러나 다른 시스템에서 이런 우리에게 클리어 케이스 또는 Accurev,지정할 수 있는 방법을 가득 어떤 종류의 상속 메커니즘:나는 뜻으로,클리어 케이스를 사용하여 config_spec,당신이 말할 수 있는"모든 파일을 얻을 수정에서점/main/issue001 다음 계속 그들에 주로 또는 이러한 특정 기준".

에 Accurev 당신은 또한 유사한 메커니즘을 가지고는 하자 스트림을 받을 변경에서 위쪽 지점(스트림을 그들이 어떻게 그들에게 전화)없이 합병 또는 새로 만들어지는 분기.

당신이 사용하는 동안 Git?할 수 있을 열거나 이 은 해야 합니까?

감사

업데이트 읽어 보시기 바랍 VonC 대답은 아래제 초점을 나의 질문입니다.일단 우리가 동의"선형 저장"및 DAG 기반 SCMs 다른 기능을 제 질문은: 는 실생활이 시나리오를(특히 회사를 위해 이상 OSS)는 선형이 할 수 있는 것을 가능하지 않 DAG?그들은 가치가?

도움이 되었습니까?

해결책

Git이 왜 "상속 메커니즘"(커밋이 포함되지 않음)이라고 부르는 것을 제공하지 않는 이유를 이해하려면 먼저 중 하나를 이해해야합니다. 핵심 개념 SCMS 중 (예 : GIT 대 CLEARCASE)

  • 클리어 케이스를 사용합니다 선형 버전 저장: 요소의 각 버전 (파일 또는 디렉토리)은 직접으로 연결됩니다. 선의 동일한 요소의 이전 버전과의 관계.

  • git을 사용합니다 멍청이 - 지시 된 acyclic 그래프: 파일의 각 "버전"은 실제로 커밋의 일부인 트리의 전역 변경 세트의 일부입니다. 그 이전 버전은 이전 커밋에서 찾아야하며 단일 지시 된 acyclic 그래프 경로를 통해 액세스 할 수 있어야합니다.

선형 시스템에서 구성 사양은 표시되는 "상속"을 달성하기위한 몇 가지 규칙을 지정할 수 있습니다 (주어진 파일의 경우 먼저 특정 버전을 선택한 다음 존재하지 않으면 다른 버전을 선택한 다음 존재하지 않으면 셋째, 그리고).

지점은 a 포크 안에 선의 히스토리 주어진 선택 규칙에 대한 주어진 버전 (여전히 적용하기 전에 다른 모든 선택 규칙이므로 "상속"효과가 있습니다).

DAG에서 커밋은 당신이 얻을 모든 "상속"을 나타냅니다. 버전의 "누적"선택은 없습니다. 이 그래프에는이 정확한 지점 (커밋)에서 볼 수있는 모든 파일을 선택하는 경로가 하나뿐입니다.
분기는이 그래프의 새로운 경로 일뿐입니다.

GIT에서 다른 버전을 적용하려면 다음 중 하나를 적용해야합니다.

그러나 GIT는 DAG 기반 SCM이므로 항상 새로운 커밋을 초래할 것입니다.

Git으로 "잃어버린"것은 일종의 "구성"입니다 (다른 연속 선택 규칙으로 다른 버전을 선택할 때). VCS ( "Distributed"에서와 같이) : GIT로 지점을 만들 때 시작점으로해야합니다. 그리고 내용 명확하게 정의되고 다른 저장소로 쉽게 복제됩니다.

순전히 중앙 VC에서는 원하는 규칙으로 작업 영역 (Clearcase, "보기", 스냅 샷 또는 동적)을 정의 할 수 있습니다.


알 수없는-구글 의견에 추가 (위의 질문에) :

따라서 두 모델이 다른 것들 (선형 대 DAG)을 달성 할 수 있다는 것을 알게되면, 내 질문은 다음과 같습니다. 실제 시나리오 (특히 OSS보다 더 많은 회사의 경우)는 DAG에 대해 불가능한 일을 할 수있는 일입니다. 그들은 그만한 가치가 있습니까?

선택 규칙 측면에서 "실제 시나리오"와 관련하여 선형 모델에서 할 수있는 것은 몇몇의 선택 규칙 같은 파일 세트에 대해.

이 "config spec"(clearcase가있는 선택 규칙에 대한 "configuration specification")를 고려하십시오.

element /aPath/... aLabel3 -mkbranch myNewBranch
element /aPath/... aLabel2 -mkbranch myNewBranch

'라벨이 붙은 모든 파일을 선택합니다.aLabel2'라벨이 붙은 사람들을 제외하고'(그리고 거기에서 분기) '(그리고 거기에서 분기)aLabel3' - 그리고 거기에서 분기 - (그 규칙이 언급 한 것보다 우선하기 때문에'aLabel2').

그만한 가치가 있습니까?

아니.

실제로, Clearcase의 UCM 풍미 (통합 구성 관리"Clearcase 제품에 포함 된 방법론과 기본 ClearCase 사용에서 추론 된 모든"모범 사례 "를 나타내는 방법)는이를 허용하지 않습니다. 단순성. 일련의 파일을 "구성 요소"라고하며 주어진 레이블 ( "기준선"이라고 함)에 대해 분기하려는 경우 다음 구성 사양과 같이 번역됩니다.

element /aPath/... .../myNewBranch
element /aPath/... aLabel3 -mkbranch myNewBranch
element /aPath/... /main/0 -mkbranch myNewBranch

당신은 선택해야합니다 하나 출발점 (여기, 'aLabel3') 그리고 거기에서 가십시오. 파일도 원한다면 'aLabel2', 당신은 모든 것과 합병 할 것입니다.'aLabel2'MyNewbranch'에있는 파일.

이는 "단순화"로, 그래프의 각 노드는 분기에 대해 고유하게 정의 된 "시작점"을 나타내며, 관련 파일 세트가 무엇이든간에.

병합 및 Rebase는 해당 시작점을 다른 버전의 주어진 파일 세트와 결합하여 원하는 "구성"을 달성하기 위해 특정 기록을 유지하기에 충분합니다. 격리 상태 지점에서.

일반적인 목표는 "추론하는 것입니다.일관성 버전 제어 작업에 적용됩니다 일관성 구성 요소 "."Coherent "파일 세트는 잘 정의 된 일관성 상태에 있습니다.

  • 라벨이 표시된 경우 모두 파일에 레이블이 붙어 있습니다
  • 분기 된 경우 모두 파일은 같은 독특합니다 출발점

그것은 DAG 시스템에서 쉽게 수행됩니다. 선형 시스템에서는 더 어려울 수 있지만 (특히 "구성 사양"이 까다로울 수있는 "베이스 클리어 케이스"의 경우) 동일한 선형 기반 도구의 UCM 방법론으로 시행됩니다.

"개인 선택 규칙 트릭"(클리어 케이스, 일부 선택 규칙 순서)을 통해 해당 "구성"을 달성하는 대신 VCS 운영 (Rebase 또는 Merge)만으로도 달성하여 모든 사람이 따라야 할 명확한 추적을 남깁니다 ( 개발자에게 비공개로 구성되거나 일부 개발자가 아닌 일부는 공유). 다시, 그것은 감각을 시행합니다 통일, "동적 유연성"과 달리 나중에 재생산하기가 어려울 수 있습니다..

그것은 당신이 영역을 떠날 수있게합니다 VCS (버전 제어 시스템) 그리고 영역을 입력하십시오 SCM (소프트웨어 구성 관리), 주로 "재현성". 그리고 그 (SCM 기능)은 선형 기반 또는 DAG 기반 VC로 달성 할 수 있습니다.

다른 팁

당신이 찾고있는 것이있을 것 같습니다 git rebase. 브랜치를 리바스하는 것은 개념적으로 원래 지점에서 분리되어 다른 지점에서 그것을 다시 잡아냅니다. (실제로, Rebase는 새로운 분기 지점에 분기의 각 패치를 적용하여 새 패치 세트를 생성하여 구현됩니다.) 예에서는 상단 분기의 현재 팁으로 분기를 다시 비제 할 수 있습니다. 본질적으로 다른 지점에 대한 모든 변경 사항을 "상속"합니다.

나는 당신이 무엇을 요구하는지에 대해 완전히 명확하지 않지만 Git의 추적 시맨틱이 당신이 원하는 것 같습니다. AM Origin에서 분기되면 다음과 같은 작업을 수행 할 수 있습니다.

git -t -b my_branch Origin/Master

그런 다음 미래의 "Git Pull"은 원산지/마스터를 작업 지점으로 자동 병합합니다. 그런 다음 "Git Cherry -V Origin/Master"를 사용하여 차이가 무엇인지 확인할 수 있습니다. 변경 사항을 게시하기 전에 "Git Rebase"를 사용할 수 있지만 역사를 정리할 수는 있지만 역사가 공개되면 Rebase를 사용해서는 안됩니다 (즉, 다른 사람들이 해당 지점을 따르고 있습니다).

Accurev가 사용하는 상속 체계에 관해서 : Git 사용자는 아마도 볼 때 모든 것을 "얻을"것입니다. git-flow (또한보십시오: http://github.com/nvie/gitflow 그리고 http://jeffkreeftmeijer.com/2010/why-arent-you-using-git-flow/)

이 git 분기 모델은 Accurev가 자동으로 그리고 엄청난 GUI 지원.

그래서 나타납니다 Git은 Accurev가하는 일을 할 수 있습니다. 나는 실제로 git/git-flow를 매일 사용한 적이 없기 때문에 실제로 그것이 어떻게 작동하는지 말할 수는 없지만 유망한 것처럼 보입니다. (제한 적절한 GUI 지원 :-)

나는 당신에게 질문에 대답하려고 노력할 것입니다. (여기서 나는 git을 사용하지 않았다고 여기서 말해야한다. 그래서 아래에서 언급 한 것이 잘못되면 나를 바로 잡으십시오)

"이 상속이 필수 인 시나리오를 열거 할 수 있습니까?"

나는 당신이 가지고있는 도구에 문제를 해결할 수 있고 환경에 유효한 솔루션이 될 수 있기 때문에 필수라고 말하지 않을 것입니다. 나는 그것이 도구 자체보다 프로세스의 문제라고 생각합니다. 프로세스가 일관성이 있는지 확인하고 중간 단계/상태를 재현하기 위해 시간을 거슬러 올라갈 수 있으며, 플러스는 도구를 사용하면 프로세스와 SCMP가 가능한 한 고통없이 실행할 수 있다는 것입니다.

내가 볼 수있는 한 가지 시나리오는 이것을 갖는 것이 편리합니다. '계승' 동작 및 구성 사양의 힘을 사용하십시오. 변경 세트를 원할 때입니다. "외딴"작업에 매핑되었습니다 (DevTask, CR, SR 또는 변경 세트의 목적/범위를 정의하는 것은 무엇이든)

이 구성을 사용하면 개발 지점을 깨끗하게하고 나머지 코드의 다른 조합 (구성 사용)을 사용할 수 있으며 여전히 작업과 관련된 것만 그 동안 가지에서 분리 된 전부의 통합 단계까지 작업의 수명주기.

"정의 된 출발점"을 갖기 위해 커밋/병합/Rebase가 있어야하는 순수 주의자.오염'당신의 지점과 당신은 당신의 변경 사항으로 끝날 것입니다. + 다른 사람 변경 지점/변경 세트.

이 격리는 언제/어디에 유용합니까? 포인트는 CMM과 일부 ISO 인증을 추구하는 회사의 맥락에서만 의미가있을 수 있으며 다른 종류의 회사 나 OSS에 관심이 없을 수도 있습니다.

  • 정말 까다 롭기 때문에 단일 개발자에 해당하는 변경 세트의 코드 라인 (추가/수정/삭제)을 정확하게 계산하고 나중에 코드 및 노력 추정을위한 하나의 입력으로 사용됩니다.

  • 단일 분기에 코드 만 있으면 다른 단계에서 코드를 검토하는 것이 더 쉬울 수 있습니다 (다른 변경 사항이 붙어 있지 않음).

여러 팀과 +500 명의 개발자가 동일한 기본 코드에서 동시에 적극적으로 작업하는 큰 프로젝트 (그래픽 개별 요소 버전 Trees는 여러로드 라인이있는 지저분한 얽힌 웹, 각 대형 고객당 하나 또는 각 기술마다 하나씩) 대형 구성. 여러 학위의 구성을 사용하는 사양은이 양의 사람들이 동일한 제품/시스템 (기본 코드)을 다른 목적으로 완벽하게 조정하기 위해 원활하게 작동했습니다. 이 구성 사양을 사용하여 각 팀 또는 하위 팀, 필요한 것과 다른 시점에서 다른 견해를 다, 중간 통합 분기를 생성 할 필요없이 (여러 경우에 계단) 시작 해야하는 비트. 동일한 작업/목적의 코드는 다른 레이블을 분기했지만 의미가있었습니다. (여기서 '알려진 기준'을 SCM의 원칙으로 주장 할 수는 있지만 서면 SCM 계획에 고려 된 간단한 라벨은 작업을 수행했습니다.) 이 '상속'행동 없이는 그림을 그리기가 정말 어렵습니다. VONC가 언급 한 요점은 "분기가 나면 모든 파일이 동일한 고유 한 출발점에서 분기 될 것"이 여기에서 깨 졌다고 생각하지만 SCMP에 잘 문서화되어 있었다.

예, 위에서 언급 한이 구성 사양을 구축하는 것은 무료가 아니 었습니다. 처음에는 SCM 뒤에 4-5 명의 유료 인력이 있었지만 나중에 라벨/분기/기능 및 Will의 용어에 대해 원하는 것을 묻는 자동 스크립트에 의해 감소했습니다. CS를 작성하십시오.

여기서 재현성은 DevTask 시스템의 작업과 함께 구성 사양을 저장함으로써 달성되었으므로 각 작업 업스트림은 요구 사항에 매핑되고 구성 사양에 매핑 된 다운 스트림 (코드 파일, 디자인 문서, 테스트 문서) 등)

따라서 여기에서 한 가지 결론은 프로젝트가 충분히 크거나 복잡한 경우에만 (그리고 프로젝트의 삶을 따라 SC 관리자를 감당할 수 있습니다 :) 그렇다면 '상속'행동이 필요하면 생각을 시작할 것입니다. 실제로 다재다능한 도구, 그렇지 않으면 무료이며 이미 SCM의 일관성을 관리하는 AA 도구로 직접 이동합니다. 그러나 SCM 도구에 다른 요인이있을 수 있습니다. .읽어..

일부 부수적 인 경우, 그것은 주제가 아닌 경우에도 불구하고 나와 같은 경우에도 고려해야 할 것 같습니다.

여기서 우리는 UCM이 아닌 "Good-Ol CC"를 사용한다고 추가해야합니다. Vonc에 전적으로 동의합니다 좋은 방법론을 통해보다 일관된 구성에 대한 유연성을 "안내"할 수 있습니다.. 좋은 점은 CC가 매우 유연하고 노력 없이는 (약간의 노력없이) 일관된 일을하는 좋은 방법을 찾을 수 있다는 것입니다. 다른 SCM에서는 무료로 가질 수 있다는 것입니다. 그러나 예를 들어 C/C ++ 프로젝트를 위해 CC와 함께 일한 다른 장소 (및 기타 CC와 함께) Winkin 몇 x 번 컴파일 시간을 줄이는 기능 (파생 객체 재사용). 더 나은 디자인, 더 커플 링 된 코드 및 MakeFiles를 최적화하면 모든 것을 컴파일해야 할 필요성을 줄일 수 있지만 하루에 여러 번 짐승을 컴파일하고 DO SAVE를 공유 해야하는 경우가 있습니다. 시간/돈의 힙. 지금 어디에서 우리는 가능한 한 많은 무료 도구를 사용하려고 노력하고 있으며, 우리는 더 저렴하거나 무료 도구를 찾을 수 있다면 CC를 제거 할 것이라고 생각합니다. Winkin 특징.

바울이 언급 한 내용으로 마무리하겠습니다. 다른 도구가 다른 목적을 위해 다른 도구가 더 좋습니다 그러나 나는 당신이 일관된 프로세스를 가지고 재현성을 무서워하지 않고 도구의 어느 한계에서 벗어날 수 있다고 덧붙일 것입니다. 결국 SCM에서 핵심 요점은 그것은 가치가있다? "문제", 실행중인 SDLC, SCM 프로세스 및 환경에 유용한 추가 기능이있는 경우에 따라 다릅니다.

내 2 센트

이론,따로 여기는 종류의 명백한 실용적이,나의 관점에서 사용 AccuRev 에서 상업 생산 환경에 대한 년의 수:상속 모델을 아주 잘 작동하는 만큼 아동 스트림을 하지 않은 갈라서 너무 많은 조상들은 아직 개발 중입니다.그 때를 상속하는 스트림은 너무 다릅니다.

상속(이후 버전으로 아이들의 이전의 것들)할 수 있는 변경에서 조상의 스트림에서 활약하는 것을 아이 스트림을 사람이 없이 아무것도(하지 않으면 병합은 필요한 경우에는 그것으로 보여줍니다 깊은 겹치는 것을 볼 수 있).

큰 소리,그리고 실제로 그것은 때,모든 스트림에 관여하는 상대적으로 비슷합니다.이용목적이 달성되면 지체 없이 파기 위한 모델 및 핫픽스 수준의 서비스 팩 스트림은 아래 주어진 생산을 놓습니다.(그것은 실제로 보다는 조금 더 복잡해지는 일반적인 아이디어.)

생산 자료가 병렬에서,아무 상속,그 핫픽스 및 서비스 팩 아래 어린이들이......을 시작하는 새로운 해제를 작성하는 것을 의미하는 새로운 자료-스트림 레벨,그리고 수동으로 밀어서 가장 최근의 유지보수 위해 스트림을 사전에 방출합니다.그 후,변경이 이전 버전 적용되는 나중에 사람이 있을 수동으로 밀려 그들 각각의 요구하는 작업이 더 많지만 수 있도록 훨씬 큰 제어합니다.

우리는 원래 사용되는 상속 모델는 모든 자료,어디서 나중에 사람들이 이전의 것들입니다.는 동안,하지만 가고 관리하기 어려운 이 시간입니다.주요한 건축의 차이에 걸쳐 릴리스로 만든 불가피하게 상속받을 변경하는 나쁜 생각이 아니다.예 넣을 수 있습니다,스냅샷을 사이에 상속을 차단하는 것이지만,그 모든 변경 사항을 밀었을 수동으로,그 사이의 유일한 차이는 부모-스냅샷-아이며 평행 금속 스트림 전체 그래픽 스트림 뷰 지속적으로 아래로 밀어내고 오른쪽으로,이는 피타.

하나는 정말 좋은 일에 대한 AccuRev 은 당신이 선택입니다.그것은 고유의 제약 조건의 SCM 프로그램의 건물입니다.

GIT로 Specficip 파일 버전도 체크 아웃 할 수 있다는 것을 알았습니까?

이것 만 사용하십시오 :

git checkout [< tree-ish >] [--] < paths >

config spec와 마찬가지로 기존 버전의 파일 (Paths)을 작업 트리에로드 할 수 있습니다. Git-Checkout Docs의 인용문 :

다음 시퀀스는 마스터 브랜치를 확인하고 Makefile을 두 가지 수정으로 되돌아 삭제합니다. hello.c 실수로, 색인에서 다시 얻습니다.

$ git checkout master             
$ git checkout master~2 Makefile             
$ rm -f hello.c            
$ git checkout hello.c            

멀티 사이트가없는 클리어 케이스는 단일 저장소이지만 GIT가 배포됩니다. 클리어 케이스는 파일 레벨에서 커밋되지만 GIT는 저장소 레벨에서 커밋됩니다. (이 마지막 차이점은 원래의 질문이 여기 다른 게시물에서 지적한 것처럼 오해를 기반으로한다는 것을 의미합니다.)

이것이 우리가 말하는 차이점이라면 '선형'대 'Dag'는 이러한 SCM 시스템을 구별하는 혼란스러운 방법이라고 생각합니다. CLEARCASE에서 파일의 모든 버전은 파일의 버전 "트리"라고하지만 실제로는 지시 된 acyclic 그래프입니다! git의 진정한 차이점은 Clearcase의 DAG가 파일 당 존재한다는 것입니다. 그래서 나는 Clearcase를 Dag와 같은 비게지라고 말하는 것이 오도의 소지가 있다고 생각합니다.

(BTW Clearcase는 파일과 비슷한 방식으로 디렉토리를 버전하지만 또 다른 이야기입니다.)

나는 확실하지 않는 경우에 당신은 아무것도 묻지만,당신은 당신을 보여주는 Accurev 스트림은 서로 다른 도구보다 Git(또는 SVN)가지입니다.(나는 몰라 클리어 케이스.)

예를 들어,Accurev 당신 강제, 당신 말처럼을 사용하여 특정 워크플로우를 제공하는 감사의 역사 변화에서 지원되지 않는 증가하고 있습니다..Accurev 의 상속하게 특정 워크플로를 더 효율적이고 다른 사람은 불가능합니다.

Git 할 수 있습 탐색 코딩에서 분리된 로컬 저장소 또는 기능을 가지는 것이 지원되지 않을 매우 잘해 Accurev.

다른 도구의 좋은 다른 목적으로;그것은 유용한 것을 요청하는 각각의 하나는 좋 .

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