2012-02-22 2 views
25

나는 많은 기술 수준을 가진 여러 사람들이 쓴 프로그램을 만들고 있습니다. 그곳에는 결코 변하지 않은 파일들이 있고 (아마도 우리는 그들을 만지기를 두려워 할 것입니다) 그리고 끊임없이 변화하는 다른 것들이 있습니다.코드 변경 빈도를 감지하는 방법은 무엇입니까?

전체 repo 기록 (git)을 살펴보고 주어진 파일이 얼마나 자주 변경되는지 분석하는 도구가 있습니까? 아니면 패키지? 또는 프로젝트?

예를 들어 우리는 25 %의 시간을 "효과가있는"코드와 비교할 때 표시 또는 코드의 취약성이 될 수있는 패키지 세트로 작업하는 데 소비했다는 것을 인식하는 것이 중요합니다.

답변

5

나는이 정보를 성공적으로 시각화하는 데 사용했습니다.

https://github.com/bcarlso/defect-density-heatmap

프로젝트를 살펴보고 당신은 출력이 추가 정보의 모습을 볼 수 있습니다.

각 커밋에서 변경된 파일 목록을 Git에서 가져 와서 필요한 것을 할 수 있습니다.

~ $ git log --pretty="format:" --name-only | grep -v ^$ > file-changes.txt 

~ $ for i in `cat file-changes.txt | cut -d"." -f1,2 | uniq`; do num=`cat file-changes.txt | grep $i | wc -l`; if (($num > 1)); then echo $num,0,$i; fi; done | heatmap > results.html 

이렇게하면 더 많은 정보를 표시하는 파일이있는 태그 클라우드가 제공됩니다. 이전의 대답에

+2

두 번째 비트는 실제로 확장되지 않습니다. 'sort file-changes.txt | uniq -c | sed -e '/^* //'-e 's//, 0, /'> heatmap.in' 또는 그 효과가 더 빨라야합니다. – cdegroot

11

OS 솔루션을 찾으려면 아마도 gitstats으로 시작하는 것을 고려해보고 파일 로그를 가져 와서 해당 데이터를 집계하여 확장하는 것이 좋습니다.

+1

특히 나는 gitstats의'merge_authors' 기능 덕분에 다른 사람의 이름으로 같은 사람이 커밋 된 것을 정리할 수있게되었습니다. cf https://gitorious.org/gitstats/mainline/commit/005fe0bbcab967367e4932d11b161f9f0f71cf7f –

4

나는 당신에게 (이름 변경 포함) 역사에서 파일에 일어난 모든 변화를 줄 것이다

git log --follow -p file 

과 같은 명령을 사용하는 것이 좋습니다. 당신은 당신이 UNIX 기반 OS에서 할 수있는 파일을 변경 커밋의 수를 얻고 싶다면 :

git log --follow --format=oneline Gemfile | wc -l 

그런 다음 옆 이름으로 여러 개의 파일이 적용하는 bash는 스크립트를 만들 수 있습니다.

희망이있었습니다.

+0

너무 우아하지 않지만 간단하고 효과적인 해결책 (1+). – AoeAoe

+0

정말 좋네요. 감사! – Ashitaka

8

나는 NChurn 살펴이있을 것이다 :

NChurn는 저장소에 엉덩이를 파일의 이탈 레벨을하는 데 도움이되는 유틸리티입니다. 변동은 어떤 파일이 변경되었는지 감지하는 데 도움이됩니다. 평생 동안. 이렇게하면 잠재적 인 버그 하이브를 식별하는 데 도움이되며 부적절한 디자인이 가능합니다. 가장 좋은 방법은 빌드 Nchurn을 프로세스에 연결하고 각 실행 기록을 저장하는 것입니다. 그런 다음 저장소의 이탈 문제를 플로팅 할 수 있습니다.

+0

+1; 이것을 gitstats에 통합하여보기 좋게. –

+0

NChurn은 잘 작동하며 빠르게 실행됩니다. 레포에서 날짜 범위에 대한 파일 당 체크 인 수를 계산합니다. (사소한 NPE 수정이 필요하거나 "제외"목록을 포함해야합니다). –

2

건물 나는 당신이 file_churn로 스크립트를 호출하면 모든 프로젝트 파일

#!/bin/sh 
cd $1 
find . -path ./.git -prune -o -name "*" -exec sh -c 'git log --follow --format=oneline $1 | wc -l | awk "{ print \$1,\"\\t\",\"$1\" }" ' {} {} \; | sort -nr 
cd .. 

을 분석하기 위해 다음 스크립트를 제안한다.당신은 당신의 자식 프로젝트 디렉토리를 호출 할 수 있습니다.

> ./file_churn.sh project_dir 

희망이 도움이 되길 바랍니다.

관련 문제