program tip

Git-메서드 / 함수의 변경 내역을 보려면 어떻게해야합니까?

radiobox 2020. 10. 17. 10:20
반응형

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 -Ggit log --pickaxe방법 정의가 나타나거나 내가 그들에 대한 모든 변경 목록을 만들 수있는 방법을 발견하지 않은, 사라 때마다 당신을 보여줄 수있는 신체 당신의 방법을.

그러나 gitattributestextconv속성을 사용 하여이를 수행 하는 솔루션을 결합 할 수 있습니다 . 이러한 기능은 원래 바이너리 파일 작업을 돕기위한 것이지만 여기에서도 잘 작동합니다.

핵심은 Git이 diff 작업을 수행하기 전에 관심있는 행을 제외한 모든 행을 파일에서 제거하도록하는 것입니다. 그러면 git log, git diff등이 관심있는 영역 만 표시합니다.

다음은 제가 다른 언어로하는 일에 대한 개요입니다. 자신의 필요에 맞게 조정할 수 있습니다.

  • 하나의 인수 (소스 파일 이름)를 취하고 해당 파일의 흥미로운 부분 만 출력하는 짧은 쉘 스크립트 (또는 다른 프로그램)를 작성하십시오 (또는 흥미로운 부분이 없으면 아무것도 출력하지 않음). 예를 들어 sed다음과 같이 사용할 수 있습니다 .

    #!/bin/sh
    sed -n -e '/^int my_func(/,/^}/ p' "$1"
    
  • textconv새 스크립트에 대한 Git 필터를 정의하십시오 . (자세한 내용은 gitattributes맨 페이지를 참조하십시오.) 필터 이름과 명령 위치는 원하는대로 지정할 수 있습니다.

    $ 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

This limits the search from the first hit of that regex (ideally your function declaration) to thirty lines after that. The end argument can also be a regexp, although detecting that with regexp's is an iffier proposition.


The correct way is to use git log -L :function:path/to/file as explained in eckes answer.

But in addition, if your function is very long, you may want to see only the changes that various commit had introduced, not the whole function lines, included unmodified, for each commit that maybe touch only one of these lines. Like a normal diff does.

Normally git log can view differences with -p, but this not work with -L. So you have to grep git log -L to show only involved lines and commits/files header to contextualize them. The trick here is to match only terminal colored lines, adding --color switch, with a regex. Finally:

git log -L :function:path/to/file --color | grep --color=never -E -e "^(^[\[[0-9;]*[a-zA-Z])+" -3

Note that ^[ should be actual, literal ^[. You can type them by pressing ^V^[ in bash, that is Ctrl + V, Ctrl + [. Reference here.

Also last -3 switch, allows to print 3 lines of output context, before and after each matched line. You may want to adjust it to your needs.


git blame shows you who last changed each line of the file; you can specify the lines to examine so as to avoid getting the history of lines outside your function.

참고URL : https://stackoverflow.com/questions/4781405/git-how-do-i-view-the-change-history-of-a-method-function

반응형