2008-09-04 32 views
115

Có cách nào để thực hiện tìm kiếm toàn văn bản của một kho lưu trữ lật đổ, bao gồm tất cả lịch sử không? Ví dụ, tôi đã viết một tính năng mà tôi đã sử dụng ở đâu đó, nhưng sau đó nó không cần thiết, vì vậy tôi đã rm'd các tập tin, nhưng bây giờ tôi cần phải tìm thấy nó một lần nữa để sử dụng nó cho cái gì khác. Nhật ký svn có thể nói một cái gì đó như "loại bỏ những thứ không sử dụng", và có vô số checkins như thế.Tìm kiếm lịch sử lật đổ (toàn văn)

Sửa 2016/04/15: Xin lưu ý rằng những gì được yêu cầu ở đây bằng thuật ngữ "tìm kiếm đầy đủ văn bản", là để tìm kiếm diffs thực tế của lịch sử cam kết, và không tên tập tin và/hoặc cam kết thông điệp . Tôi đang chỉ ra điều này bởi vì lời nói của tác giả ở trên không phản ánh điều đó rất tốt - vì trong ví dụ của mình, anh ta cũng có thể chỉ tìm kiếm tên tệp và/hoặc thông báo cam kết. Do đó, có rất nhiều câu trả lời và nhận xét của svn log.

+5

subversion 1,8 chấp nhận Đối số '--search' cho lệnh' svn log'. Xem câu trả lời của tôi tại http://stackoverflow.com/a/17473516/761095 – bahrep

+1

'svn log - search' không thực hiện tìm kiếm văn bản đầy đủ theo yêu cầu của @rjmunro, nhưng chỉ tìm kiếm tác giả, ngày, thông điệp tường trình và danh sách đã thay đổi đường dẫn. – zb226

Trả lời

70
git svn clone <svn url> 
git log -G<some regex> 
+1

Điểm tốt. Gitk GUI thực hiện loại tìm kiếm này rất tốt, và thật dễ dàng để sử dụng các công cụ git svn để truy cập vào kho lưu trữ svn. Được thừa nhận, tôi đã chuyển hoàn toàn sang sử dụng git kể từ khi tôi hỏi câu hỏi này, vì vậy việc chấp nhận câu trả lời này có thể hơi cụ thể đối với tôi. – rjmunro

+0

Nếu bạn chỉ muốn tìm kiếm các thông điệp cam kết, sử dụng 'git log --grep regex'. –

+2

Được thông báo, điều này có thể mất một lúc tùy thuộc vào kích thước của kho lưu trữ của bạn. Đối với tôi phải mất hơn một giờ. – Stijn

2

Tôi không có bất kỳ trải nghiệm nào với nó, nhưng SupoSE (mã nguồn mở, được viết bằng Java) là một công cụ được thiết kế để thực hiện chính xác việc này.

9

Tôi đã tìm kiếm một thứ tương tự. Điều tốt nhất tôi đã đưa ra là OpenGrok. Tôi đã không cố gắng thực hiện nó, nhưng âm thanh đầy hứa hẹn.

+0

Tôi đã sử dụng OpenGrok trong vài tháng, nó đá. –

11

Cách tốt nhất mà tôi đã tìm thấy để làm điều này là có ít:

svn log --verbose | ít hơn

Khi ít đi kèm với đầu ra, bạn có thể nhấn / để tìm kiếm, như VIM.

Edit:

Theo tác giả, ông muốn tìm kiếm nhiều hơn chỉ là các thông điệp và tên tập tin. Trong trường hợp này bạn sẽ được yêu cầu ghetto-hack nó cùng với một cái gì đó như:

svn diff -r0:HEAD | less 

Bạn cũng có thể thay thế grep hay cái gì khác để làm tìm kiếm cho bạn. Nếu bạn muốn sử dụng nó trên một thư mục con của kho lưu trữ, bạn sẽ cần phải sử dụng svn log để phân biệt bản sửa đổi đầu tiên trong đó thư mục đó tồn tại và sử dụng bản sửa đổi đó thay vì 0.

+4

Đó không phải là tìm kiếm toàn văn, nó đang tìm kiếm nhật ký và tên tập tin. – rjmunro

+0

Nếu đúng như vậy, bạn cần sử dụng nhiều nhật ký cam kết rõ ràng hơn. Nếu bạn muốn grep sự khác biệt giữa các phiên bản, đó là toàn bộ bóng khác của sáp. Và cá nhân tôi không biết cách để làm điều đó. –

+0

> svn diff -r0: HEAD> nhật ký > ít nhật ký là lựa chọn của tôi trên cửa sổ. Cảm ơn – kingoleg

0

Tôi thường làm những gì Jack M nói (sử dụng svn log --verbose) nhưng tôi gửi đến grep thay vì ít hơn.

+5

Đó không phải là tìm kiếm toàn văn, nó đang tìm kiếm nhật ký và tên tệp. – rjmunro

+0

Đó là những gì tôi thường làm, nhưng tôi thấy rằng với 'less' bạn thực sự có thể thấy bản sửa đổi, ngày tháng, vv thay vì chỉ là dòng trong bình luận. Đó thường là những gì tôi đang tìm kiếm anyway. –

22

Nếu bạn đang chạy Windows có một cái nhìn tại SvnQuery. Nó duy trì một chỉ mục văn bản đầy đủ của các kho lưu trữ cục bộ hoặc từ xa. Mọi tài liệu từng cam kết với một kho lưu trữ được lập chỉ mục. Bạn có thể thực hiện các truy vấn giống như google từ một giao diện web đơn giản.

+0

Nó sẽ là tuyệt vời nếu SvnQuery vẫn được duy trì nhưng thật đáng buồn nó đã chết và bây giờ nó chỉ không làm việc ở tất cả. –

21

Tôi đang sử dụng một shellscript nhỏ, nhưng điều này chỉ hoạt động cho một tệp duy nhất. Bạn có thể ofcourse kết hợp này với tìm để bao gồm nhiều tập tin hơn.

#!/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 

Nếu bạn thực sự muốn tìm kiếm mọi thứ, hãy sử dụng lệnh svnadmin dump và grep qua đó.

+2

+1 cho con trỏ kết xuất quản trị. – akuhn

+0

Tôi phải xóa "r" khỏi số bản sửa đổi với: awk '{print substr ($ 1,2, length ($ 1))}' và xóa tùy chọn grep "-q" để hiển thị các kết quả phù hợp. – Hugo

+0

chuỗi myDump.txt | grep "turtle fwd 10" – jedierikb

6

Trong khi không miễn phí, bạn có thể xem Fisheye từ Atlassian, cùng một người mang đến cho bạn JIRA. Nó thực hiện tìm kiếm toàn văn với SVN với nhiều tính năng hữu ích khác.

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

+1

Fisheye khá tốt. Như bạn nói, không miễn phí, nhưng <= 10 giấy phép committer chỉ là $ 10/năm. –

+0

Hiện tại, 5 người dùng là 10 đô la, NHƯNG chỉ có 10 người dùng, nó nhảy tới 1.000 đô la! – Mawg

2

Tôi chỉ chạy vào vấn đề này và

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

đã làm công việc cho tôi. Trả lại bản sửa đổi lần xuất hiện đầu tiên và trích dẫn dòng tôi đang tìm kiếm.

+2

Chỉ hoạt động cho đường dẫn cục bộ. –

+1

Chỉ hoạt động tại địa phương và sẽ mất rất nhiều thời gian nếu một kho lưu trữ lớn. – bahrep

1

tôi đã viết này như là một kịch bản bash Cygwin để giải quyết vấn đề này.

Tuy nhiên, yêu cầu cụm từ tìm kiếm hiện nằm trong tệp hệ thống tệp. Đối với tất cả các tệp khớp với grep hệ thống tập tin, một grep của tất cả các svn diffs cho tệp đó sau đó được thực hiện. Không hoàn hảo, nhưng phải đủ tốt để sử dụng nhiều nhất. Hi vọng điêu nay co ich.

/usr/local/bin/svngrep

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

regex="[email protected]" 
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="[email protected]" 
    svn log "$file" 2> /dev/null | awk '/^r[[:digit:]]+ \|/ { sub(/^r/,"",$1); print $1 }' 
+0

'A' cho nỗ lực! (chỉ cần sử dụng git :)) –

-3

Tôi đã xem qua bash script này, nhưng tôi đã không thử nó .

32

svn log trong Apache Subversion 1.8 hỗ trợ a new --search option. Vì vậy, bạn có thể tìm kiếm thông điệp nhật ký lịch sử kho lưu trữ của Subversion mà không cần sử dụng các công cụ và tập lệnh của bên thứ 3.

svn log --search tìm kiếm trong tác giả, ngày, văn bản thông báo tường trình và danh sách đường dẫn đã thay đổi.

Xem SVNBook | svn log command-line reference.

+6

Tiện dụng, nhưng không tìm kiếm toàn văn. Tôi đang gắn bó với câu trả lời git-svn :-) – rjmunro

+4

Không phải tại thời điểm svn repos trên googlecode vẫn chạy trên svn 1.6 ... xem: https://code.google.com/p/support/wiki/ SubversionFAQ # What_version_of_Subversion_do_you_use? Nhưng, cập nhật khách hàng của bạn lên 1,8 (và nâng cấp svn của bất kỳ repo đã kiểm tra nào) sẽ cho phép bạn sử dụng nhật ký svn - tìm kiếm trên repo ... –

+0

Bản sao làm việc cần tất cả các bản cập nhật nhưng lệnh này liệt kê toàn bộ thay đổi bao gồm số sửa đổi, thay đổi tệp và nhận xét. Làm thế nào nó không phải là toàn văn? –

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

cho diff bạn có thể sử dụng tùy chọn --diff

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

sau đó sử dụng vim hoặc nano hoặc bất cứ điều gì bạn thích sử dụng, và thực hiện tìm kiếm cho những gì bạn đang tìm kiếm. Bạn sẽ tìm thấy nó khá nhanh chóng.

Nó không phải là một kịch bản ưa thích hoặc bất cứ điều gì tự động. Nhưng nó đã có tác dụng.

+0

AFAICS, Điều đó sẽ tìm kiếm thư cam kết, không phải là sự khác biệt thực tế. – rjmunro

+0

Sau đó sử dụng svn log -v --diff [repository]> somefile.log – JREN

2

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

-1

Trong trường hợp bạn đang cố gắng để xác định phiên bản chịu trách nhiệm cho một dòng cụ thể của mã, bạn có thể tìm cho:

svn blame 

Credit: original answer

Các vấn đề liên quan