2008-11-12 5 views
146

svn diff -r a:b repo을 사용하면 지정된 두 개정판 사이의 변경 사항을 볼 수 있습니다. 내가 원하는 것은 파일을 변경 한 모든 개정판에 대한 diff입니다. 그러한 명령이 사용 가능합니까?SVN의 파일에 대한 모든 내역 변경 사항을 보려면 어떻게해야합니까?

+16

을 명령을 "비난". – goosemanjack

+6

나는 그것을 시도 할 때까지 @goosemanjack이 농담하고 있다고 생각했다. –

답변

166

있다 전혀 그것에 대한 명령 내장, 그래서 대개 같은 것을 할 : 당신이 설명한 것과

history_of_file $1 
+32

"브레이킹 된 블록으로 파이핑"하는 것은 결코 전에 본 적이 없습니다. 산뜻한. 이 스크립트의 –

+5

[일괄 파일 버전] (http://stackoverflow.com/questions/5622367/generate-history-of-changes-on-a-file-in-svn/5721533#5721533) fwiw. – ladenedge

+0

이것을 .bashrc 파일에 추가했습니다. 내가 시작할 때 나는'svn : '을 얻는다.' svn : 개정 인수 '@HEAD'에 구문 오류가 있습니다. svn : 수정 인수 '@ HEAD'의 구문 오류입니다. – Francisc0

36

을 사용하여 저장소를 Git 저장소로 가져온 다음 git log -p filename을 사용할 수 있습니다. 이것은 파일에 대한 각 로그 항목과 그에 상응하는 diff를 표시합니다.

+22

git 설치, git 저장소 생성, git 명령 사용? 질문에 태그가 추가되어 Subversion에 대해 질문했습니다. –

+17

git-svn을 사용하여 Subversion 클라이언트로 git을 사용합니다. 이것은 Subversion 저장소에 대해 log + diff 작업을 수행하는 방법입니다. Git은 리포지토리를보기위한 훌륭한 툴을 가지고있다. –

+6

위의 누군가는 (좋은) SVN에없는 기능을 제공하기 위해 멋진 스크립트 작성에 축하를 보냅니다. 당신이 푸시하지 않으면 git이 지역적이라는 것을 알 수 있습니다.이 툴링을 호출 할 수 있으며, 모든 것에 대해 화를 낼 필요가 없습니다. –

3

내가 아는 한이 작업을 수행하기 위해 svn 명령이 내장되어 있지 않습니다. 모든 diff를 빌드하기 위해 여러 명령을 실행하는 스크립트를 작성해야합니다. 더 간단한 접근 방법은 옵션 인 경우 GUI svn 클라이언트를 사용하는 것입니다. 이클립스 용 파괴 형 플러그인과 같은 많은 이들이 파일의 히스토리를 나열 할뿐만 아니라 각 리비전의 diff를 볼 수도 있습니다. 당신이 다음 svn diff에 스크립트 호출을 반복하는 데 사용할 수있는 파일이 변경 버전의 목록을 얻을 것이다

svn log -q file | grep '^r' | cut -f1 -d' ' 

17

시작.

+4

또는 ... 계속! ''svn log -q some_file.xxx | grep^r | awk '{print $ 1}'| sed -e 's/^ r //'| xargs -i svn diff -rHEAD : {} some_file.xxx> ~/file_history.txt'' 멋진 작은 하나의 라이너 (awk는 커팅과 동일) – Kasapo

128

약간 다른 : 당신은 그것을 호출 할 수 있습니다, 그리고

#!/bin/bash 

# history_of_file 
# 
# Outputs the full history of a given file as a sequence of 
# logentry/diff pairs. The first revision of the file is emitted as 
# full text since there's not previous version to compare it to. 

function history_of_file() { 
    url=$1 # current url of file 
    svn log -q $url | grep -E -e "^r[[:digit:]]+" -o | cut -c2- | sort -n | { 

#  first revision as full text 
     echo 
     read r 
     svn log -r$r [email protected] 
     svn cat -r$r [email protected] 
     echo 

#  remaining revisions as differences to previous revision 
     while read r 
     do 
      echo 
      svn log -r$r [email protected] 
      svn diff -c$r [email protected] 
      echo 
     done 
    } 
} 

을 하지만 실제로 필요한 것 같아요 :

svn blame filename 

파일을 각 줄 미리 인쇄 할 것입니다 마지막으로 변경 한 커밋의 시간과 저자에 의해 수정되었습니다.

+4

와우 멋진데! 몇 년 동안 SVN을 사용하고 있었고 이것에 대해 전혀 알지 못했습니다. O –

+2

타임 스탬프를 보려면 verbose/-v 옵션이 필요합니다 (기본 빌드 인 svn 1.7.9). –

+0

내 교수가 svn에 초기 비난 플러그인을 썼습니다. 나는 이것을 아직도보아야 만했다. 그는이 임무를 완전히 채우고 있습니다. : P –

8

이상한 이름의 "blame"명령이이 작업을 수행합니다. Tortoise를 사용하면 "개정 본"대화 상자가 표시되고 개정 번호 옆에 작성자와 작성자가 한 줄씩 나란히 표시됩니다.

수정 정보를 마우스 오른쪽 버튼으로 클릭하면 체크인 정보의 일부인 다른 파일과 함께 전체 체크인 정보를 제공하는 "로그 표시"대화 상자를 불러올 수 있습니다.

+1

그게 전부지만, 현재의 파일의 역사적인 기여뿐만 아니라, 파일의 전체 역사는 OP가 찾고 있었는데, 매우 유용합니다. 이 전체 기록은 특정 코드가 제거되거나 변경된 이유와시기를 다시 조사 할 때 유용합니다. –

+0

반대로, 이름은 꽤 맞습니다. 그것은 특정 (엉터리/버그/이해할 수없는) 코드 덩어리를 누구에게 책임이 있는지 알려줍니다. –

+0

명령의 분명한 이름이 "비난"보다는 "신용"이라면 좋지 않겠습니까? :) – Nick

3

감사합니다. Bendin. 나는 당신의 해결책을 아주 좋아합니다.

역순으로 작동하도록 변경하여 가장 최근의 변경 사항을 먼저 보여줍니다. 몇 년에 걸쳐 유지 관리되는 오랫동안 유지되는 코드에서 중요합니다. 나는 보통 그것을 더 많이 파이프한다.

svnhistory elements.py |more 

-r을 종류에 추가했습니다. 사양을 삭제했습니다. '첫 번째 기록'에 대한 처리. 마지막 항목에서 오류가 발생합니다. 차이점은 없습니다. 비록 내가 결코 그렇게까지 내려 가지 않기 때문에 나는 그것과 함께 살고 있지만.

#!/bin/bash                  

# history_of_file                
#                    
# Bendin on Stack Overflow: http://stackoverflow.com/questions/282802   
# Outputs the full history of a given file as a sequence of     
# logentry/diff pairs. The first revision of the file is emitted as   
# full text since there's not previous version to compare it to.    
#                    
# Dlink                   
# Made to work in reverse order            

function history_of_file() { 
    url=$1 # current url of file            
    svn log -q $url | grep -E -e "^r[[:digit:]]+" -o | cut -c2- | sort -nr | { 
     while read r 
    do 
      echo 
      svn log -r$r [email protected] 
      svn diff -c$r [email protected] 
      echo 
    done 
    } 
} 

history_of_file $1 
74

당신이 코드 변경을 가진 파일의 전체 역사를 보려면 : 그것은이 이상한 이름에 숨겨진

svn log --diff [path_to_file] > log.txt 
+2

--diff 옵션이 추가되었을 때 나는 모르지만 svn 1.8.10에서 작동하므로 bash 스크립트가 필요하지 않습니다. –

+1

svn 1.7.4는 이후'--diff' 옵션을 도입했습니다. 옵션에는 테스트가 있지만 1.7.3에는 'Subversion/tests/cmdline/log_tests.py'가 없습니다. – valid

+0

작은 메모 : 기록의 길이에 따라 log.txt 파일이 완전히 렌더링되기까지 꽤 오래 걸릴 수 있습니다 (즉시 읽을 수 있지만). –

관련 문제