[git] Git-메서드 / 함수의 변경 내역을 보려면 어떻게해야합니까?
그래서 파일의 변경 내역을 보는 방법에 대한 질문을 찾았지만이 특정 파일의 변경 내역은 엄청나고 특정 방법의 변경에만 관심이 있습니다. 특정 방법에 대한 변경 내역을 볼 수 있습니까?
나는 이것이 코드를 분석하기 위해 git이 필요하고 분석이 다른 언어에 따라 다를 것이라는 것을 알고 있지만 메소드 / 함수 선언은 대부분의 언어에서 매우 비슷해 보이므로 누군가이 기능을 구현했다고 생각했습니다.
현재 작업중인 언어는 Objective-C이고 현재 사용중인 SCM은 git이지만이 기능이 SCM / 언어에 대해 존재하는지 알고 싶습니다.
답변
최근 버전의 git log
학습 된 특수한 형태의 -L
매개 변수 :
-L : <기능 이름> : <파일>
에서 제공하는 줄 범위
"<start>,<end>"
(또는 함수 이름 regex<funcname>
) 의 진화를 추적합니다<file>
. pathspec 제한자를 제공 할 수 없습니다. 이것은 현재 단일 개정에서 시작하는 걷기로 제한됩니다. 즉, 긍정적 인 개정 인수를 0 개 또는 1 개만 제공 할 수 있습니다. 이 옵션을 두 번 이상 지정할 수 있습니다.
…
만일이“:<funcname>”
대신에 부여<start>
하고<end>
는, 제 funcname에 줄의 범위를 나타내고, 일반 식된다 일치<funcname>
최대 funcname에 다음 라인.“:<funcname>”
이전-L
범위 의 끝 (있는 경우)에서 검색하고 그렇지 않은 경우 파일 시작부터 검색합니다.“^:<funcname>”
파일의 시작부터 검색합니다.
즉 git log -L :myfunction:path/to/myfile.c
, Git에게을 요청 하면 이제 해당 함수의 변경 내역을 기꺼이 인쇄합니다.
답변
사용은 git gui blame
스크립트의 사용을 위해 열심히하고, 동안 git log -G
과 git log --pickaxe
방법 정의가 나타나거나 내가 그들에 대한 모든 변경 목록을 만들 수있는 방법을 발견하지 않은, 사라 때마다 당신을 보여줄 수있는 신체 당신의 방법을.
그러나 gitattributes
및 textconv
속성을 사용 하여이를 수행 하는 솔루션을 결합 할 수 있습니다 . 이러한 기능은 원래 바이너리 파일 작업을 돕기위한 것이지만 여기에서도 잘 작동합니다.
핵심은 Git이 diff 작업을 수행하기 전에 관심있는 행을 제외한 모든 행을 파일에서 제거하도록하는 것입니다. 그러면 git log
, git diff
등이 관심있는 영역 만 표시합니다.
다음은 제가 다른 언어로하는 일에 대한 개요입니다. 자신의 필요에 맞게 조정할 수 있습니다.
-
하나의 인수 (소스 파일 이름)를 취하고 해당 파일의 흥미로운 부분 만 출력하는 짧은 쉘 스크립트 (또는 다른 프로그램)를 작성하십시오 (또는 흥미로운 부분이 없으면 아무것도 출력하지 않음). 예를 들어
sed
다음과 같이 사용할 수 있습니다 .#!/bin/sh sed -n -e '/^int my_func(/,/^}/ p' "$1"
-
textconv
새 스크립트에 대한 Git 필터를 정의하십시오 . (자세한 내용은gitattributes
man 페이지를 참조하십시오.) 필터 이름과 명령 위치는 원하는대로 지정할 수 있습니다.$ git config diff.my_filter.textconv /path/to/my_script
-
문제의 파일에 대한 diff를 계산하기 전에 해당 필터를 사용하도록 Git에 지시하십시오.
$ echo "my_file diff=my_filter" >> .gitattributes
-
이제
-G.
(참고.
)를 사용 하여 필터를 적용했을 때 눈에 띄는 변경 사항을 생성하는 모든 커밋을 나열하면 관심있는 커밋이 정확히 표시됩니다., 같은 Git의 diff 루틴을 사용하는 다른 옵션은 다음과 같습니다--patch
. 이 제한된보기도 얻을 수 있습니다.$ git log -G. --patch my_file
-
Voilà!
유용한 개선 사항 중 하나는 필터 스크립트가 메서드 이름을 첫 번째 인수로 사용하고 파일을 두 번째 인수로 사용하도록하는 것입니다. 이렇게하면 git config
스크립트를 편집 할 필요 없이을 호출하여 관심있는 새 메서드를 지정할 수 있습니다 . 예를 들어 다음과 같이 말할 수 있습니다.
$ git config diff.my_filter.textconv "/path/to/my_command other_func"
물론, 필터 스크립트는 당신이 좋아하는 것을 할 수 있고, 더 많은 인수를 받거나, 무엇이든 할 수 있습니다. 제가 여기에서 보여준 것보다 훨씬 더 많은 유연성이 있습니다.
답변
git log 에는 모든 차이점을 찾는 데 사용할 수있는 ‘-G’옵션이 있습니다.
-G 추가되거나 제거 된 행이 주어진
<regex>
.
관심있는 함수 이름의 적절한 정규식을 제공하십시오. 예를 들면
$ git log --oneline -G'^int commit_tree'
40d52ff make commit_tree a library function
81b50f3 Move 'builtin-*' into a 'builtin/' subdirectory
7b9c0a6 git-commit-tree: make it usable from other builtins
답변
당신이 할 수있는 가장 가까운 일은 파일에서 당신의 함수의 위치를 결정하는 것입니다 (예를 들어 당신의 함수 i_am_buggy
가의 241-263 라인에 있다고 가정 해 봅시다 foo/bar.c
), 그리고 다음의 효과를 위해 무언가를 실행하십시오 :
git log -p -L 200,300:foo/bar.c
이것은 덜 열릴 것입니다 (또는 동등한 호출기). 이제 입력 /i_am_buggy
(또는 이에 상응하는 호출기)을 입력하고 변경 단계를 시작할 수 있습니다.
코드 스타일에 따라 작동 할 수도 있습니다.
git log -p -L /int i_am_buggy\(/,+30:foo/bar.c
이는 해당 정규식의 첫 번째 히트 (이상적으로는 함수 선언)에서 검색을 그 이후 30 행으로 제한합니다. end 인수는 regexp가 될 수도 있지만 regexp로 감지 하는 것은 iffier 제안입니다.
답변
올바른 방법은 eckes answer에git log -L :function:path/to/file
설명 된 대로 사용하는 것 입니다.
그러나 함수가 매우 긴 경우에는 이러한 행 중 하나만 터치 할 수있는 각 커밋에 대해 수정되지 않은 전체 기능 행이 아니라 다양한 커밋이 도입 한 변경 사항 만보고 싶을 수 있습니다. 평범한 것처럼 diff
.
일반적으로 git log
에서는 차이점을 볼 수 -p
있지만에서는 작동하지 않습니다 -L
. 따라서 grep
git log -L
컨텍스트 화하려면 관련된 라인과 커밋 / 파일 헤더 만 표시해야합니다. 여기서 트릭 --color
은 정규식과 스위치를 추가하여 터미널 컬러 라인 만 일치 시키는 것입니다. 드디어:
git log -L :function:path/to/file --color | grep --color=never -E -e "^(^[\[[0-9;]*[a-zA-Z])+" -3
참고 ^[
문자, 실제이어야한다 ^[
. bash에서 ^ V ^ [, 즉 Ctrl+ V, Ctrl+ 를 눌러 입력 할 수 있습니다 [. 여기를 참조 하십시오 .
또한 마지막 -3
스위치를 사용하면 일치하는 각 줄 앞뒤에 3 줄의 출력 컨텍스트를 인쇄 할 수 있습니다. 필요에 따라 조정할 수 있습니다.
답변
git blame 은 파일의 각 줄을 마지막으로 변경 한 사람을 보여줍니다. 검사 할 줄을 지정하여 함수 외부의 줄 기록을 가져 오지 않도록 할 수 있습니다.
답변
-
eckes의 답변 과 git doc
git log -L :<funcname>:<file>
에 표시된 대로 함수 기록 표시아무것도 표시되지 않으면 사용자 정의 hunk-header 정의를 참조 하여 해당 언어를 지원
*.java diff=java
하기 위해.gitattributes
파일에 유사한 항목을 추가 하십시오. -
커밋 간 함수 기록 표시
git log commit1..commit2 -L :functionName:filePath
-
오버로드 된 함수 기록 표시 (이름은 같지만 매개 변수가 다른 함수가 많을 수 있음)
git log -L :sum\(double:filepath