Przeszukiwanie historii Subversion (pełny tekst)

135

Czy istnieje sposób na przeszukiwanie pełnego tekstu repozytorium subversion, w tym całą historię?

Na przykład napisałem funkcję, której gdzieś użyłem, ale potem nie była potrzebna, więc svn rm'd pliki, ale teraz muszę ją znaleźć ponownie, aby użyć jej do czegoś innego. Log svn prawdopodobnie mówi coś w stylu „usunięto nieużywane rzeczy” i jest mnóstwo takich checkinsów.

Edycja 2016-04-15: Zwróć uwagę, że termin „wyszukiwanie pełnotekstowe” dotyczy wyszukiwania rzeczywistych różnic w historii zmian, a nie nazw plików i / lub komunikatów o zmianach . Zwracam na to uwagę, ponieważ powyższe sformułowanie autora nie odzwierciedla tego zbyt dobrze - ponieważ w swoim przykładzie równie dobrze mógłby on szukać tylko nazwy pliku i / lub komunikatu o zatwierdzeniu. Stąd wiele svn logodpowiedzi i komentarzy.

rjmunro
źródło
6
Apache Subversion 1.8 przyjmuje --searchargument dla svn logpolecenia. Zobacz moją odpowiedź na stackoverflow.com/a/17473516/761095
bahrep,
3
svn log --searchnie wykonuje wyszukiwania pełnotekstowego zgodnie z wymaganiami @rjmunro, a jedynie przeszukuje autora, datę, komunikat dziennika i listę zmienionych ścieżek.
zb226

Odpowiedzi:

77
git svn clone <svn url>
git log -G<some regex>
luis gutierrez
źródło
1
Słuszna uwaga. GUI gitk wykonuje tego rodzaju wyszukiwanie bardzo dobrze i łatwo jest użyć narzędzi git svn, aby uzyskać dostęp do repozytorium svn. Trzeba przyznać, że od czasu, gdy zadałem to pytanie, przeniosłem się całkowicie do korzystania z git, więc zaakceptowanie tej odpowiedzi może być dla mnie trochę specyficzne.
rjmunro
4
Pamiętaj, może to chwilę potrwać w zależności od rozmiaru repozytorium. Mnie zajęło to ponad godzinę.
user247702
20
Odrzuciłem to rozwiązanie, ponieważ konwersja dużego repozytorium SVN do GIT jest często niewykonalna lub zajęłaby dużo czasu. To tak, jakbyś polecał Javę, gdy masz pytanie dotyczące konstrukcji języka C #.
ooxi
3
Może być konieczne zainstalowanie dodatkowego pakietu dla tego polecenia. Na Ubuntu chcesz apt-get install git-svn.
nedned
5
Czy "svn log --verbose --diff | grep ..." nie kupuje mniej więcej tej samej funkcjonalności bez konieczności używania git?
Lyte
41

svn logw Apache Subversion 1.8 obsługuje nową --searchopcję . Możesz więc przeszukiwać komunikaty dziennika historii repozytorium Subversion bez korzystania z narzędzi i skryptów innych firm.

svn log --search wyszukuje autora, datę, treść komunikatu dziennika i listę zmienionych ścieżek.

Zobacz SVNBook | svn logodwołanie do wiersza polecenia .

bahrep
źródło
7
Poręczne, ale nie wyszukiwanie pełnotekstowe.
Trzymam się
4
Nie to, że w tej chwili repozytoria svn w googlecode nadal działają na svn 1.6 ... zobacz: code.google.com/p/support/wiki/… ? Ale aktualizacja klienta do wersji 1,8 (i aktualizacja svn dowolnego wyewidencjonowanego repozytorium) umożliwi korzystanie z dziennika svn - szukaj w repozytorium ...
Mario Ruggier
Kopia robocza wymaga wszystkich aktualizacji, ale to polecenie wyświetla całą zmianę, w tym numer wersji, zmienione pliki i komentarz. Dlaczego nie jest to pełny tekst?
Bernhard Döbler
24

Jeśli używasz systemu Windows, spójrz na SvnQuery . Utrzymuje pełnotekstowy indeks lokalnych lub zdalnych repozytoriów. Każdy dokument kiedykolwiek przekazany do repozytorium jest indeksowany. Możesz wykonywać zapytania podobne do Google z prostego interfejsu internetowego.

Christian Rodemeyer
źródło
Byłoby wspaniale, gdyby SvnQuery nadal było utrzymywane, ale niestety umarło i teraz po prostu w ogóle nie działa.
Dan Atkinson
Znalazłem działającego klona (?) Na github.com/kalyptorisk/svnquery/releases
Philip Helger
21

Używam małego skryptu powłoki, ale działa to tylko dla jednego pliku. Możesz oczywiście połączyć to z funkcją find, aby dołączyć więcej plików.

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

Jeśli naprawdę chcesz przeszukać wszystko, użyj svnadmin dumppolecenia i przejdź przez grep.

Bas Grolleman
źródło
Musiałem usunąć "r" z numerów wersji za pomocą: awk '{print substr (1,2 $, length ($ 1))}' i usunąć opcję grep "-q", aby faktycznie pokazać dopasowania.
Hugo
ciągi myDump.txt | grep "turtle fwd 10"
jedierikb
2
I właśnie dlatego przyjmujemy gita.
Limited Atonement,
może chcieć zrobić last grep -i dla zignorowania wielkości liter i upuścić -q, aby faktycznie zobaczyć pasujący wiersz
Belun
13

Najlepszym sposobem, w jaki udało mi się to zrobić, jest mniej:

svn log --verbose | mniej

Gdy pojawi się mniej wyników, możesz użyć /wyszukiwania, jak VIM.

Edytować:

Według autora, chce przeszukiwać nie tylko wiadomości i nazwy plików. W takim przypadku będziesz musiał zhakować go w getcie razem z czymś takim:

svn diff -r0:HEAD | less

Możesz również zastąpić greplub coś innego, aby przeprowadzić wyszukiwanie za Ciebie. Jeśli chcesz użyć tego w podkatalogu repozytorium, będziesz musiał użyć svn logdo rozpoznania pierwszej wersji, w której ten katalog istniał, i użyć tej wersji zamiast 0.

Jack M.
źródło
5
To nie jest wyszukiwanie pełnotekstowe, to przeszukiwanie dzienników i nazw plików.
rjmunro,
W takim przypadku musisz użyć bardziej wyrazistych dzienników zatwierdzeń. Jeśli chcesz pogłębić różnicę między wersjami, to cała inna kula wosku. Osobiście nie wiem, jak to zrobić.
Jack M.
> svn diff -r0: HEAD> log> less log to mój wybór w systemie Windows. Dzięki
kingoleg
9

Szukałem czegoś podobnego. Najlepsze, co wymyśliłem, to OpenGrok . Nie próbowałem jeszcze go wdrożyć, ale brzmi obiecująco.

Mike Schall
źródło
Używam OpenGrok od kilku miesięcy, to działa.
Mauricio Scheffer,
7
svn log -v [repository] > somefile.log

dla diff możesz użyć --diffopcji

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

następnie użyj vim lub nano lub czegokolwiek, czego lubisz, i wyszukaj to, czego szukasz. Znajdziesz to dość szybko.

To nie jest wyszukany skrypt ani nic zautomatyzowanego. Ale to działa.

JREN
źródło
AFAICS, to przeszuka komunikaty o zmianach, a nie rzeczywiste różnice.
rjmunro
Następnie użyj svn log -v --diff [repozytorium]> somefile.log
JREN
6

Chociaż nie jest za darmo, możesz rzucić okiem na Fisheye od Atlassian, tych samych ludzi, którzy oferują JIRA. Wykonuje wyszukiwanie pełnotekstowe w SVN z wieloma innymi przydatnymi funkcjami.

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

mrjabba
źródło
1
Rybie oko jest całkiem niezłe. Jak mówisz, nie za darmo, ale <= 10 licencja Committera kosztuje tylko 10 USD rocznie.
Jason S
Obecnie 5 użytkowników kosztuje 10 $, ALE tylko przy 10 użytkownikach skacze do 1000 $!
Mawg mówi, że przywróć Monikę
4

Właśnie napotkałem ten problem i

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

wykonał pracę za mnie. Zwróciłem korektę pierwszego wystąpienia i zacytowałem wiersz, którego szukałem.

pfyon
źródło
1
Działa tylko lokalnie i zajmie dużo czasu, jeśli repozytorium jest duże.
bahrep
2

Nie mam z tym żadnego doświadczenia, ale SupoSE (open source, napisane w Javie) jest narzędziem zaprojektowanym właśnie do tego.

dF.
źródło
2

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

zednight
źródło
1

Zwykle robię to, co mówi Jack M (użyj svn log --verbose), ale potokuję do grep zamiast mniej.

Mark Biek
źródło
5
To nie jest wyszukiwanie pełnotekstowe, to przeszukiwanie dzienników i nazw plików.
rjmunro,
To jest to, co zwykle robię, ale odkryłem, że lessmożesz zobaczyć wersję, datę itp. Zamiast tylko linii w komentarzu. I tak zwykle tego szukam.
Jack M.
1

Napisałem to jako skrypt bash cygwin, aby rozwiązać ten problem.

Jednak wymaga, aby wyszukiwany termin znajdował się obecnie w pliku systemu plików. Dla wszystkich plików, które pasują do systemu plików grep, wykonywane jest następnie grep wszystkich różnic svn dla tego pliku. Nie jest doskonały, ale powinien być wystarczająco dobry do większości zastosowań. Mam nadzieję że to pomoże.

/ 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 }'
James McGuigan
źródło
„A” za wysiłek! (po prostu użyj git :))
Limited Atonement
-1

W przypadku, gdy próbujesz określić, która wersja jest odpowiedzialna za określoną linię kodu, prawdopodobnie szukasz:

svn blame

Kredyt: oryginalna odpowiedź

DustWolf
źródło
-3

Natknąłem się na ten skrypt basha , ale nie próbowałem go.

Douglas Smith
źródło