SVN에서 파일의 모든 기록 변경 사항을 보는 방법


169

svn diff -r a:b repo 지정된 두 개정 사이의 변경 사항을 볼 수 있다는 것을 알고 있습니다 . 내가 원하는 것은 파일을 변경 한 모든 개정에 대한 차이점입니다. 그러한 명령을 사용할 수 있습니까?


16
이상한 이름의 "blame"명령에 숨겨져 있습니다.
goosemanjack

6
@goosemanjack이 시도 할 때까지 농담이라고 생각했습니다.
SSH 이번

답변:


181

내장 명령이 없으므로 일반적으로 다음과 같은 작업을 수행합니다.

#!/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 $url@HEAD
        svn cat -r$r $url@HEAD
        echo

#       remaining revisions as differences to previous revision
        while read r
        do
            echo
            svn log -r$r $url@HEAD
            svn diff -c$r $url@HEAD
            echo
        done
    }
}

그런 다음 다음과 같이 호출 할 수 있습니다.

history_of_file $1

35
전에는 "브레이스 블록으로 배관"트릭을 본 적이 없습니다. 산뜻한.

5
이 스크립트의 배치 파일 버전 은 fwiw입니다.
ladenedge

나는 이것을 .bashrc 파일에 추가했다. 내가 시작할 때 나는 얻을 svn: '.' is not a working copy svn: Syntax error in revision argument '@HEAD' svn: Syntax error in revision argument '@HEAD'
Francisc0

1
@ Francisco0 : bashrc에 마지막 줄을 포함시키지 마십시오. 함수 정의의 일부가 아니며, 주어진 예제가 독립형 스크립트로 사용되기 때문에 함수를 호출합니다.
bendin

26
svn log --diff [path_to_file]정확히 이렇게 작동합니다! stackoverflow.com/a/24938573/3185510
웹스터

143

설명 한 것과 약간 다르지만 이것이 실제로 필요한 것일 수 있습니다.

svn blame filename

파일을 마지막으로 변경 한 커밋의 시간과 작성자가 각 행의 접두사로 파일을 인쇄합니다.


4
우와 이거 대박! 몇 년 동안 SVN을 사용해 왔으며 이것에 대해 전혀 알지 못했습니다 : O
예 Barry

4
타임 스탬프를 보려면 verbose / -v 옵션이 필요할 수 있습니다 (기본 빌드 svn 1.7.9로 수행).
Weston C

교수님은 svn에 초기 책임 플러그인을 작성했습니다. 나는 이것을 아직도 찾아야했다. 그는이 과제를 완전히 작성하고 있습니다. : P
Joseph Dailey

93

코드가 변경된 파일의 전체 히스토리를 보려면 다음을 수행하십시오.

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

3
--diff 옵션이 언제 추가되었는지 모르지만 svn 1.8.10에서 작동하므로 bash 스크립트가 필요하지 않습니다
Guillaume Gros

1
svn 1.7.4에는 옵션에 --diff대한 테스트가있는 반면 1.7.3에는-가 없으므로 옵션이 도입되었습니다 subversion/tests/cmdline/log_tests.py.
유효한

작은 참고 사항 : 기록의 길이에 따라 log.txt 파일이 완전히 렌더링되기까지 다소 시간이 걸릴 수 있습니다 (즉시 읽을 수는 있지만).
Ivan Durst

1
이것을 가장 최근의 X 개정으로 어떻게 제한합니까?
Enigma

@ Enigma : --limit <number>옵션이 있습니다. 그래서처럼svn log --diff --limit 5 [path_to_file]
리드

37

git-svn저장소를 Git 저장소로 가져 오는 데 사용할 수 있습니다 git log -p filename. 파일에 대한 각 로그 항목과 해당 diff가 표시됩니다.


27
자식 설치, 자식 저장소 만들기, 자식 명령을 사용 하시겠습니까? 질문에 태그가 있고 Subversion에 대해 질문했습니다.
Ken Gentle

21
git을 git-svn과 함께 Subversion 클라이언트로 사용합니다. 이것이 Subversion 저장소에 대해 log + diff 작업을 수행하는 방법입니다. Git에는 저장소를 볼 수있는 훌륭한 도구가 있습니다.
Greg Hewgill

10
위의 누군가는 SVN에없는 기능을 제공하기 위해 멋진 스크립트를 작성 한 것을 축하합니다. 푸시하지 않는 한 git이 로컬임을 확인하면이 툴링을 호출 할 수 있으며 모든 것에 대해 화를 낼 필요가 없습니다.
Adam Tolley

또한 GUI를 사용하여 파일 기록을 볼 수있는 유일한 대답이기도합니다. 다른 답변은 또한 마지막 X 개정판 (제대로 가능합니까?)으로 제한하는 방법을 설명하지 않았습니다. git log X..Y -o filename
TamaMcGlinn

21

로 시작

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

그러면 파일이 변경된 수정본 목록이 표시되어에 대한 반복 호출을 스크립팅하는 데 사용할 수 있습니다 svn diff.


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

8

이상한 이름의 "blame"명령이이를 수행합니다. Tortoise를 사용하는 경우 "개정 본에서"대화 상자가 표시되고 그 다음에 개정 번호를 나타내는 행 단위 표시기와 함께 파일이 나열됩니다.

개정 정보를 마우스 오른쪽 버튼으로 클릭하면 체크인에 포함 된 다른 파일과 함께 전체 체크인 정보를 제공하는 "로그 표시"대화 상자가 나타납니다.


1
그것은 매우 유용하지만 OP가 찾고있는 것은 아닙니다. 현재 파일의 역사적인 기여뿐만 아니라 파일의 전체 기록입니다. 이 전체 기록은 특정 코드가 제거되거나 변경된 이유와시기를 파악할 때 유용합니다.
Adam Tolley

오히려 그 이름은 옳습니다. 특정 (크 래피 / 버기 / 이해할 수없는) 코드 덩어리에 대해 책임을 져야 할 사람을 알려줍니다.
ivan_pozdeev

명령의 명백한 이름이 "비난"이 아닌 "신용"이라면 좋지 않습니까? :)
Nick

1
@Nick svn 칭찬은 느낌에 따라 svn 탓의 별칭입니다.
stefgosselin 2016 년

@stefgosselin-메모 해 주셔서 감사합니다. 선택의 여지가 있다는 것을 알게되어 기쁩니다! :)
Nick

3

내가 아는 한 svn 명령이 내장되어 있지 않습니다. 모든 diff를 빌드하기 위해 여러 명령을 실행하려면 스크립트를 작성해야합니다. 옵션 인 경우 GUI svn 클라이언트를 사용하는 것이 더 간단한 방법입니다. 파괴적인 플러그인 Eclipse와 같은 많은 파일들은 파일 히스토리를 나열 할뿐만 아니라 각 개정판의 차이점을 볼 수 있습니다.


3

고마워, 벤딘 나는 당신의 솔루션을 매우 좋아합니다.

가장 최근의 변경 사항을 먼저 표시하여 역순으로 작동하도록 변경했습니다. 오래 지속되는 코드에서 중요한 것은 몇 년 동안 유지되었습니다. 나는 보통 그것을 더 많이 파이프합니다.

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 $url@HEAD
            svn diff -c$r $url@HEAD
            echo
    done
    }
}

history_of_file $1

0

이 주제를 연구하는 동안 많은 부분 답변을 보았습니다. 이것이 나를 위해 일한 것이며 다른 사람들에게 도움이되기를 바랍니다. 이 명령은 명령 행에 출력을 표시하여 개정 번호, 작성자, 개정 시간 소인 및 변경 사항을 표시합니다.

svn blame -v <filename>

보다 쉽게 ​​검색 할 수 있도록 출력을 파일에 쓰고 원하는 것을 grep 할 수 있습니다.

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