Git은 실제로 한 파일에서 다른 파일로의 단일 함수 이동을 추적 할 수 있습니까? 그렇다면 어떻게?
한 파일에서 다른 파일로 단일 함수를 이동하면 Git이이를 추적 할 수 있다는 진술을 여러 번 발견했습니다. 예를 들어, 이 항목 은 "Linus는 함수를 한 파일에서 다른 파일로 이동하면 Git이 이동 중에 해당 단일 함수의 기록을 알려 준다고 말합니다."라고 말합니다.
그러나 나는 Git의 내부 설계에 대해 약간의 인식을 가지고 있으며 이것이 어떻게 가능한지 모르겠습니다. 그래서 궁금합니다 ... 이것이 올바른 진술입니까? 그렇다면 어떻게 가능할까요?
내 이해는 Git이 각 파일의 내용을 Blob으로 저장하고 각 Blob에는 내용과 크기의 SHA 해시에서 발생하는 전역 적으로 고유 한 ID가 있다는 것입니다. 그런 다음 Git은 폴더를 트리로 나타냅니다. 모든 파일 이름 정보는 Blob이 아니라 Tree에 속하므로 예를 들어 파일 이름 변경은 Blob이 아닌 Tree에 대한 변경으로 표시됩니다.
그래서 20 개의 함수가있는 "foo"라는 파일과 그 안에 5 개의 함수가있는 "bar"라는 파일이 있고 함수 중 하나를 foo에서 bar로 이동하면 (각각 19와 6이됩니다), Git이 해당 기능을 한 파일에서 다른 파일로 이동했음을 어떻게 감지 할 수 있습니까?
내 이해에서 이것은 2 개의 새로운 blob이 존재하게 할 것입니다 (하나는 수정 된 foo 용이고 다른 하나는 수정 된 막대 용). 함수가 한 파일에서 다른 파일로 이동했음을 보여주기 위해 diff를 계산할 수 있다는 것을 알고 있습니다. 그러나 함수에 대한 기록이 foo 대신 bar와 어떻게 연관 될 수 있는지 모르겠습니다 (어쨌든 자동으로 아님).
Git이 실제로 단일 파일 내부 를 보고 함수 별 blob을 계산한다면 (가능한 언어를 구문 분석하는 방법을 알아야하므로 미친 / 실행 불가능할 것입니다), 이것이 어떻게 가능한지 볼 수 있습니다.
그래서 ... 진술이 정확합니까? 그리고 그것이 맞다면 내 이해가 부족한 것은 무엇입니까?
이 기능은 git blame -C를 통해 제공됩니다.
-C 옵션은 git이 검토중인 파일의 텍스트 청크 추가 또는 삭제와 동일한 변경 세트에서 수정 된 파일 사이에서 일치하는 항목을 찾도록 유도합니다. 추가 -CC 또는 -CCC는 검색을 확장합니다. 매뉴얼 페이지에 git help blame을 입력하십시오.
git blame -C를 사용하여 테스트 저장소에서 직접 시도하면 방금 이동 한 코드 블록이 원래 파일이 속한 원본 파일에서 시작되었음을 알 수 있습니다.
현재 힘내 2.15, git diff
지금 지원 와 이동 라인의 탐지 --color-moved
옵션을 선택합니다. 파일 간 이동에 대해 작동합니다.
분명히 색상이 지정된 터미널 출력에 대해 작동합니다. 내가 알 수있는 한, 일반 텍스트 패치 형식으로 이동을 표시하는 옵션은 없지만 의미가 있습니다.
기본 동작의 경우
git diff --color-moved
또한이 명령은 현재 옵션, 소요 no
, default
, plain
, zebra
및 dimmed_zebra
(사용이 git help diff
최신 옵션과 설명을 얻을 수를). 예를 들면 :
git diff --color-moved=zebra
에 관해서는 어떻게 그것을 할, 당신은에서 이해하는 몇 주울 수있는 기능의 저자이 전자 메일 교환을 .
이 기능의 일부는 git gui blame
(+ 파일 이름)에 있습니다. 파일 행의 주석을 보여 주며, 각 행은 작성시기와 마지막 변경시기를 나타냅니다. 파일 간 코드 이동의 경우 원본 파일의 커밋을 생성으로 표시하고 현재 파일에 마지막 변경 으로 추가 한 커밋을 표시합니다 . 시도 해봐.
내가 정말로 원하는 것은 git log
파일 경로에 추가로 줄 번호 범위를 인수 로 제공 한 다음이 코드 블록의 기록을 표시하는 것입니다. 문서가 옳다면 그러한 옵션은 없습니다. 예, Linus의 진술에서 나도 그러한 명령을 쉽게 사용할 수 있어야한다고 생각합니다.
git은 실제로 이름 변경 을 전혀 추적하지 않습니다 . 이름 바꾸기는 삭제 및 추가뿐입니다. 이름을 표시하는 모든 도구는이 기록 정보에서 재구성됩니다.
따라서 추적 함수 이름 변경은 사실 이후 각 커밋에있는 모든 파일의 차이점을 분석하는 간단한 문제입니다. 특별히 불가능한 것은 없습니다. 기존의 이름 변경 추적은 이미 '퍼지'이름 변경을 처리합니다.이 경우 파일 이름을 변경하고 일부 변경이 수행됩니다. 이를 위해서는 파일의 내용을 확인해야합니다. 함수 이름 변경을 찾는 것도 간단한 확장입니다.
그러나 기본 git 도구가 실제로이 작업을 수행하는지는 모르겠습니다. 언어 중립적이며 기능 식별은 언어 중립적이지 않습니다.
거기에 git diff
그 특정 라인에서 사라 중임을 보여줍니다 foo
및에 다시 나타났다 bar
. 동일한 커밋에서 이러한 파일에 다른 변경 사항이 없으면 변경 사항을 쉽게 찾을 수 있습니다.
지적 git
클라이언트는 행이 한 파일에서 다른 파일로 이동하는 방법을 보여줄 수 있습니다. 언어 인식 IDE는이 변경 사항을 특정 기능에 대응시킬 수 있습니다.
파일 이름이 바뀌면 매우 유사한 일이 발생합니다. 한 이름 아래에서 사라지고 다른 이름 아래에 다시 나타나지만 합리적인 도구는이를 알아 차리고 이름 바꾸기로 나타낼 수 있습니다.
'IT Share you' 카테고리의 다른 글
람다에서 상속한다는 것은 무엇을 의미합니까? (0) | 2020.11.18 |
---|---|
Powershell에서 TDD 및 단위 테스트를 수행하는 방법은 무엇입니까? (0) | 2020.11.18 |
이 폴더에서 일치하는 기호 파일을 찾을 수 없습니다. (0) | 2020.11.18 |
HttpRequestException에서 StatusCode를 어떻게 얻습니까? (0) | 2020.11.18 |
MongoDB 용 GUI 도구 (0) | 2020.11.18 |