모든 버전 관리 시스템에서는 사용 방법이나 변경 중인 파일에 관한 정보 또는 단순히 특정 변경사항이나 특정 브랜치 검색에 관한 정보가 자주 필요합니다.
이때 가장 좋은 방법이 쿼리를 사용하는 것입니다. 이러한 이유로 Plastic SCM을 만들 때, 체인지 세트, 브랜치, 레이블, 병합, 코드 검토 등과 관련된 특정 정보를 얻을 수 있는 명령인 cm find라는 매우 강력한 쿼리 시스템을 추가했습니다.
find 명령은 GUI에서 뷰를 커스터마이즈할 때도 사용이 가능합니다.
이 자료에서는 cm find 명령으로 처리될 수 있는 몇 가지 시나리오를 예로 다룹니다. 해당 예들은 Plastic SCM 설치 시 수행 가능한 작업의 작은 하위 집합으로서 각 예마다 질문, 단계별 해결책 및 반환되는 정보에 대한 이해를 돕는 예상 출력이 포함되어 있습니다.
참고
단수와 복수를 모두 사용하여 객체를 찾을 수 있습니다. 예를 들어, cm find branch 또는 cm find branches를 모두 사용할 수 있습니다.
참고
모든 cm find 쿼리는 대소문자를 구분합니다.
참고
명령줄에서 비교 연산자(>, <, >=, <=)를 사용하여 쿼리를 실행할 때 셸은 이러한 연산자를 IO 리디렉션으로 간주합니다.
따라서 쿼리를 따옴표로 묶어야 합니다.
Powershell에 대한 참고사항
Powershell 콘솔에서는 기본적으로 "큰" 따옴표를 사용하지 않으므로("작은" 따옴표는 사용) 따옴표 한 쌍을 추가로 삽입해 명령 내에 사용해야 한다는 것을 지정해야 합니다.
cm find replicationlog where branch = "'/semanticmain'" --format="{date}" --nototal | select -Last 1또는 모든 쿼리를 묶을 수 있습니다.
cm find replicationlog "where branch = '/semanticmain'" --format="{date}" --nototal | select -Last 1사용자가 일정 기간 동안 생성한 브랜치를 검색하고, 검색된 브랜치를 특정 속성별로 필터링할 수 있습니다.
사용 가능한 모든 브랜치를 가져오기 시작합니다.
cm find branches 301186 09/01/2013 8:18:51 /main/Fix-4.1/SCM12154 borja codice T 378467 12/02/2013 12:43:24 /main/scm12336 violeta codice T 379892 12/02/2013 17:52:14 /main/scm12336/scm12013 pablo codice T 407817 22/04/2013 16:32:31 /main/scm12636/scm12666 pablo codice T 426648 29/05/2013 17:36:04 /main/scm12313 pablo codice T Total: 5사용자별로 필터링하여 원하는 브랜치를 찾습니다.
cm find branches "where owner='pablo'" 379892 12/02/2013 17:52:14 /main/scm12336/scm12013 pablo codice T 407817 22/04/2013 16:32:31 /main/scm12636/scm12666 pablo codice T 426648 29/05/2013 17:36:04 /main/scm12313 pablo codice T Total: 3사용자를 기준으로 필터링하고 나면 이제 이 스프린트와 관련된 브랜치만 필요로 하므로 특정 날짜 이후에 생성된 브랜치를 찾습니다.
cm find branches "where owner='pablo' and date >= '2013/03/01'" 407817 22/04/2013 16:32:31 /main/scm12636/scm12666 pablo codice T 426648 29/05/2013 17:36:04 /main/scm12313 pablo codice T Total: 2형식이 지정된 출력을 사용할 수 있습니다.
cm find branches "where owner='pablo' and date >= '2013/03/01'" --format="{name,-30} {date}" /main/scm12636/scm12666 22/04/2013 16:32:31 /main/scm12313 29/05/2013 17:36:04 Total: 2마지막으로 특정 속성을 찾습니다. 내부적인 기능 라이프사이클에 따르면 각 브랜치는 주 브랜치에서 이를 통합하기 전에 테스트를 통과해야 합니다.
브랜치가 "테스트"를 통과하면 속성이 "passed"로 설정되므로 속성 이름과 속성 값을 기준으로 필터링합니다.
cm find branches "where owner='pablo' and date >= '2012/01/01' and attribute ='test' and attrvalue = 'passed'" 426648 29/05/2013 17:36:04 /main/scm12313 pablo codice T Total: 1다음 테이블은 현재 cm find branch 명령과 함께 사용할 수 있는 여러 가지 필터링 옵션을 보여 줍니다.
필터링 옵션( where... ) | |||||
---|---|---|---|---|---|
attribute | attrvalue | changesets | comment | date | guid |
id | item | name | owner | parent | repllogid |
replsrcdate | replsrcid | replsrcrepository | replsrcserver |
* 조건 date는 브랜치 뷰의 생성일 열에 해당합니다.
상수를 이용하는 날짜별 필터링 방법을 알아보십시오.
이 테이블은 현재 cm find branch 명령과 함께 사용할 수 있는 여러 가지 출력 옵션을 보여 줍니다.
출력 옵션( --format... ) | |||||
---|---|---|---|---|---|
comment | date | id | name | owner | parent |
체인지 세트에 대한 많은 정보를 찾을 수 있으며, 코멘트도 그러한 검색 대상에 포함됩니다. 간략한 정보의 경우 cm log를 사용하고 직접 필터링(셸 명령 사용)하거나 cm find를 사용하여 해당 작업을 수행할 수 있습니다.
이 샘플에서는 브랜치에 속하는 모든 체인지 세트의 날짜와 코멘트를 가져옵니다.
cm find changeset "where branch = 'main/scm12800'" --format="{date} - {comment}" 27/05/2013 13:25:53 - Updated output. 27/05/2013 13:26:45 - Changed SccPlugin with the new change. 27/05/2013 13:35:15 - Added solution. Total: 3모든 체인지 세트를 볼 수 있으며. 이제 "solution"이라는 단어를 찾고 여기에서 쉽게 확인할 수 있습니다. 단, 체인지 세트의 수가 수백 개나 된다면 느리고 지루한 작업이 될 수 있습니다. 특정 단어로 필터링하는 경우, 코멘트 전체를 찾는 것이 아니므로 정확한 검색을 위해 SQL 구문인 LIKE와 %를 사용합니다.
cm find changeset "where branch = 'main/scm12800' and comment like '%solution%'" --format="{date} - {comment}" 27/05/2013 13:35:15 - Added solution. Total: 1다음 명령을 사용하여 복제 날짜별로 체인지 세트를 쿼리할 수 있습니다. 최신 복제 날짜를 어떻게 얻는지에 대한 내용은 추후에 확인할 수 있습니다.
cm find changeset "where branch='semanticmain' and replsrcdate > '2013/06/17'" --nototal 427425 16794 /semanticmain 07/06/2013 11:06:38 violeta codice IntegrateMiryamtask 12838 427435 16804 /semanticmain 07/06/2013 19:25:31 violeta codice Changeassemblyversion (0.9.28.0). 427436 16805 /semanticmain 07/06/2013 19:54:35 lrodriguez codice Updatemapallreturnparent를 사용하면 특정 체인지 세트나 개정의 부모를 가져올 수 있습니다. 이 체인지 세트 이전에 어떤 작업이 이루어졌는지 알고 싶다면 간단히 다음과 같이 요청하면 됩니다.
cm find changeset "where changesetid = 16583 and returnparent = 'true'" --nototal 423630 16582 /main/scm12800 27/05/2013 13:25:53 roberto codice Updated output.다음 테이블은 현재 cm find changeset 명령과 함께 사용할 수 있는 여러 가지 필터링 옵션을 보여 줍니다.
필터링 옵션( where...) | |||||
---|---|---|---|---|---|
attribute | attrvalue | branch | changesetid | comment | date |
guid | id | owner | parent | repllogid | replsrcdate |
replsrcid | replsrcrepository | replsrcserver | returnparent |
* 조건 changesetid, date 및 owner는 체인지 세트 뷰에서 각각 이름 , 생성일 및 작성자 열에 해당합니다.
상수를 이용하는 날짜별 필터링 방법을 알아보십시오.
이 테이블은 현재 cm find changeset 명령과 함께 사용할 수 있는 여러 가지 출력 옵션을 보여 줍니다.
출력 옵션( --format...) | |||||
---|---|---|---|---|---|
branch | changesetid | comment | date | guid | id |
owner | parent |
브랜치가 있으면 모든 복제 작업을 시작부터 시간순으로 확인할 수 있습니다.
cm find replicationlog "where branch = '/semanticmain'" --nototal 424089 03/06/2013 12:16:42 codice@diana:9095 F pablo 426718 17/06/2013 18:46:38 codice@diana:9095 F pablo 427606 17/06/2013 18:50:47 codice@diana:9095 F pablo마지막 날짜만 확인하고 싶다면 날짜별로 검색을 필터링한 뒤 Powershell 또는 bash를 사용하여 마지막 행을 선택하면 됩니다.
Powershell:
cm find replicationlog "where branch = '/semanticmain'" --format="{date}" --nototal | select -Last 1Bash:
cm find replicationlog "where branch = '/semanticmain'" --format="{date}" --nototal | tail -n 1결과:
17/06/2013 18:50:47다음 테이블은 현재 cm find replicationlog 명령과 함께 사용할 수 있는 여러 가지 필터링 옵션을 보여 줍니다.
필터링 옵션( where...) | |||||
---|---|---|---|---|---|
branch | date | id | owner | package | repositoryname |
server |
상수를 이용하는 날짜별 필터링 방법을 알아보십시오.
이 테이블은 현재 cm find replicationlog 명령과 함께 사용할 수 있는 여러 가지 출력 옵션을 보여 줍니다.
출력 옵션( --format...) | |||||
---|---|---|---|---|---|
date | id | owner | package | server |
다음과 같이 모든 레이블을 가져올 수 있습니다.
cm find label --format="{name} {owner} {branch} {branchid}" --nototal on repository 'codice' BL234 lrodriguez /main 3 BL235 lrodriguez /main 3 BL236 lrodriguez /main/task001 4 BL237 lrodriguez /main 3 BL238 lrodriguez /main/task002 5 BL239 lrodriguez /main 3또한 특정 브랜치에서 생성된 모든 레이블을 가져올 수 있습니다.
cm find label "where branch = '/main'" --format="{name} {owner}" --nototal on repository 'codice' BL234 lrodriguez BL235 lrodriguez BL237 lrodriguez BL239 lrodriguezcodice에서 개발용 주 브랜치와 현재 및 이전 버전을 지원하는 "Fix" 브랜치를 유지하므로 특정 릴리스가 포함된 브랜치를 찾을 수 있습니다.
cm find label "where name = 'BL237' on repository 'codice'" --nototal 191871 17/11/2011 16:38:06 BL237 10503 /main lrodriguez codice위에서 확인할 수 있듯 BL237 레이블은 main 브랜치에 있습니다.
레이블 일자를 가져오고 나중에 해당 브랜치에서 해당 기간에 생성된 체인지 세트를 요청할 수 있습니다. 2개 이상의 레이블에서 정보를 가져오는 작업은 매우 간단합니다.
cm find label "where name = 'BL237' or name='BL235' on repository 'codice'" --nototal 191869 11/11/2011 14:20:02 BL235 1750 /main lrodriguez codice 191871 17/11/2011 16:38:06 BL237 10503 /main lrodriguez codice다음 테이블은 현재 cm find label 명령과 함께 사용할 수 있는 여러 가지 필터링 옵션을 보여 줍니다.
필터링 옵션( where... ) | |||||
---|---|---|---|---|---|
attribute | attrvalue | branch | branchid | changeset | comment |
date | guid | id | name | owner | repllogid |
replsrcdate | replsrcid | replsrcrepository | replsrcserver |
* 조건 date는 레이블 뷰의 생성일 열에 해당합니다.
상수를 이용하는 날짜별 필터링 방법을 알아보십시오.
이 테이블은 현재 cm find label 명령과 함께 사용할 수 있는 여러 가지 출력 옵션을 보여 줍니다.
출력 옵션( --format... ) | |||||
---|---|---|---|---|---|
branch | branchid | changeset | comment | date | id |
name | owner |
브랜치, 체인지 세트, 레이블에 구분 없이 속성을 적용할 수 있습니다. 첫 번째로 필요한 사항은 객체 ID입니다. 브랜치를 쿼리할 때 ID를 지정하여 속성을 가져올 수 있습니다.
cm find branch "where name = 'main'" --format="{id}" --nototal 3속성을 가져온 후에는 다음 명령을 사용하여 속성 목록을 가져올 수 있습니다.
cm find attributes "where srcobj = 3" --nototal objid:3@repid:2@repserver:localhost:8087 -- status --> PASSED이 경우, 속성 이름은 "status"이며, 속성 값은 "Passed"입니다.
Powershell 스크립팅을 사용하여 두 명령을 조합할 수 있습니다.
cm find branch "where name = 'main'" --format="{id}" --nototal |Foreach-Object { cm find attributes where srcobj= $_ --nototal}bash 스크립팅을 사용할 수도 있습니다.
for branch_id in 'cm find branch "where name = 'main'" --format="{id}" --nototal' ;do cm find attributes "where srcobj=$branch_id" --nototal; done출력 결과는 전과 동일합니다.
objid:3@repid:2@repserver:localhost:8087 -- status --> PASSED또한 다음 쿼리를 실행하여 같은 결과를 얻을 수 있습니다.
cm find attributes "where srcobj='br:/main'" --nototal일부 객체에 특정 속성을 설정했다고 가정해 보겠습니다(이번 경우, 테스트 "status"). 객체에 포함된 사항과 관계없이 이러한 속성을 쿼리할 수 있습니다.
cm find attributes "where type = 'status' and value='PASSED' and date > 'this month'" objid:253012@repid:2@repserver:localhost:8087 -- status --> PASSED objid:253013@repid:2@repserver:localhost:8087 -- status --> PASSED objid:253014@repid:2@repserver:localhost:8087 -- status --> PASSED objid:268518@repid:2@repserver:localhost:8087 -- status --> PASSED다음 테이블은 현재 cm find attributes 명령과 함께 사용할 수 있는 여러 가지 필터링 옵션을 보여 줍니다.
필터링 옵션( where... ) | |||||
---|---|---|---|---|---|
comment | date | guid | id | owner | srcobj |
type | value |
* 조건date 및 type은 속성 뷰에서 각각 생성일 및 이름 열에 해당합니다.
상수를 이용하는 날짜별 필터링 방법을 알아보십시오.
이 테이블은 현재 cm find attributes 명령과 함께 사용할 수 있는 여러 가지 출력 옵션을 보여 줍니다.
출력 옵션( --format... ) | |||||
---|---|---|---|---|---|
comment | date | id | owner | type | value |
이제 이전 샘플에서 가져온 특정 체인지 세트에서 변경이 있는 파일에 대해 더 알고자 하는 경우 이러한 목적에는 find revision을 사용할 수 있습니다.
파일 및 폴더 경로만 필요하므로 커스텀 형식을 지정합니다.
cm find revisions "where changeset=16716" --format="{path}" d:\linked_replicated\ d:\linked_replicated\01nerva d:\linked_replicated\01nerva\src d:\linked_replicated\01nerva\src\client d:\linked_replicated\01nerva\src\client\plastic d:\linked_replicated\01nerva\src\client\plastic\libplasticTranslations.es.resx d:\linked_replicated\01nerva\src\client\plastic\libplasticTranslations.resx d:\linked_replicated\01nerva\src\client\plastic\ActionMenuManager.cs Total: 8일부 명령줄의 도움(Linux의 경우 grep, Windows Powershell의 경우 where)을 받아 폴더를 기준으로 필터링할 수도 있습니다.
Powershell:
cm find revisions "where changeset=16716" --format="{path}" --nototal | where {$_ -match "client\\"}Bash:
bcm find revisions "where changeset=15430" --format="{path}" --nototal | grep client\/이 경우 출력 형태는 다음과 같습니다.
d:\linked_replicated\01nerva\src\client\plastic d:\linked_replicated\01nerva\src\client\plastic\libplasticTranslations.es.resx d:\linked_replicated\01nerva\src\client\plastic\libplasticTranslations.resx d:\linked_replicated\01nerva\src\client\plastic\ActionMenuManager.cs모든 체인지 세트에서 검색하여 브랜치의 개정 정보를 가져올 수도 있습니다. 일정 기간에 브랜치에서 변경된 모든 항목을 가져올 수 있습니다.
cm find revisions "where branch = 'main/Fix-4.1/scm12814' and date <= '2013/05/30' and date > '2013/05/28'" --format="{date} - {path}"나중에 해당 정보를 필터링하기 위해 자주 사용하는 셸 툴(이 경우 Powershell)을 사용할 수 있습니다.
cm find revisions "where branch = 'main/Fix-4.1/scm12814' and date <= '2013/05/30' and date > '2013/05/28'" --format="{date} - {path}" | where {$_ -match "view\\"}Bash를 선호하는 경우 명령줄은 다음과 같습니다.
cm find revisions "where branch = 'main/Fix-4.1/scm12814' and date <= '2013/05/30' and date > '2013/05/28'" --format="{date} - {path}" | grep view\/예상되는 출력은 다음과 같습니다.
28/05/2013 12:35:18 - d:\linked_replicated\01nerva\src\client\plastic\view\releasediagram 28/05/2013 12:35:18 - d:\linked_replicated\01nerva\src\client\plastic\view\releasediagram\drawingStyles 28/05/2013 12:35:18 - d:\linked_replicated\01nerva\src\client\plastic\view\releasediagram\drawingStyles\BaseDrawingStyle.cs다음 테이블은 현재 cm find revisions 명령과 함께 사용할 수 있는 여러 가지 필터링 옵션을 보여 줍니다.
필터링 옵션( where... ) | |||||
---|---|---|---|---|---|
archived | attribute | attrvalue | branch | changeset | date |
guid | id | item | itemid | label | marker |
owner | parent | repllogid | replsrcdate | replsrcid | replsrcrepository |
replsrcserver | returnparent | size | type | workspacecheckoutid |
상수를 이용하는 날짜별 필터링 방법을 알아보십시오.
이 테이블은 현재 cm find revisions 명령과 함께 사용할 수 있는 여러 가지 출력 옵션을 보여 줍니다.
출력 옵션( --format... ) | |||||
---|---|---|---|---|---|
branch | changeset | date | id | item | itemid |
owner | parent | size | type |
병합은 어떨까요? 특정 브랜치나 체인지 세트에서 이루어진 병합을 추적할 수 있습니다.
브랜치가 통합된 위치를 알고 싶다면 다음 명령을 입력하면 됩니다.
cm find merge "where srcbranch ='main/Fix-4.1/SCM11769'" br:/main/Fix-4.1/SCM11769@55613 -->br:/main/Fix-4.1/Release-4.1.10.447@55808 Total: 1특정 브랜치에 어떤 브랜치가 통합되었는지 파악하기 위해 사용하는 명령은 다음과 같습니다.
$ cm find merge "where dstbranch ='main/Fix-4.1/Release-4.1.10.447'" br:/main/Fix-4.1/SCM12835@55568 -->br:/main/Fix-4.1/Release-4.1.10.447@55801 br:/main/Fix-4.1/scm11898@55647 -->br:/main/Fix-4.1/Release-4.1.10.447@55802 br:/main/Fix-4.1/scm12839@55678 -->br:/main/Fix-4.1/Release-4.1.10.447@55803 br:/main/Fix-4.1/SCM11769@55613 -->br:/main/Fix-4.1/Release-4.1.10.447@55808 br:/main/Fix-4.1/SCM12860@55735 -->br:/main/Fix-4.1/Release-4.1.10.447@55809 Total: 5이전 명령을 사용하면 형식 플래그를 사용해 브랜치 이름만 반환하여 출력을 커스터마이즈할 수도 있습니다. 그러한 방식으로 사용할 때 두 번째 명령은 예를 들어 다음과 같습니다.
$ cm find merge "where dstbranch ='main/Fix-4.1/Release-4.1.10.447'" --format="{srcbranch}" --nototal br:/main/Fix-4.1/SCM12835 br:/main/Fix-4.1/scm11898 br:/main/Fix-4.1/scm12839 br:/main/scm12419 br:/main/SCM4052 br:/main/Fix-4.1/SCM11769 br:/main/Fix-4.1/SCM12860또는:
cm find merges "where dstbranch='br:/main/ReleaseBL274'" --format="{srcbranch}@{srcchangeset} --> {dstbranch}@{dstchangeset}({type})" --nototal br:/main/scm11148@43953 --> br:/main/ReleaseBL274@44094 (merge) br:/main/scm11181@43969 --> br:/main/ReleaseBL274@44096 (merge) br:/main/Fix-4.0/SCM11101@44010 --> br:/main/ReleaseBL274@44030 (merge) br:/main/scm11135@43980 --> br:/main/ReleaseBL274@44031 (merge) br:/main/ReleaseBL272@43914 --> br:/main/ReleaseBL274@44032 (cherrypick) br:/main/ReleaseBL268@43663 --> br:/main/ReleaseBL274@44033 (cherrypick) br:/main/scm10957@43952 --> br:/main/ReleaseBL274@44093 (merge) br:/main/SCM11195@43981 --> br:/main/ReleaseBL274@44095 (merge) br:/main/SCM10924@43942 --> br:/main/ReleaseBL274@44033 (merge)find merge는 모든 병합 유형(일반 병합, 체리픽된 병합, 차감식 병합)을 반환합니다.
따라서 일정한 간격으로 지정된 브랜치에 병합할 수 있습니다.
cm find merges "where dstbranch='br:/main/Fix-4.1/ReleaseBL285' and type='intervalcherrypick'" --format="({basebranch}@{basechangeset}, {srcbranch}@{srcchangeset}] --> {dstbranch}@{dstchangeset}" --nototal (br:/main@44448, br:/main/scm11318@44461] --> br:/main/Fix-4.1/ReleaseBL285@44463두 개의 쿼리(브랜치 찾기, 병합 찾기)와 일부 Powershell 해킹을 활용하여 답변을 드릴 수 있습니다. 이 코드를 PS1 파일에 넣고 Powershell 콘솔에서 실행합니다.
$allBranches = cm find branches "where date >= '2013/06/20'" --format="{name}" --nototal; $allMerged = cm find merge "where date >= '2013/06/20'" --format="{srcbranch}" --nototal; for($i = 0; $i -le $allBranches.length -1; $i++) {$allBranches[$i] = 'br:' + $allBranches[$i]} $allBranches| ?{$allMerged -notcontains $_}다음은 샘플 출력입니다.
br:/main/scm12619 br:/main/Fix-4.1/scm12916 br:/main/Fix-4.1/scm12899/scm12947 br:/main/Fix-4.1/scm11180 br:/main/Fix-4.1/scm8782 br:/main/Fix-4.1/scm12944 br:/semanticmain/SCM12759/scm12948이 코드로 다음 작업을 수행합니다.
bash 셸에는 다음과 같은 동등한 코드가 있습니다.
$ allBranches='cm find branches "where date >= '2013/06/20'" --format="{name}" --nototal' $ allMerged='cm find merge "where date >= '2013/06/20'" --format="{srcbranch}" --nototal' $ for branch in $allBranches; do [ ! 'echo $allMerged | grep 'br:$branch'' ] && print "br:$branch"; done이 코드는 다음을 수행합니다.
다음 시나리오를 살펴보겠습니다.
우리가 찾는 브랜치는 다른 브랜치에 통합되었으나(따라서 같은 브랜치로의 병합은 삭제해야 함) 통합 대기 중인 체인지 세트(그림의 주황색 체인지 세트)가 있는 브랜치입니다. 단일 쿼리를 사용한 뒤 일부 Powershell 코드로 후처리를 하면 완전히 통합되지 않는 브랜치를 알 수 있습니다.
$allMergedNonFiltered = cm find merge "where date >= '2013/06/01'" --format="{srcbranch} {dstbranch} {srcchangeset}" --nototal; $allMerged = $allMergedNonFiltered | ForEach-Object {$res = $_.Split(" "); if($res[0] -ne $res[1]) {$res[0] + " " + $res[2]} }; $semiMerged = $allMerged | ForEach-Object {$_.Split(" ")[0] }; $allBranches = cm find branches where "date >= '2013/06/01'" --format="{name} {changeset}" --nototal; for($i = 0; $i -le $allBranches.length -1; $i++) {$allBranches[$i] = 'br:' + $allBranches[$i]} $allBranches| ?{$allMerged -notcontains $_ -and $semiMerged -contains $_.Split(" ")[0]}다음은 샘플 출력입니다.
br:/main/Fix-4.1/scm12861 56049 br:/main/Fix-4.1/SCM12817 56300 br:/main/Fix-4.1/scm12899 56270이 코드로 다음 작업을 수행합니다.
bash를 사용하는 경우 다음과 같이 다른 방법을 사용할 수 있습니다.
$ cm find merge "where date >= '2013/06/01'" --format="{srcbranch}#{dstbranch}#{srcchangeset}" --nototal |awk -F "#" '{if($1 != $2) print $1 "#" $3}' | tee allMerges | cut -d'#' -f1 | sort -u > mergedBranches $ for branch in 'cm find branches where "date >= '2013/06/01'" --format="br:{name}#{changeset}" --nototal;'; do [ ! "'grep $branch allMerges'" ] && [ "'echo $branch | grep -f mergedBranches'" ] && echo $branch; done $ rm allMerges mergedBranches수행할 작업은 다음과 같습니다.
다음 시나리오를 살펴보겠습니다.
버전 1.0으로 직접적으로 또는 간접적으로 통합된 브랜치를 알고자 합니다. 이전과 마찬가지로 데이터를 필터링하려면 서버에 대한 단일 쿼리와 powershell 기능이 필요합니다. 이번 특정 샘플에서는 /main에서 통합된 모든 브랜치를 가져오려고 합니다.
function ListAll($list, $visited, $targetBranch, $depth) { $visited += $targetBranch; $list | ForEach-Object { $res = $_.Split(" "); if(($res[1] -eq $targetBranch) -and ($visited -notcontains $res[0])) { Write-Host $depth $res[0]; $visited += $res[0]; $temp_visited = ListAll $list $visited $res[0] ($depth + "-"); $temp_visited | ForEach-Object{ if($visited -notcontains $_) { $visited += $_; } } } } return $visited; } $targetBranch = "br:/main"; $allMergedNonFiltered = cm find merge "where date >= '2013/01/01'" --format="{srcbranch} {dstbranch}" --nototal; $allMerged = $allMergedNonFiltered | ForEach-Object {$res =$_.Split(" "); if($res[0] -ne $res[1]) {$res[0] + " " + $res[1]} } $visited = @(); $targetBranch ListAll $allMerged $visited $targetBranch "-" | Out-Null;샘플 출력은 다음과 같으며 브랜치 12299가 릴리스 4.3.39.406에 간접적으로 통합되었음을 알 수 있습니다.
br:/main br:/main/Release-4.2.29.406 br:/main/SCM12356 br:/main/scm12238 br:/main/Release-4.2.28.387/SCM12169/scm12230 br:/main/SCM12243/scm12280/scm12277/scm12293 br:/main/scm12238/scm12299스크립트에 대한 간략한 설명입니다.
Bash에서는 다음 스크립트를 사용하여 동일한 작업을 수행할 수 있습니다.
cm find merge "where date >= '2013/01/01'" --format="{srcbranch}#{dstbranch}" --nototal | awk -F "#" '{if($1 != $2) print $1 "#" $2}' > list touch old_targets touch next_targets echo "br:/main" | tee targets depth=">" while [ -s targets ]; do for merge in 'grep -f targets list'; do src_branch=${merge%#*} was_already_target="'grep ${src_branch} old_targets 2>/dev/null'" already_on_next_targets="'grep ${src_branch} next_targets 2>/dev/null'" if [ ! "$was_already_target" ] && [ ! "$already_on_next_targets" ]; then echo ${src_branch} >> next_targets echo ${depth}${src_branch} fi done depth="-${depth}" cat targets >> old_targets [ -s next_targets ] && mv next_targets targets || rm -f targets done rm -f list old_targets이 스크립트에 대한 간략한 설명은 다음과 같습니다.
다음 테이블은 현재 cm find merge 명령과 함께 사용할 수 있는 여러 가지 필터링 옵션을 보여 줍니다.
필터링 옵션( where... ) | |||||
---|---|---|---|---|---|
date | dstbranch | dstchangeset | guid | id | owner |
srcbranch | srcchangeset | type |
상수를 이용하는 날짜별 필터링 방법을 알아보십시오.
이 테이블은 현재 cm find merge 명령과 함께 사용할 수 있는 여러 가지 출력 옵션을 보여 줍니다.
출력 옵션( --format... ) | |||||
---|---|---|---|---|---|
date | dstbranch | dstchangeset | id | owner | srcbranch |
srcchangeset | type |
통합 코드 검토 기능을 사용하면 검토 상태에 대한 정보를 얻을 수 있습니다. 이 샘플에서는 내 검토(문자 그대로 '나'에게 할당된 검토로, 이때 '나'는 현재 사용자)의 수신이 시작되었습니다. 앞에서와 마찬가지로 사용자 이름도 넣을 수 있습니다.
cm find reviews "where assignee = 'me'" 399982 08/03/2013 10:43:30 danipen Status1 pablo "scm12563" Branch id:399570 419067 20/05/2013 9:59:49 asalim Status0 pablo "scm12411" Branch id:416824 8424078 29/05/2013 14:50:35 borja Status1 pablo "Review scm12816" Branch id:424073 425830 05/06/2013 17:04:37 jesusmg Status0 pablo "Review scm11179" Branch id:413120 426717 14/06/2013 14:01:14 roberto Status1 pablo "Code review 1" Branch id:426648 Total: 5나중에 특정 상태의 검토(1 = 승인됨)로 결과의 범위를 지정할 수 있습니다.
cm find reviews "where assignee = 'me' and status = 1" 399982 08/03/2013 10:43:30 danipen Status1 pablo "scm12563" Branch id:399570 8424078 29/05/2013 14:50:35 borja Status1 pablo "Review scm12816" Branch id:424073 426717 14/06/2013 14:01:14 roberto Status1 pablo "Code review 1" Branch id:426648 Total: 3마지막으로, 특정 기간 내에 검토를 완료합니다.
cm find "review where assignee = 'me' and date > '2013/05/01' and date < '2013/06/29'" 419067 20/05/2013 9:59:49 asalim Status0 pablo "scm12411" Branch id:416824 8424078 29/05/2013 14:50:35 borja Status1 pablo "Review scm12816" Branch id:424073 425830 05/06/2013 17:04:37 jesusmg Status0 pablo "Review scm11179" Branch id:413120 426717 14/06/2013 14:01:14 roberto Status1 pablo "Code review 1" Branch id:426648 Total: 4해당 특정 기간 및 조건을 가진 검토들과 비교하고자 합니다.
cm find "review where assignee = 'me' and date > '2013/06/14' and date < '2013/06/15' and status = 1" 8424078 29/05/2013 14:50:35 borja Status1 pablo "Review scm12816" Branch id:424073 426717 14/06/2013 14:01:14 roberto Status1 pablo "Code review 1" Branch id: 426648 Total: 2이 두 개의 쿼리를 사용하면 스프린트에 대해 전체 검토 중 승인된 검토의 비율을 얻을 수 있습니다.
다음 테이블은 현재 cm find review 명령과 함께 사용할 수 있는 여러 가지 필터링 옵션을 보여 줍니다.
필터링 옵션( where... ) | |||||
---|---|---|---|---|---|
assignee | comment | date | guid | id | owner |
status | targetid |
* 조건date 및 targetid는 코드 검토 뷰에서 각각 생성일 및 검토된 오브젝트 열에 해당합니다.
상수를 이용하는 날짜별 필터링 방법을 알아보십시오.
이 테이블은 현재 cm find review 명령과 함께 사용할 수 있는 여러 가지 출력 옵션을 보여 줍니다.
출력 옵션( --format... ) | |||||
---|---|---|---|---|---|
assignee | date | id | owner | status | target |
targettype | title |
작년에 팀원이 생성한 임시 저장을 찾을 수 있습니다.
cm find shelve "where owner != 'me' and date >= '1 years ago'" 3848 2 04/10/2018 5:58:22 PM pablo doom3code Shelve - temporary compilation.txt file 3860 3 06/23/2018 11:08:06 PM pablo doom3code Shelve - test with a new configuration Total: 2다음 테이블은 현재 cm find shelve 명령과 함께 사용할 수 있는 여러 가지 필터링 옵션을 제시합니다.
필터링 옵션( where...) | |||||
---|---|---|---|---|---|
owner | date | attribute | attrvalue | comment | guid |
parent | shelveid | id |
상수를 이용하는 날짜별 필터링 방법을 알아보십시오.
이 테이블은 현재 cm find shelve 명령과 함께 사용할 수 있는 여러 가지 출력 옵션을 보여 줍니다.
출력 옵션( --format...) | |||||
---|---|---|---|---|---|
id | shelveid | date | owner | repository | comment |
이 자료에서 지금까지는 출력을 커스터마이즈하는 방법을 살펴봤습니다. 그런데 추후 분석을 위해 출력을 XML로 설정하여 파일로 저장하는 방법도 있습니다. 이를 위해 다음 명령을 실행합니다.
cm find revisions "where changeset=16716" --xml --file=output.xml다음 XML 콘텐츠를 생성합니다.
<?xml version="1.0" encoding="utf-8" ?> <PLASTICQUERY> <REVISION> <ID>426098</ID> <COMMENT></COMMENT> <DATE>07/06/2013 16:00:09</DATE> <OWNER>roberto</OWNER> <TYPE>dir</TYPE> <SIZE>0</SIZE> <CHANGESET>16716</CHANGESET> <PARENT>426069</PARENT> <ITEM>d:\linked_replicated\</ITEM> <ITEMID>2</ITEMID> <BRANCH>br:/main/Fix-4.1/scm12863</BRANCH> <PATH>d:\linked_replicated\</PATH> <REPOSITORY>codice</REPOSITORY> <REPNAME>codice</REPNAME> <REPSERVER>localhost:8087</REPSERVER> <HASH>kWJO1fm+7RCiZZcgSjM4/Q==</HASH> </REVISION> <REVISION> <ID>426092</ID> <COMMENT></COMMENT> <DATE>07/06/2013 16:00:09</DATE> <OWNER>roberto</OWNER> <TYPE>txt</TYPE> <SIZE>78238</SIZE> <CHANGESET>16716</CHANGESET> <PARENT>426056</PARENT> <ITEM>d:\linked_replicated\01nerva\src\client\plastic\ActionMenuManager.cs</ITEM> <ITEMID>37736</ITEMID> <BRANCH>br:/main/Fix-4.1/scm12863</BRANCH> <PATH>d:\linked_replicated\01nerva\src\client\plastic\ActionMenuManager.cs</PATH> <REPOSITORY>codice</REPOSITORY> <REPNAME>codice</REPNAME> <REPSERVER>localhost:8087</REPSERVER> <HASH>FXmLNV7B9Et1wTGqULWpgQ==</HASH> </REVISION> </PLASTICQUERY>
이 콘텐츠는 나중에 Excel과 같은 툴로 임포트하여 간단하고 편리하게 통계를 얻을 수 있습니다.
리포지토리에 있는 모든 체인지 세트의 정보를 확인한다고 가정할 때 다음과 같은 명령을 실행할 수 있습니다.
cm find changeset --xml --file=output.xml그런 다음 Excel에 출력을 로드할 수 있습니다. 결과는 다음과 같습니다.
Excel에는 더 많은 통계를 제공하는 PivotTable이라고 하는 매우 유용한 유틸리티가 포함되어 있습니다.
Exel의 필터 및 정렬 기능을 사용하여 체인지 세트 사용자를 그룹화하고 해당 통계를 그래프로 변환할 수 있습니다.
또한 브랜치별로 그룹화가 가능합니다. 브랜치별로 그룹화할 경우 각 브랜치별로 기여한 사용자 수와 각 사용자가 생성한 체인지 세트의 개수를 확인할 수 있습니다.
find 명령에는 각 객체에 대한 기본 출력이 포함되지만 앞서 살펴본 바와 같이 커스텀 출력 옵션을 정의하고, --xml 속성의 XML 형식을 사용하여 결과를 검색하고, 추후 분석을 위해 --file 속성의 파일에 결과를 저장할 수 있습니다.
일반 구문은 다음과 같습니다.
cm find object "[where conditions] [on repositories]" [options]이 경우:
해당 리포지토리에 대한 쿼리 권한만 있으면 이 작업이 가능합니다.
리포지토리뿐만 아니라 서버가 여러 개일 때에도 한꺼번에 쿼리할 수 있습니다. 예:
cm find "changesets where date >= '2017/11/17' on repositories 'documentation/plasticdocu@localhost:8087','codice@codice@cloud'" --nototal 68621 1451 /main/scm21135 11/20/2017 3:32:31 PM maria documentation/plasticdocu Added documentation about the EOL conversion mechanism. 4821759 132324 /main/SCM21120 11/20/2017 1:41:45 PM pablo codice Added missing config file 4821840 132326 /main/scm21149/scm21150 11/20/2017 1:54:35 PM vsanchezm@codicesoftware.com codice Fix HAL FAILED - Conflicts and user intervention required. Rebase from main. 4821941 132333 /main 11/20/2017 2:38:28 PM hal codice HAL: merged /main/scm21076/scm21084/scm21093 : GTK Gluon: add pending changes view날짜로 필터링할 때 시스템의 현지화 설정을 준수하는 날짜 형식을 사용할 수 있습니다. 사용하는 컴퓨터의 날짜 표시 방식이 'MM-dd-yyyy' 형식이라면, 쿼리 시 '12-31-2019'와 같은 형식의 날짜를 사용할 수 있습니다.
다음 상수를 사용하여 쿼리를 간소화할 수도 있습니다.
'today'
: 오늘 날짜yesterday'
: 어제 날짜this week'
: 금주 월요일 날짜this month'
: 이번 달 1일this year'
: 이번 연도 1월 1일one day ago'
: 현재 날짜의 하루 전one week ago'
: 현재 날짜의 7일 전one month ago'
: 현재 날짜의 1개월 전n days ago'
: 현재 날짜의 'n'일 전n months ago'
: 현재 날짜의 'n'개월 전n years ago'
: 현재 날짜의 'n'년 전다음 where 절은 date 필드 유형에서 유효합니다.