예시별 cm find
"cm find"
모든 버전 관리 시스템에서는 사용 방법이나 변경 중인 파일에 관한 정보 또는 단순히 특정 변경사항이나 특정 브랜치 검색에 관한 정보가 자주 필요합니다.
이때 가장 좋은 방법이 쿼리를 사용하는 것입니다. 이러한 이유로 Plastic SCM을 만들 때, 체인지 세트, 브랜치, 레이블, 병합, 코드 검토 등과 관련된 특정 정보를 얻을 수 있는 명령인 cm find라는 매우 강력한 쿼리 시스템을 추가했습니다.
find 명령은 GUI에서 뷰를 커스터마이즈할 때도 사용이 가능합니다.
이 자료에서는 cm find 명령으로 처리될 수 있는 몇 가지 시나리오를 예로 다룹니다. 해당 예들은 Plastic SCM 설치 시 수행 가능한 작업의 작은 하위 집합으로서 각 예마다 질문, 단계별 해결책 및 반환되는 정보에 대한 이해를 돕는 예상 출력이 포함되어 있습니다.
참고
단수와 복수를 모두 사용하여 객체를 찾을 수 있습니다. 예를 들어, cm find branch 또는 cm find branches를 모두 사용할 수 있습니다.
참고
모든 cm find 쿼리는 대소문자를 구분합니다.
참고
명령줄에서 비교 연산자(>, <, >=, <=)를 사용하여 쿼리를 실행할 때 셸은 이러한 연산자를 IO 리디렉션으로 간주합니다.
따라서 쿼리를 따옴표로 묶어야 합니다.
cm find branches "where owner='pablo' and changesets >= '2013/03/01'"
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 |
상수를 이용하는 날짜별 필터링 방법을 알아보십시오.
이 테이블은 현재 cm find branch 명령과 함께 사용할 수 있는 여러 가지 출력 옵션을 보여 줍니다.
출력 옵션( --format... ) |
comment |
date |
id |
name |
owner |
parent |
체인지 세트
체인지 세트의 코멘트 표시
체크인에 대해 작성한 코멘트를 찾을 수 있나요? 이 브랜치 내 어딘가에 있는 것은 확실하고, "solution"과 관련이 있는 코멘트입니다.
체인지 세트에 대한 많은 정보를 찾을 수 있으며, 코멘트도 그러한 검색 대상에 포함됩니다. 간략한 정보의 경우 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 Updatemapall
"returnparent" 필드
returnparent 필드는 무엇입니까?
returnparent를 사용하면 특정 체인지 세트나 개정의 부모를 가져올 수 있습니다. 이 체인지 세트 이전에 어떤 작업이 이루어졌는지 알고 싶다면 간단히 다음과 같이 요청하면 됩니다.
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 |
상수를 이용하는 날짜별 필터링 방법을 알아보십시오.
이 테이블은 현재 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 1
Bash:
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 lrodriguez
특정 레이블이 있는 브랜치 찾기
특정 레이블이 있는 브랜치를 찾을 수 있나요?
codice에서 개발용 주 브랜치와 현재 및 이전 버전을 지원하는 "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개의 레이블 사이에서 체인지 세트 찾기
2개의 레이블 사이에서 생성된 체인지 세트를 찾을 수 있나요?
레이블 일자를 가져오고 나중에 해당 브랜치에서 해당 기간에 생성된 체인지 세트를 요청할 수 있습니다. 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 |
상수를 이용하는 날짜별 필터링 방법을 알아보십시오.
이 테이블은 현재 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
특정 속성이 있는 객체 가져오기
지난 달에 foo 속성과 bar 값이 적용된 모든 객체를 가져올 수 있나요?
일부 객체에 특정 속성을 설정했다고 가정해 보겠습니다(이번 경우, 테스트 "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 |
상수를 이용하는 날짜별 필터링 방법을 알아보십시오.
이 테이블은 현재 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
브랜치 내에서 변경된 폴더
특정 시간이 경과한 후 브랜치의 foo 폴더가 변경되었는지 알 수 있나요?
모든 체인지 세트에서 검색하여 브랜치의 개정 정보를 가져올 수도 있습니다. 일정 기간에 브랜치에서 변경된 모든 항목을 가져올 수 있습니다.
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
특정 릴리스에서 통합된 브랜치
4.1.10.447 릴리스에서 통합된 브랜치를 찾을 수 있나요?
특정 브랜치에 어떤 브랜치가 통합되었는지 파악하기 위해 사용하는 명령은 다음과 같습니다.
$ 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
이 코드로 다음 작업을 수행합니다.
- 이 스프린트에서 모든 브랜치를 찾습니다.
- 이 스프린트에서 모든 병합을 찾아 소스 브랜치만 반환합니다.
- $allbranches 출력의 형식을 변경하여 두 목록의 형식이 일치하도록 합니다.
- "병합" 목록에 allBranches 목록의 브랜치가 포함되어 있는지 확인합니다. 포함되어 있지 않다면 브랜치가 통합되지 않은 것입니다.
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
이 코드로 다음 작업을 수행합니다.
- 모든 병합과 특정 날짜 이후에 완료된 소스 체인지 세트를 가져옵니다.
- 원본과 대상이 같은 병합을 필터링합니다.
- 이미 병합된 목록을 삭제하기 위해 해당 병합만 포함된 목록을 가져옵니다.
- find branches 출력의 형식을 find merge 형식과 일치하도록 변경합니다.
- 해당 간격으로 병합이 완료되었으나 병합 대기 중인 체인지 세트가 있는 브랜치를 비교 및 필터링합니다.
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
스크립트에 대한 간략한 설명입니다.
- 이전과 마찬가지로 목록을 가져오고 중복을 제거합니다.
- 대상 브랜치, 빈 방문 목록 및 깊이를 표시하는 데 도움이 되는 마커와 함께 ListAll 함수를 호출합니다. 코드에 이 값을 사용하지 않으므로 이 함수의 출력은 null로 파이핑되며, 사용하는 경우에는 값이 표시됩니다.
- ListAll 함수 내부에서 대상 창과의 대상 일치 판정을 수행하는 병합을 찾으려고 합니다.
- 일치하는 경우 항목을 visited 목록에 추가하고 병합 소스를 사용할 때 ListAll을 반복적으로 호출합니다.
- 재귀 함수가 반환하고 나면 함수의 반환 값에 따라 방문 목록을 업데이트합니다.
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
이 스크립트에 대한 간략한 설명은 다음과 같습니다.
- 병합 목록을 가져와 중복 항목을 제거하고 목록을 파일에 저장합니다.
- 두 보조 파일을 준비합니다.
- old_targets: 찾은 모든 대상 브랜치를 저장합니다.
- 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
참고: 이전 장에서처럼 모든 명령의 끝에 보이는 Total 값은 --nototal 옵션을 사용하여 삭제할 수 있습니다.
이 두 개의 쿼리를 사용하면 스프린트에 대해 전체 검토 중 승인된 검토의 비율을 얻을 수 있습니다.
앞선 예에서는 날짜를 특정 값으로 설정했지만 "어제" 또는 "3개월 전"도 사용할 수 있습니다. 현재 날짜와 관련된 기간을 확인할 때 매우 유용한 기능입니다.
cm find "review where assignee = 'me' and date >= '4 days ago' and status = 1"
8424078 29/05/2013 14:50:35 borja Status1 pablo "Review scm12816" Branch id:424073
Total: 1
필터링 및 출력 옵션
다음 테이블은 현재 cm find review 명령과 함께 사용할 수 있는 여러 가지 필터링 옵션을 보여 줍니다.
필터링 옵션( where... ) |
assignee |
comment |
date |
guid |
id |
owner |
status |
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]
이 경우:
날짜 상수
날짜로 필터링할 때 시스템의 현지화 설정을 준수하는 날짜 형식을 사용할 수 있습니다. 사용하는 컴퓨터의 날짜 표시 방식이 '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 필드 유형에서 유효합니다.
- (...) where date > 'today' (...)
- (...) where date < 'yesterday' (...)
- (...) where date > 'this week' (...)
- (...) where date > 'this month' (...)
- (...) where date < 'one day ago' and date > '3 days ago' (...)
- (...) where date < 'one week ago' and date > '3 weeks ago' (...)
- (...) where date < 'one month ago' and date > '3 months ago' (...)
- (...) where date > '1 year ago' (...)
최근 업데이트
2019년 12월 10일
누락된 큰따옴표를 추가해 일부 cm find의 예를 수정했습니다.
2018년 12월 7일
몇 가지 새로운 예시를 추가했습니다.
임시 저장을 찾는 방법을 알아보십시오.
날짜별로 필터링할 때 날짜 상수를 사용할 수 있습니다.
2017년 11월 20일
on repositories 인수를 사용하여 하나 이상의 리포지토리에서 쿼리하는 방법을 알아보십시오.
2014년 7월 1일
게시일