Ответ 1
git svn clone <svn url>
git log -G<some regex>
Есть ли способ выполнить полный текстовый поиск репозитория подрывной деятельности, включая всю историю?
Например, я написал функцию, которую я использовал где-то, но тогда она не нужна, поэтому я svn rm'd файлы, но теперь мне нужно найти ее снова, чтобы использовать ее для чего-то другого. В журнале svn, вероятно, написано что-то вроде "удаленных неиспользуемых материалов", и там загрузок таких проверок.
Изменить 2016-04-15: Обратите внимание, что то, что здесь задается термином "полнотекстовый поиск", - это поиск фактических различий истории фиксации, а не имен файлов и/или совершать сообщения. Я указываю это, потому что авторская фраза выше не очень хорошо отражает это, поскольку в его примере он может также искать только имя файла и/или сообщение фиксации. Отсюда много ответов и комментариев svn log
.
git svn clone <svn url>
git log -G<some regex>
svn log
в Apache Subversion 1.8 поддерживает новый --search
вариант. Таким образом, вы можете искать сообщения журнала истории репозитория Subversion, не используя 3-х сторонние инструменты и скрипты.
svn log --search
выполняет поиск в тексте автора, даты, сообщения журнала и списке измененных путей.
Если вы используете Windows, посмотрите SvnQuery. Он поддерживает полный текстовый индекс локальных или удаленных репозиториев. Каждый документ, когда-либо прикрепленный к репозиторию, индексируется. Вы можете делать Google-подобные запросы из простого веб-интерфейса.
Я использую небольшой shellscript, но это работает только для одного файла. Вы можете использовать это, чтобы найти больше файлов.
#!/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.
Лучший способ, который я нашел для этого, - это меньше:
svn log --verbose | меньше
Как только вы выйдете с выходом, вы можете нажать /
для поиска, например VIM.
Edit:
По словам автора, он хочет искать больше, чем просто сообщения и имена файлов. В этом случае вам понадобится гетто - взломайте его вместе с чем-то вроде:
svn diff -r0:HEAD | less
Вы также можете заменить grep
или что-то еще, чтобы выполнить поиск. Если вы хотите использовать это в поддиректории репозитория, вам нужно будет использовать svn log
для определения первой версии, в которой существует этот каталог, и использовать эту ревизию вместо 0
.
Я искал нечто похожее. Лучшее, что я придумал, это OpenGrok. Я еще не пытался его реализовать, но звучит многообещающе.
Не будучи свободным, вы можете взглянуть на Fisheye от Atlassian, тех же людей, которые принесут вам JIRA. Он выполняет полнотекстовый поиск по SVN со многими другими полезными функциями.
svn log -v [repository] > somefile.log
для diff вы можете использовать опцию --diff
svn log -v --diff [repository] > somefile.log
затем используйте vim или nano или что-то, что вам нравится, и выполните поиск того, что вы ищете. Вы найдете его довольно быстро.
Это не фантазия script или что-то автоматическое. Но он работает.
Я искал то же самое и нашел это:
Я столкнулся с этой проблемой и
svnadmin dump <repo location> |grep -i <search term>
выполнил эту работу для меня. Вернул ревизию первого вхождения и процитировал строку, которую я искал.
У меня нет опыта с этим, но SupoSE (с открытым исходным кодом, написанный на Java) - это инструмент, предназначенный для сделайте именно это.
svn log -l<commit limit> | grep -C<5 or more lines> <search message>
Я написал это как cygwin bash script для решения этой проблемы.
Однако для этого требуется, чтобы поисковый запрос находился в файле файловой системы. Для всех файлов, соответствующих файловой системе grep, затем выполняется grep всех svn diff для этого файла. Не совершенен, но должен быть достаточно хорош для большей части использования. Надеюсь, это поможет.
/USR/локальные/бен/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/локальные/бен/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 }'
Я обычно делаю то, что Jack M говорит (используйте svn log --verbose), но я трачу на grep, а не меньше.
Если вы пытаетесь определить, какая ревизия отвечает за определенную строку кода, вы, вероятно, ищете:
svn blame
Кредит: оригинальный ответ
Я столкнулся с этим bash script, но я его не пробовал.