Subversion의 특정 코드 줄에 대한 변경 내역


78

Subversion 저장소에서 특정 코드 줄에 대한 변경 내역을 볼 수 있습니까?

예를 들어 특정 문이 추가 된시기 또는 해당 문이 변경된시기를 볼 수 있기를 원합니다. 해당 줄 번호가 더 이상 동일하지 않더라도 말입니다.

답변:


55

Subversion에서 시간을 통해 진술을 추적하는 방법을 모릅니다.

그러나 파일의 특정 행이를 사용하여 마지막으로 변경된시기를 확인하는 것은 간단 svn blame합니다. SVNBook 확인 : svn blame참조 :

개요

svn blame TARGET[@REV]...

기술

지정된 파일 또는 URL에 대한 작성자 및 개정 정보를 인라인으로 표시합니다. 텍스트의 각 줄은 처음에 작성자 (사용자 이름)와 해당 줄의 마지막 변경에 대한 개정 번호로 주석 처리됩니다.


2
OP의 문제를 해결했지만 수동으로 살펴보기에는 너무 많은 줄과 너무 많은 수정이있을 때 특정 줄의 기록을 추적 할 수있는 방법이 있는지 여전히 궁금합니다.
JohnK

1
tortoiseSVN (윈도우에서)과 같은 많은 GUI 도구는이 기능을 기반으로 구축하여 역사를 살펴볼 수 있도록합니다. 일반적으로 함께 변경된 인접한 행을 강조 표시하고 해당 diff로 쉽게 들어갈 수 있도록 한 다음 이전 개정에서 관련 행 번호를 선택하고 반복합니다. 나는 CVS에서 마이그레이션하고 심지어 역사의 일부로 저장소 복제를 잘라내어 붙여 넣는 것을 포함하는 큰 저장소 (> 10 세)를 통해 행복하고 빠르게 추적했습니다. 더 많은 자동화를 위해 리포지토리를 git로 가져오고 더 고급 콘텐츠 기반 비난 기능을 사용할 수 있습니다.
morechilli

46

에서 TortoiseSVN을의 클라이언트를 할 수있는 아주 좋은 기능이있다 :

  • 파일 비난, 각 줄의 마지막 변경 사항 표시 (표준)
  • 위의보기에서 특정 행을 클릭 한 후 "이전 개정을 비난합니다"(이것이 좋은 것입니다)

두 번째 기능은 행에 대한 마지막 수정 이전에 주석이 달린 개정판을 표시합니다. 이 기능을 반복적으로 사용하면 특정 라인의 기록을 추적 할 수 있습니다.


비난이 선을 보여주지 않는다면? 특정 줄의 변경 사항을 검색하는 경우가 있습니다. 사용 된 거북이-> 비난 늦게 개정에 개정하자. 파일에서 나는 특정 줄을 볼 수 있지만 비난받을 수 없습니다.
Offler 2013 년

13

나는 보통 :

  1. svn blame FILE먼저 실행하십시오 .
  2. 특정 행의 마지막 개정을 기록하십시오.
  3. -r인수를 사용하여 다른 쿼리를 수행하십시오 .

    svn blame FILE -r 1:REV
    
  4. 거기에서 수동으로 추적하십시오.

당신은 1. 얻을 수 있으며, 2. 결합svn annotate $file_path | head -n$line_no | tail -1 | awk '{print $1}'
hardmooth

5

이는 두 단계로 수행 할 수 있습니다.

  1. svn blame /path/to/your/file > blame.tmp
  2. grep "your_line_of_text" blame.tmp

blame.tmp 파일이 필요하지 않은 경우 나중에 삭제할 수 있습니다.

원칙적으로 간단한 스크립트는 거의 동일한 스크립트 언어로 작성할 수 있습니다.


이 작업을 수행 할 필요가 없습니다. 이것은 편집기 자체에서 수행 할 수 있습니다. 예를 들어 저는 vim에서 VCSAnnotate를 사용합니다. vim 편집기를 떠나지 않고 비난 출력을 분할하고 표시합니다. 다른 편집자들도 비슷한 플러그인을 가지고 있습니다
KeshV

2

여기서 핵심은 얼마나 많은 역사가 필요한지입니다. 다른 사람들이 지적했듯이 짧은 대답은 다음과 같습니다 svn blame(자세한 내용 svn help blame은 참조). 역사상 먼 옛날에 이르렀거나 중요한 변화를 다루고 있다면이 명령 하나 이상이 필요할 것입니다.

나는 이것을 직접해야했고, 여기에서 (ye ole) 스레드를 찾았습니다. CLI특히 API가 변경된 경우 (예 : 다른 사람의 매우 오래된 작업 (브랜치가 아님)을 최신 버전을 기반으로 기능 브랜치로 다시 포팅하는 동안) 을 사용하여 해결하기 위해 제가 한 작업은 다음과 같습니다 . 날짜 트렁크). 예를 들어 함수 이름이 어떤 함수를 호출해야하는지 명확하지 않은 곳으로 충분히 변경되었습니다.

1 단계

다음 명령을 사용하면 "fileName.h"파일에서 변경된 내용이있는 커밋을 페이지로 이동하고 해당 개정 번호를 볼 수 있습니다 (참고 : svn 로그 텍스트에 따라 다소 컨텍스트에 대해 '10'을 변경해야 할 수 있습니다. ).

svn log | grep -C 10 "fileName.h" | less

이 파일이 수정 된 개정 목록이 생성됩니다.

2 단계

그런 다음 관심있는 수정 사항으로 범위를 좁히기 위해 blame(또는 다른 사람들이 지적했듯이) 사용하는 간단한 문제였습니다 annotate.

cd trunk
svn blame fileName.h@r35948 | less

예를 들어 관심있는 개정판이 35948임을 발견했습니다.

3 단계

비난을 통해 관심있는 개정판을 찾았 으면 SVN 도구를 활용하기 위해 diff를 생성 할 수 있습니다.

svn diff -r35948:PREV fileName.h

결론

시각적 차이가 있으면 최신 / 업데이트 된 API 이름으로 이전 API 이름을 훨씬 쉽게 식별 할 수 있습니다.


내 특정 시나리오에서 운이 좋으며 로그에 좋은 커밋 메시지가있는 코드로 작업하는 grep경우 이전 API / 함수 이름에 대해 " func_FindParm을 func_GetParm으로 변경 "과 같은 주석을 찾을 수도 있습니다 . .
tniles

2

Eclipse 에서는 SVN 주석보기를 사용하여 코드의 각 줄이 언제 커밋되었는지 알 수 있습니다. 또는 파일 → 주석 표시 ...를 마우스 오른쪽 버튼으로 클릭합니다 .



0

svn blame은 마지막으로 파일의 어떤 행을 수정했는지 보여줍니다.

이것은 이전 개정판에서도 작동합니다.


0

시작은 svn blame (또는 주석, 칭찬) 명령입니다. 코드 줄이 마지막으로 수정 된시기와 수정 한 사람이 표시됩니다. 예 :

  4564    wiemann # $Id$
  4564    wiemann # Author: David Goodger <goodger@python.org>
   778    goodger # Copyright: This module has been placed in the public domain.
   217    goodger 

0

Emacs를 사용하는 경우 내장 패키지 vc가이를 수행 할 수 있습니다.

  1. 해당 파일로 이동합니다.
  2. 명령을 실행 vc-annotate하여 하나 M-x vc-annotate또는C-xvg .
  3. 각 줄은 일반과 같이 개정과 함께 표시됩니다. svn blame .
  4. a( vc-annotate-revision-previous-to-line)를 누르면 현재 행에서 개정 전 개정으로 이동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.