Subversion History (전체 텍스트) 검색


135

모든 히스토리를 포함하여 서브 버전 저장소의 전체 텍스트 검색을 수행하는 방법이 있습니까?

예를 들어, 어딘가에 사용한 기능을 작성했지만 필요하지 않았으므로 파일을 svn rm'd했지만 이제 다른 용도로 사용하려면 다시 찾아야합니다. svn 로그는 아마도 "제거 된 미사용 물건"과 같은 것을 말하고, 그런 체크인이 많이 있습니다.

편집 2016-04-15 : 여기에 "전체 텍스트 검색"이라는 용어가 요구하는 것은 파일 이름 및 / 또는 커밋 메시지가 아닌 커밋 기록의 실제 차이점검색하는 것 입니다. 필자는 위의 문구가 그 점을 잘 반영하지 않기 때문에 이것을 지적하고 있습니다. 그의 예제에서 그는 파일 이름 및 / 또는 커밋 메시지 만 찾고있을 수 있기 때문입니다. 따라서 많은 svn log답변과 의견.


6
Apache Subversion 1.8은 명령 --search인수를 허용 svn log합니다. 내 답변 참조 stackoverflow.com/a/17473516/761095
bahrep

3
svn log --search@rjmunro에 필요한 전체 텍스트 검색을 수행하지는 않지만 작성자, 날짜, 로그 메시지 및 변경된 경로 목록 만 검색합니다.
zb226

답변:


77
git svn clone <svn url>
git log -G<some regex>

1
좋은 지적. gitk GUI는 이런 종류의 검색을 매우 잘 수행하며 git svn 도구를 사용하여 svn 저장소에 쉽게 액세스 할 수 있습니다. 분명히, 나는이 질문을 한 이후로 git을 사용하기로 완전히 이동 했으므로이 답변을 수락하는 것은 나에게 고유 할 수 있습니다.
rjmunro

4
저장소 크기에 따라 시간이 오래 걸릴 수 있습니다. 나에게는 한 시간 이상이 걸렸다.
user247702

20
큰 SVN 저장소를 GIT로 변환하는 것이 종종 불가능하거나 너무 오래 걸리기 때문에이 솔루션을 하향 투표했습니다. C # 언어 구문에 대한 질문이있을 때 Java를 권장하는 것과 같습니다.
ooxi

3
이 명령을 위해 추가 패키지를 설치해야 할 수도 있습니다. 우분투에서는 apt-get install git-svn.
23:53에

5
"svn log --verbose --diff | grep ..."는 git을 사용하지 않고도 거의 동일한 기능을 구매하지 않습니까?
lyte

41

svn logApache Subversion 1.8 에서는 새로운 --search옵션을 지원 합니다 . 따라서 타사 도구 및 스크립트를 사용하지 않고도 Subversion 저장소 기록 로그 메시지를 검색 할 수 있습니다.

svn log --search 작성자, 날짜, 로그 메시지 텍스트 및 변경된 경로 목록에서 검색합니다.

참조 SVNBook | svn log명령 줄 참조 .


7
편리하지만 전체 텍스트 검색은 아닙니다. 나는 git-svn 답변을 고수하고있다 :-)
rjmunro

4
googlecode의 svn repos가 여전히 svn 1.6에서 실행되고 있지는 않습니다 ... 참조 : code.google.com/p/support/wiki/… ? 그러나 클라이언트를 1,8 (및 체크 아웃 된 저장소의 svn 업그레이드)로 업데이트하면 저장소에서 svn log --search를 사용할 수 있습니다.
Mario Ruggier

작업 사본에는 모든 업데이트가 필요하지만이 명령은 개정 번호, 변경된 파일 및 주석을 포함한 전체 변경 사항을 나열합니다. 전체 텍스트가 아닌 방법은 무엇입니까?
Bernhard Döbler

24

Windows를 실행하는 경우 SvnQuery를 살펴 보십시오 . 로컬 또는 원격 리포지토리의 전체 텍스트 인덱스를 유지 관리합니다. 저장소에 커밋 된 모든 문서는 색인화됩니다. 간단한 웹 인터페이스에서 Google과 유사한 쿼리를 수행 할 수 있습니다.


SvnQuery가 여전히 유지되고 있지만 슬프게도 죽었다면 이제는 전혀 작동하지 않습니다.
Dan Atkinson


21

작은 쉘 스크립트를 사용하고 있지만 단일 파일에서만 작동합니다. 물론 더 많은 파일을 포함하기 위해 이것을 찾기와 결합 할 수 있습니다.

#!/bin/bash
for REV in `svn log $1 | grep ^r[0-9] | awk '{print $1}'`; do 
  svn cat $1 -r $REV | grep -q $2
  if [ $? -eq 0 ]; then 
    echo "$REV"
  fi 
done

정말로 모든 것을 검색하려면 svnadmin dump명령을 사용 하고 grep하십시오.


awk '{print substr ($ 1,2, length ($ 1))}'을 사용하여 개정 번호에서 "r"을 제거하고 grep "-q"옵션을 제거하여 실제로 일치 항목을 표시했습니다.
Hugo

문자열 myDump.txt | grep "turtle fwd 10"
jedierikb

2
그리고 이것이 우리가 자식을 받아들이는 이유입니다.
제한 속죄

대소 문자 무시를 위해 마지막 grep -i를 수행하고 실제로 일치하는 행을 보려면 -q를 삭제하십시오.
Belun

13

내가 찾은 가장 좋은 방법은 적은 것입니다.

svn log --verbose | 적게

출력이 적 으면 /VIM과 같이 검색 할 수 있습니다 .

편집하다:

저자에 따르면, 그는 메시지와 파일 이름 이상의 것을 검색하려고합니다. 어떤 경우에는 다음과 같이 빈민가를 해킹해야합니다.

svn diff -r0:HEAD | less

당신은 또한 당신을 대신 grep하여 다른 것을 대신 할 수도 있습니다. 이를 저장소의 서브 디렉토리에서 사용 svn log하려면 해당 디렉토리가 존재하는 첫 번째 개정판을 식별하고 대신 해당 개정판을 사용해야합니다 0.


5
그것은 전체 텍스트 검색이 아니라 로그와 파일 이름을 검색하는 것입니다.
rjmunro

이 경우보다 표현적인 커밋 로그를 사용해야합니다. 개정판의 차이점을 파악하려면 왁스의 다른 전체 공입니다. 그리고 나는 개인적으로 그렇게 할 방법을 모른다.
Jack M.

> svn diff -r0 : HEAD> log> less log는 Windows에서 선택합니다. 감사합니다
kingoleg


7
svn log -v [repository] > somefile.log

diff의 경우 --diff옵션을 사용할 수 있습니다

svn log -v --diff [repository] > somefile.log

그런 다음 vim 또는 nano 또는 원하는 것을 사용하고 원하는 것을 검색하십시오. 꽤 빨리 찾을 수 있습니다.

멋진 스크립트 나 자동화 된 것이 아닙니다. 그러나 작동합니다.


AFAICS, 실제 diff가 아닌 커밋 메시지를 검색합니다.
rjmunro

그런 다음 svn log -v --diff [repository]> somefile.log
JREN

6

무료는 아니지만 JIRA를 가져 오는 사람들과 같은 Atlassian의 Fisheye를 살펴볼 수 있습니다. 다른 많은 유용한 기능으로 SVN에 대한 전체 텍스트 검색을 수행합니다.

http://www.atlassian.com/software/fisheye/


1
어안은 꽤 좋습니다. 당신이 말했듯이, 무료는 아니지만 <= 10 커미터 라이센스는 연간 $ 10입니다.
Jason S

현재 5 명의 사용자는 10 달러이지만 단 10 명의 사용자에게는 1,000 달러로 점프합니다!
Mawg는 모니카


4

나는이 문제에 부딪쳤다.

svnadmin dump <repo location> |grep -i <search term>

나를 위해 일을했다. 첫 번째 수정본을 반환하고 내가 찾던 줄을 ​​인용했습니다.


1
로컬에서만 작동하며 리포지토리가 큰 경우 많은 시간이 걸립니다.
bahrep

2

나는 그것에 대한 경험이 없지만 SupoSE (Java로 작성된 오픈 소스)는 정확히 이것을 수행하도록 설계된 도구입니다.


2

svn log -l<commit limit> | grep -C<5 or more lines> <search message>


1

나는 일반적으로 Jack M이 말한 것을 수행 하지만 (svn log --verbose 사용) 파이프 대신 grep 하도록 파이프합니다 .


5
그것은 전체 텍스트 검색이 아니라 로그와 파일 이름을 검색하는 것입니다.
rjmunro

그것이 내가 일반적으로하는 일이지만, less당신 과 함께 실제로 의견의 줄 대신 개정, 날짜 등을 볼 수 있음을 발견했습니다 . 그것은 일반적으로 내가 찾고있는 것입니다.
Jack M.

1

이 문제를 해결하기 위해 이것을 cygwin bash 스크립트로 작성했습니다.

그러나 검색어가 현재 파일 시스템 파일 내에 있어야합니다. 파일 시스템 grep과 일치하는 모든 파일에 대해 해당 파일에 대한 모든 svn diff의 grep이 수행됩니다. 완벽하지는 않지만 대부분의 사용에는 충분해야합니다. 도움이 되었기를 바랍니다.

/ usr / local / bin / svngrep

#!/bin/bash
# Usage: svngrep $regex @grep_args

regex="$@"
pattern=`echo $regex | perl -p -e 's/--?\S+//g; s/^\\s+//;'` # strip --args
if [[ ! $regex ]]; then
    echo "Usage: svngrep \$regex @grep_args"
else 
    for file in `grep -irl --no-messages --exclude=\*.tmp --exclude=\.svn $regex ./`;     do 
        revs="`svnrevisions $file`";
        for rev in $revs; do
            diff=`svn diff $file -r$[rev-1]:$rev \
                 --diff-cmd /usr/bin/diff -x "-Ew -U5 --strip-trailing-cr" 2> /dev/null`
            context=`echo "$diff" \
                 | grep -i --color=none   -U5 "^\(+\|-\).*$pattern" \
                 | grep -i --color=always -U5             $pattern  \
                 | grep -v '^+++\|^---\|^===\|^Index: ' \
                 `
            if [[ $context ]]; then
                info=`echo "$diff" | grep '^+++\|^---'`
                log=`svn log $file -r$rev`
                #author=`svn info -r$rev | awk '/Last Changed Author:/ { print $4 }'`; 

                echo "========================================================================"
                echo "========================================================================"
                echo "$log"
                echo "$info"
                echo "$context"
                echo
            fi;
        done;
    done;
fi

/ usr / local / bin / svnrevisions

#!/bin/sh
# Usage:  svnrevisions $file
# Output: list of fully numeric svn revisions (without the r), one per line

file="$@"
    svn log "$file" 2> /dev/null | awk '/^r[[:digit:]]+ \|/ { sub(/^r/,"",$1); print  $1 }'

노력을위한 'A'! (그냥 git :) 사용
제한된 속죄


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