2008-09-04 108 views
115

有沒有一種方法可以執行包括所有歷史記錄在內的Subversion版本庫的全文搜索?例如,我寫了一個功能,我使用了某個地方,但這不是必需的,所以我svn rm'd這些文件,但現在我需要再次找到它來用於別的東西。 svn日誌可能會提示「刪除未使用的東西」,並且有很多類似的checkin。搜索顛覆歷史(全文)

編輯2016年4月15日:請注意,這是怎麼問的術語「全文搜索」,就是搜索提交歷史實際的diff,而不是文件名和/或提交信息 。我指出了這一點,因爲作者上面的措辭並沒有很好地反映出來 - 因爲在他的例子中,他可能只是在尋找文件名和/或提交信息。因此很多svn log的答案和評論。

+5

的Apache Subversion的1.8接受`svn log`命令的`--search`參數。在http://stackoverflow.com/a/17473516/761095查看我的答案 – bahrep 2013-07-04 15:06:13

+1

`svn log --search`不執行@rjmunro所要求的全文搜索,但只搜索作者,日期,日誌消息和改變路徑。 – zb226 2016-04-15 10:25:54

回答

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

我沒有任何經驗,但SupoSE(開源,用Java編寫)是一個專門用來做這件事的工具。

9

我一直在尋找類似的東西。我想出的最好的是OpenGrok。我還沒有試圖實現它,但聽起來很有希望。

+0

我已經使用OpenGrok好幾個月了,它很有趣。 – 2008-09-29 16:16:38

11

我發現做到這一點,最好的辦法是用更少:

SVN日誌--verbose |更少

一旦少了一個輸出,您可以按/搜索,如VIM。

編輯:

據筆者,他要尋找的不僅僅是郵件和文件名的更多。在這種情況下,您將需要的東西,如一起貧民窟本事:

svn diff -r0:HEAD | less 

您也可以替代grep或其他事情做搜索你。如果要在存儲庫的子目錄中使用此目錄,則需要使用svn log來識別該目錄存在的第一個修訂版本,並使用該修訂版而不是0

+4

這不是全文搜索,而是搜索日誌和文件名。 – rjmunro 2008-09-07 14:09:22

+0

如果是這樣,那麼你需要使用更多富有表現力的提交日誌。如果你想弄清修訂之間的區別,那就是整個蠟的其他球。我個人不知道這樣做的方法。 – 2009-03-23 18:11:56

+0

> svn diff -r0:HEAD> log > less log 是我在windows上的選擇。謝謝 – kingoleg 2016-04-11 14:57:37

0

我通常做什麼Jack M說(使用svn日誌--verbose),但我管grep而不是更少。

+5

這不是全文搜索,而是搜索日誌和文件名。 – rjmunro 2008-09-07 14:07:22

+0

這就是我通常最終做的事情,但我發現使用`less`你可以看到修訂,日期等,而不是評論中的行。無論如何,這通常是我正在尋找的。 – 2009-03-23 18:10:07

22

如果您運行的是Windows看看SvnQuery。它維護本地或遠程存儲庫的全文索引。曾經提交到存儲庫的每個文檔都被編入索引。您可以從簡單的Web界面進行類似谷歌的查詢。

+0

如果SvnQuery仍然保持不變,但很可惜它會死,現在它根本不起作用。 – 2015-08-06 17:17:01

21

我正在使用一個小的shellcript,但這隻適用於單個文件。你可以將這個與查找結合起來以包含更多的文件。

#!/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通過。

+2

用於管理轉儲指針的+1。 – akuhn 2010-01-26 10:44:08

+0

我必須使用awk'{print substr($ 1,2,length($ 1))}'刪除修訂版本號中的「r」,並移除grep「-q」選項以實際顯示匹配項。 – Hugo 2010-12-06 13:57:22

+0

字符串myDump.txt | grep「turtle fwd 10」 – jedierikb 2012-07-14 02:31:57

2

我只是碰到了這個問題,並

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

做的工作對我來說。返回第一次出現的修訂並引用了我正在查找的行。

1

我寫了這是一個cygwin bash腳本來解決這個問題。

但是它要求搜索項目前在文件系統文件中。對於與文件系統grep匹配的所有文件,然後執行該文件的所有svn diffs的grep。不完美,但對大多數用法應該足夠好。希望這可以幫助。

在/ 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 }' 
-3

我碰到這個bash script,但我還沒有嘗試過。

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

版本比較,你可以使用--diff選項

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

然後使用vim或者nano或任何你喜歡使用,並做你正在尋找一個搜索。你會很快找到它。

這不是一個奇特的腳本或任何自動化。但它的工作。

2

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

-1

如果你正試圖確定哪個版本是負責特定的代碼行,你可能正在尋找:

svn blame 

信用:original answer