ค้นหาประวัติการโค่นล้ม (ข้อความเต็ม)


136

มีวิธีค้นหาข้อความแบบเต็มของที่เก็บการโค่นล้มรวมถึงประวัติทั้งหมดหรือไม่

ตัวอย่างเช่นฉันได้เขียนคุณสมบัติที่ฉันใช้ที่ไหนสักแห่ง แต่แล้วมันก็ไม่จำเป็นดังนั้นฉันจึงต้องใช้ไฟล์ แต่ตอนนี้ฉันต้องหามันอีกครั้งเพื่อใช้อย่างอื่น บันทึก svn อาจจะบอกว่า "ลบสิ่งที่ไม่ได้ใช้ออก" และมีเช็คอินจำนวนมากเช่นนั้น

แก้ไข 2016/04/15:โปรดทราบว่าสิ่งที่ถามนี่โดยคำว่า "ค้นหาข้อความเต็ม" คือการค้นหา diffs ที่เกิดขึ้นจริงของประวัติศาสตร์กระทำและไม่ได้ชื่อไฟล์และ / หรือการกระทำข้อความ ฉันชี้ให้เห็นสิ่งนี้เนื่องจากวลีของผู้เขียนข้างต้นไม่ได้สะท้อนให้เห็นถึงสิ่งนั้นได้เป็นอย่างดี - เนื่องจากในตัวอย่างของเขาเขาอาจกำลังมองหาชื่อไฟล์และ / หรือส่งข้อความเท่านั้น ดังนั้นsvn logคำตอบและความคิดเห็นมากมาย


6
Apache Subversion 1.8 ยอมรับ--searchอาร์กิวเมนต์สำหรับsvn logคำสั่ง ดูคำตอบของฉันที่stackoverflow.com/a/17473516/761095
bahrep

3
svn log --searchไม่ทำการค้นหาข้อความแบบเต็มตามที่ @rjmunro กำหนด แต่จะค้นหาเฉพาะผู้เขียนวันที่ข้อความบันทึกและรายการเส้นทางที่เปลี่ยนแปลง
zb226

คำตอบ:


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

1
จุดดี. gitk GUI ทำการค้นหาประเภทนี้ได้เป็นอย่างดีและง่ายต่อการใช้เครื่องมือ git svn เพื่อเข้าถึงที่เก็บ svn เป็นที่น่าชื่นชมฉันได้เปลี่ยนไปใช้ git ตั้งแต่ครั้งที่ฉันถามคำถามนี้ดังนั้นการยอมรับคำตอบนี้อาจเป็นเรื่องเฉพาะสำหรับฉัน
rjmunro

4
โปรดทราบว่าอาจใช้เวลาสักครู่ขึ้นอยู่กับขนาดของที่เก็บของคุณ สำหรับฉันใช้เวลามากกว่าหนึ่งชั่วโมง
user247702

23
ฉันลดคะแนนโซลูชันนี้เนื่องจากการแปลงที่เก็บ SVN ขนาดใหญ่เป็น GIT มักไม่เป็นไปได้หรือใช้เวลานานเกินไป เหมือนกับการแนะนำ Java เมื่อมีคำถามเกี่ยวกับโครงสร้างภาษา C #
ooxi

3
คุณอาจต้องติดตั้งแพ็คเกจเพิ่มเติมสำหรับคำสั่งนี้ บน Ubuntu apt-get install git-svnที่คุณต้องการ
nedned

5
ไม่ "svn log --verbose --diff | grep ... " ซื้อฟังก์ชั่นประมาณเดียวกันโดยไม่ต้องใช้ git หรือไม่?
lyte

41

svn logในการโค่นล้ม Apache 1.8 สนับสนุนใหม่--searchตัวเลือก คุณจึงสามารถค้นหาข้อความบันทึกประวัติที่เก็บการโค่นล้มได้โดยไม่ต้องใช้เครื่องมือและสคริปต์ของบุคคลที่สาม

svn log --search ค้นหาในผู้เขียนวันที่ข้อความบันทึกและรายการเส้นทางที่เปลี่ยนแปลง

ดูSVNBook | svn logอ้างอิงบรรทัดคำสั่ง


7
สะดวก แต่ไม่ใช่การค้นหาแบบเต็มข้อความ ฉันติดกับคำตอบ git-svn :-)
rjmunro

4
ไม่ใช่ว่าในขณะนี้ svn repos บน googlecode ยังคงทำงานบน svn 1.6 ... ดู: code.google.com/p/support/wiki/… ? แต่การอัปเดตไคลเอนต์ของคุณเป็น 1,8 (และการอัปเกรด svn ของ repo ที่เช็คเอาต์ใด ๆ ) จะช่วยให้คุณสามารถใช้บันทึก svn - ค้นหาใน repo ...
Mario Ruggier

สำเนาที่ใช้งานได้ต้องการการอัปเดตทั้งหมด แต่คำสั่งนี้แสดงรายการการเปลี่ยนแปลงทั้งหมดรวมถึงหมายเลขการแก้ไขไฟล์ที่เปลี่ยนแปลงและความคิดเห็น มันจะไม่เต็มข้อความได้อย่างไร?
Bernhard Döbler

24

หากคุณกำลังใช้ Windows มีลักษณะที่SvnQuery มันรักษาดัชนีข้อความแบบเต็มของที่เก็บในเครื่องหรือระยะไกล เอกสารทุกฉบับที่เคยผูกมัดกับที่เก็บจะได้รับการทำดัชนี คุณสามารถทำแบบสอบถามเหมือน Google ได้จากเว็บอินเทอร์เฟซที่เรียบง่าย


มันจะดีมากถ้า SvnQuery ยังคงได้รับการดูแล แต่น่าเศร้าที่มันเสียชีวิตและตอนนี้ก็ใช้งานไม่ได้เลย
Dan Atkinson

ฉันพบโคลนที่ใช้งานได้ (?) ที่github.com/kalyptorisk/svnquery/releases
Philip Helger

21

ฉันใช้เชลล์สคริปต์ขนาดเล็ก แต่ใช้ได้กับไฟล์เดียวเท่านั้น คุณสามารถรวมสิ่งนี้เข้ากับการค้นหาเพื่อรวมไฟล์เพิ่มเติมได้

#!/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 ผ่านสิ่งนั้น


ฉันต้องลบ "r" ออกจากตัวเลขการแก้ไขด้วย: awk '{print substr ($ 1,2, length ($ 1))}' และลบ grep "-q" option เพื่อแสดงรายการที่ตรงกัน
Hugo

สตริง myDump.txt | grep "เต่า fwd 10"
jedierikb

2
และนี่คือเหตุผลที่เรายอมรับคอมไพล์
การชดใช้อย่าง จำกัด

อาจต้องการทำ grep สุดท้าย -i เพื่อละเว้นตัวพิมพ์และวาง -q เพื่อดูแถวที่ตรงกัน
Belun

13

วิธีที่ดีที่สุดที่ฉันพบว่าทำได้คือน้อยลง:

บันทึก svn --verbose | น้อยกว่า

เมื่อผลลัพธ์น้อยลงคุณสามารถตีได้ /เพื่อค้นหาเช่น VIM

แก้ไข:

ตามที่ผู้เขียนเขาต้องการค้นหามากกว่าแค่ข้อความและชื่อไฟล์ ในกรณีนี้คุณจะต้องทำการแฮ็คสลัมพร้อมกับสิ่งต่างๆเช่น:

svn diff -r0:HEAD | less

คุณยังสามารถใช้แทนgrepหรืออย่างอื่นเพื่อค้นหาคุณได้ หากคุณต้องการที่จะใช้นี้ในไดเรกทอรีย่อยของพื้นที่เก็บข้อมูลที่คุณจะต้องใช้ที่จะมองเห็นการแก้ไขครั้งแรกในไดเรกทอรีที่มีอยู่และใช้การแก้ไขที่แทนsvn log0


5
นั่นไม่ใช่การค้นหาข้อความแบบเต็ม แต่เป็นการค้นหาบันทึกและชื่อไฟล์
rjmunro

หากเป็นเช่นนั้นคุณจำเป็นต้องใช้บันทึกการคอมมิตที่แสดงออกมากขึ้น หากคุณต้องการแยกความแตกต่างระหว่างการแก้ไขนั่นคือลูกขี้ผึ้งอื่น ๆ ทั้งหมด และผมเองก็ไม่รู้วิธีที่จะทำเช่นนั้น
Jack M.

> svn diff -r0: HEAD> log> less log เป็นตัวเลือกของฉันบน windows ขอบคุณ
kingoleg

9

ฉันกำลังมองหาสิ่งที่คล้ายกัน ดีที่สุดที่ฉันได้มาด้วยคือOpenGrok ฉันยังไม่ได้ลองใช้งาน แต่ฟังดูมีแนวโน้ม


ฉันใช้ OpenGrok มาหลายเดือนแล้ว
Mauricio Scheffer

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

สำหรับความแตกต่างคุณสามารถใช้--diffตัวเลือก

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

จากนั้นใช้ vim หรือ nano หรืออะไรก็ได้ที่คุณต้องการใช้และทำการค้นหาสิ่งที่คุณกำลังมองหา คุณจะพบว่ามันค่อนข้างเร็ว

ไม่ใช่สคริปต์แฟนซีหรืออะไรที่เป็นอัตโนมัติ แต่มันได้ผล


AFAICS ที่จะค้นหาข้อความคอมมิตไม่ใช่ความแตกต่างที่แท้จริง
rjmunro

จากนั้นใช้ svn log -v --diff [repository]> somefile.log
JREN

หรือเพียงแค่ท่อผ่าน grep ตามคำตอบของ
zednight

6

แม้ว่าจะไม่ฟรีคุณอาจลองดู Fisheye จาก Atlassian ซึ่งเป็นคนกลุ่มเดียวกับที่นำ JIRA มาให้คุณ ทำการค้นหาข้อความแบบเต็มกับ SVN พร้อมคุณสมบัติที่มีประโยชน์อื่น ๆ อีกมากมาย

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


1
ฟิชอายสวยดี อย่างที่คุณบอกไม่ใช่ฟรี แต่ใบอนุญาตคอมมิชชัน <= 10 นั้นมีราคาเพียง $ 10 / ปี
Jason S

ปัจจุบันผู้ใช้ 5 รายมีราคา $ 10 แต่มีผู้ใช้เพียง 10 รายเท่านั้นที่เพิ่มขึ้นเป็น 1,000 ดอลลาร์!
Mawg กล่าวว่าคืนสถานะ Monica


4

ฉันเพิ่งพบปัญหานี้และ

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

ทำงานให้ฉัน ส่งคืนการแก้ไขของเหตุการณ์แรกและอ้างถึงบรรทัดที่ฉันกำลังมองหา


1
ใช้งานได้เฉพาะในเครื่องและจะใช้เวลามากหากที่เก็บมีขนาดใหญ่
bahrep

3

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


เพิ่ม --diff เพื่อค้นหาข้อความของการเปลี่ยนแปลง
giles

2

ฉันไม่มีประสบการณ์กับมัน แต่SupoSE (โอเพ่นซอร์สเขียนด้วย Java) เป็นเครื่องมือที่ออกแบบมาเพื่อทำสิ่งนี้


1

ฉันมักจะทำตามที่Jack Mพูด (ใช้ svn log --verbose) แต่ฉันไปที่grepแทนน้อยกว่า


5
นั่นไม่ใช่การค้นหาข้อความแบบเต็ม แต่เป็นการค้นหาบันทึกและชื่อไฟล์
rjmunro

นั่นคือสิ่งที่ฉันมักจะทำ แต่ฉันพบว่าlessจริงๆแล้วคุณสามารถดูการแก้ไขวันที่ ฯลฯ แทนที่จะเป็นเพียงบรรทัดในความคิดเห็น นั่นคือสิ่งที่ฉันกำลังมองหาอยู่แล้ว
Jack M.

1

ฉันเขียนสิ่งนี้เป็นสคริปต์ทุบตีของ cygwin เพื่อแก้ปัญหานี้

อย่างไรก็ตามต้องการให้คำค้นหาอยู่ในไฟล์ระบบไฟล์ สำหรับไฟล์ทั้งหมดที่ตรงกับ 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 }'

'A' เพื่อความพยายาม! (ใช้คอมไพล์เท่านั้น :))
การชดใช้อย่าง จำกัด

-2

ในกรณีที่คุณกำลังพยายามพิจารณาว่าการแก้ไขใดมีหน้าที่รับผิดชอบต่อโค้ดบรรทัดใดบรรทัดหนึ่งคุณอาจกำลังมองหา:

svn blame

เครดิต: คำตอบเดิม


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.