سؤال

هل هناك طريقة لإجراء بحث عن النص الكامل لمستودع التخريب، بما في ذلك السجل بأكمله؟

على سبيل المثال، قمت بكتابة ميزة استخدمتها في مكان ما، ولكن بعد ذلك لم تكن هناك حاجة إليها، لذلك قمت بالبحث عن الملفات، ولكن الآن أحتاج إلى العثور عليها مرة أخرى لاستخدامها في شيء آخر.من المحتمل أن يقول سجل svn شيئًا مثل "إزالة العناصر غير المستخدمة"، وهناك الكثير من عمليات تسجيل الوصول مثل ذلك.

تحرير 15-04-2016: يرجى ملاحظة أن المطلوب هنا بمصطلح "البحث عن النص الكامل" هو ابحث في الاختلافات الفعلية لسجل الالتزام، وليس في أسماء الملفات و/أو رسائل الالتزام.أنا أشير إلى ذلك لأن صياغة المؤلف أعلاه لا تعكس ذلك جيدًا - لأنه في مثاله ربما يبحث فقط عن اسم ملف و/أو رسالة التزام.ومن ثم فإن الكثير من svn log الإجابات والتعليقات.

هل كانت مفيدة؟

المحلول

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

نصائح أخرى

svn log في Apache Subversion 1.8 يدعم جديد --search خيار.حتى تتمكن من البحث في رسائل سجل محفوظات مستودع Subversion دون استخدام أدوات وبرامج نصية تابعة لجهات خارجية.

svn log --search البحث في المؤلف والتاريخ ونص رسالة السجل وقائمة المسارات التي تم تغييرها.

يرى سفنبوك | svn log مرجع سطر الأوامر.

إذا كنت تستخدم نظام التشغيل 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.

يحرر:

وفقا للمؤلف، فهو يريد البحث أكثر من مجرد الرسائل وأسماء الملفات.في هذه الحالة سيُطلب منك اختراق الغيتو باستخدام شيء مثل:

svn diff -r0:HEAD | less

يمكنك أيضا استبدال grep أو أي شيء آخر للقيام بالبحث عنك.إذا كنت تريد استخدام هذا في دليل فرعي للمستودع، فستحتاج إلى استخدامه svn log لتمييز المراجعة الأولى التي يوجد بها هذا الدليل، واستخدام هذه المراجعة بدلاً من 0.

لقد كنت أبحث عن شيء مماثل.أفضل ما توصلت إليه هو أوبن جروك.لم أحاول تنفيذه بعد، لكنه يبدو واعدًا.

svn log -v [repository] > somefile.log

للفرق يمكنك استخدام --diff خيار

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

ثم استخدم vim أو nano أو أي شيء تريد استخدامه، وقم بالبحث عما تبحث عنه.ستجده بسرعة كبيرة.

إنه ليس نصًا خياليًا أو أي شيء آلي.لكنها تعمل.

على الرغم من أنها ليست مجانية، يمكنك إلقاء نظرة على Fisheye من Atlassian، وهم نفس الأشخاص الذين جلبوا لك JIRA.يقوم بالبحث عن النص الكامل مقابل SVN مع العديد من الميزات المفيدة الأخرى.

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

كنت أبحث عن نفس الشيء ووجدت هذا:

http://svn-search.sourceforge.net/

لقد واجهت للتو هذه المشكلة و

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

فعلت هذه المهمة بالنسبة لي.أعادت مراجعة التواجد الأول واقتبست السطر الذي كنت أبحث عنه.

ليس لدي أي خبرة في ذلك، ولكن لنفترض (مفتوحة المصدر، مكتوبة بلغة Java) هي أداة مصممة للقيام بذلك بالضبط.

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

لقد كتبت هذا كبرنامج نصي cygwin bash لحل هذه المشكلة.

ومع ذلك، يتطلب الأمر أن يكون مصطلح البحث موجودًا حاليًا داخل ملف نظام الملفات.بالنسبة لجميع الملفات التي تطابق نظام الملفات grep، يتم بعد ذلك إجراء grep لجميع اختلافات svn لهذا الملف.ليست مثالية، ولكن يجب أن تكون جيدة بما يكفي لمعظم الاستخدامات.أتمنى أن يساعدك هذا.

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

عادة ما أفعل ماذا جاك م يقول (استخدم سجل svn --verbose) لكنني أقوم بالتوجيه إلى grep بدلا من أقل.

إذا كنت تحاول تحديد المراجعة المسؤولة عن سطر معين من التعليمات البرمجية، فمن المحتمل أنك تبحث عن:

svn blame

ائتمان: الجواب الأصلي

جئت عبر هذا البرنامج النصي باش, ، ولكنني لم أحاول ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top