Tìm kiếm lịch sử lật đổ (toàn văn)


135

Có cách nào để thực hiện tìm kiếm toàn văn bản của 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 đã gửi các tệp này, nhưng bây giờ tôi cần tìm lại nó để sử dụng nó cho mục đích 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ố đăng ký như thế.

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


6
Apache Subversion 1.8 chấp nhận --searchđối số cho svn loglệnh. Xem câu trả lời của tôi tại stackoverflow.com/a/17473516/761095
bahrep

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

Câu trả lời:


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

1
Điểm tốt. GUI gitk 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. Thật đáng ngưỡng mộ, 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ể là một chút cụ thể đối với tôi.
rjmunro

4
Xin lưu ý, việc này có thể mất một lúc tùy thuộc vào kích thước kho lưu trữ của bạn. Đối với tôi phải mất hơn một giờ.
user247702

20
Tôi đã đánh giá thấp giải pháp này vì việc chuyển đổi một kho lưu trữ SVN lớn sang GIT thường không khả thi hoặc sẽ mất nhiều thời gian. Nó giống như đề xuất Java khi có câu hỏi về cấu trúc ngôn ngữ C #.
ooxi

3
Bạn có thể cần phải cài đặt một gói bổ sung cho lệnh này. Trên Ubuntu, bạn muốn apt-get install git-svn.
neded

5
Không "svn log --verbose --diff | grep ..." mua chức năng gần giống của bạn mà không phải sử dụng git?
lyte

41

svn logtrong Apache Subversion 1.8 hỗ trợ một --searchtùy chọn mới . Vì vậy, bạn có thể tìm kiếm các thông điệp nhật ký lịch sử kho lưu trữ 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 tháng, văn bản thông điệp tường trình và danh sách các đường dẫn thay đổi.

Xem SVNBook | svn logtham chiếu dòng lệnh .


7
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 của git-svn :-)
rjmunro 04/07/13

4
Không phải là tại thời điểm svn repos trên googlecode vẫn đang chạy trên svn 1.6 ... xem: code.google.com/p/support/wiki/ cảm ? Nhưng, cập nhật ứng dụng khách 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 ...
Mario Ruggier

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, tệp đã thay đổi và nhận xét. Làm thế nào nó không phải là toàn văn?
Bernhard Döbler

24

Nếu bạn đang chạy Windows, hãy xem 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.


Sẽ thật tuyệt nếu SvnQuery vẫn được duy trì nhưng thật đáng buồn là nó đã chết và bây giờ nó hoàn toàn không hoạt động.
Dan Atkinson

Tôi tìm thấy một bản sao hoạt động (?) Tại github.com/kalyptorisk/svnquery/release
Philip Helger

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ể kết hợp điều này với find để bao gồm nhiều tệp 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 svnadmin dumplệnh và grep thông qua đó.


Tôi đã phải xóa "r" khỏi các số sửa đổi với: awk '{chất nền in ($ 1,2, chiều dài ($ 1))}' và xóa tùy chọn grep "-q", để thực sự hiển thị các kết quả khớp.
Hugo

chuỗi myDump.txt | grep "rùa fwd 10"
jedierikb

2
Và đây là lý do tại sao chúng tôi nắm lấy git.
Chuộc tội giới hạn

có thể muốn thực hiện grep -i cuối cùng cho trường hợp bỏ qua và thả -q để thực sự thấy hàng khớp với
Belun

13

Cách tốt nhất mà tôi thấy để làm điều này là với ít hơn:

đăng nhập svn --verbose | ít hơn

Một khi ít xuất hiện với đầu ra, bạn có thể nhấn /để tìm kiếm, như VIM.

Biên tập:

Theo tác giả, anh muốn tìm kiếm nhiều hơn chỉ là tin nhắn và tên tập tin. Trong trường hợp đó, 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ế grephoặc một cái gì đó khác để thực hiện tìm kiếm cho bạn. Nếu bạn muốn sử dụng điều này trên một thư mục con của kho lưu trữ, bạn sẽ cần 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.


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

Nếu đó là trường hợp, sau đó bạn cần sử dụng nhật ký cam kết biểu cảm 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ộ quả bóng sáp khác. Và cá nhân tôi không biết cách để làm điều đó.
Jack M.

> svn diff -r0: HEAD> log> less log là lựa chọn của tôi trên windows. Cảm ơn
kingoleg

9

Tôi đã tìm kiếm một cái gì đó tương tự. Điều tốt nhất tôi nghĩ ra là OpenGrok . Tôi chưa thử thực hiện nó, nhưng nghe có vẻ hứa hẹn.


Tôi đã sử dụng OpenGrok được vài tháng, nó rất ổn.
Mauricio Scheffer

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

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

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

sau đó sử dụng vim hoặc nano hoặc bất cứ thứ gì bạn thích sử dụng và thực hiện tìm kiếm 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.


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

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

6

Mặc dù không miễn phí, bạn có thể xem Fisheye từ Atlassian, cùng những người mang lại cho bạn JIRA. Nó thực hiện tìm kiếm toàn văn bản chống lạ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 giấy phép <= 10 committer chỉ $ 10 / năm.
Jason S

Hiện tại, 5 người dùng là 10 đô la, NHƯNG chỉ có 10 người dùng, nó nhảy lên 1.000 đô la!
Mawg nói rằng phục hồi Monica


4

Tôi vừa gặp 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 của lần xuất hiện đầu tiên và trích dẫn dòng tôi đang tìm kiếm.


1
Chỉ hoạt động cục bộ và sẽ mất rất nhiều thời gian nếu kho lưu trữ lớn.
bahrep

2

Tôi không có bất kỳ kinh 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 điều này.



1

Tôi thường làm những gì Jack M nói (sử dụng svn log --verbose) nhưng tôi chuyển sang 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

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

1

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

Tuy nhiên, nó yêu cầu thuật ngữ 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 của hệ thống tệp, một grep của tất cả các khác biệt svn cho tệp đó sẽ được thực hiện. Không hoàn hảo, nhưng nên đủ tốt cho hầu hết việc sử dụng. Hi vọng điêu nay co ich.

/ usr / địa phương / 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 / svnrevutions

#!/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' cho nỗ lực! (chỉ sử dụng git :))
Giới hạn Chuộc

-1

Trong trường hợp bạn đang cố gắng xác định bản sửa đổi nào chịu trách nhiệm cho một dòng mã cụ thể, có lẽ bạn đang tìm kiếm:

svn blame

Tín dụng: câu trả lời gốc


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.