ฉันจะดูการเปลี่ยนแปลงประวัติไฟล์ทั้งหมดใน SVN ได้อย่างไร


169

ฉันรู้ว่าฉันสามารถ svn diff -r a:b repo ดูการเปลี่ยนแปลงระหว่างการแก้ไขที่ระบุทั้งสองได้ สิ่งที่ฉันต้องการคือความแตกต่างสำหรับการแก้ไขทุกครั้งที่เปลี่ยนไฟล์ คำสั่งนั้นใช้ได้หรือไม่


16
มันซ่อนอยู่ในคำสั่ง "ตำหนิ" ที่มีชื่อแปลก ๆ
goosemanjack

6
ฉันคิดว่า @goosemanjack ล้อเล่นจนกว่าฉันจะลอง
SSH นี้

คำตอบ:


181

ไม่มีคำสั่งในตัวดังนั้นฉันมักจะทำสิ่งนี้:

#!/bin/bash

# history_of_file
#
# Outputs the full history of a given file as a sequence of
# logentry/diff pairs.  The first revision of the file is emitted as
# full text since there's not previous version to compare it to.

function history_of_file() {
    url=$1 # current url of file
    svn log -q $url | grep -E -e "^r[[:digit:]]+" -o | cut -c2- | sort -n | {

#       first revision as full text
        echo
        read r
        svn log -r$r $url@HEAD
        svn cat -r$r $url@HEAD
        echo

#       remaining revisions as differences to previous revision
        while read r
        do
            echo
            svn log -r$r $url@HEAD
            svn diff -c$r $url@HEAD
            echo
        done
    }
}

จากนั้นคุณสามารถโทรหาด้วย:

history_of_file $1

35
ฉันไม่เคยเห็นว่า "เคล็ดลับการบล็อกลงท่อ" เรียบร้อย

5
รุ่นไฟล์แบทช์ของสคริปต์นี้ fwiw
ภาระ

ฉันเพิ่มสิ่งนี้ลงในไฟล์. bashrc ของฉัน เมื่อฉันเริ่มฉันจะได้รับ svn: '.' is not a working copy svn: Syntax error in revision argument '@HEAD' svn: Syntax error in revision argument '@HEAD'
Francisc0

1
@ Francisco0: ไม่รวมบรรทัดสุดท้ายใน bashrc ของคุณ มันไม่ได้เป็นส่วนหนึ่งของคำจำกัดความของฟังก์ชั่น แต่เป็นการเรียกใช้ฟังก์ชันเนื่องจากตัวอย่างตามที่กำหนดมีไว้สำหรับใช้เป็นสคริปต์แบบสแตนด์อะโลน
bendin

26
svn log --diff [path_to_file]ทำงานตรงนี้! stackoverflow.com/a/24938573/3185510
เว็บสเตอร์

143

แตกต่างจากที่คุณอธิบายเล็กน้อย แต่ฉันคิดว่านี่อาจเป็นสิ่งที่คุณต้องการ:

svn blame filename

มันจะพิมพ์ไฟล์ที่มีแต่ละบรรทัดนำหน้าด้วยเวลาและผู้เขียนความมุ่งมั่นที่มีการเปลี่ยนแปลงครั้งสุดท้าย


4
โอ้โหนี่มันยอดเยี่ยม! ใช้ SVN มานานหลายปีแล้วและไม่เคยรู้เรื่องนี้: O
ใช่ Barry

4
คุณอาจต้องการตัวเลือก verbose / -v เพื่อดูการประทับเวลา (ฉันทำกับบิลด์เริ่มต้นของฉัน svn 1.7.9)
Weston C

อาจารย์ของฉันเขียนปลั๊กอินตำหนิเริ่มต้นไปที่ svn ฉันต้องดูมันนิ่ง ๆ เขากำลังเติมเต็มในงานนี้โดยสิ้นเชิง : P
Joseph Dailey

93

หากคุณต้องการดูประวัติทั้งหมดของไฟล์ที่มีการเปลี่ยนแปลงรหัส:

svn log --diff [path_to_file] > log.txt

3
ฉันไม่ทราบว่าเมื่อมีการเพิ่มตัวเลือก --diff แต่ทำงานได้กับ svn 1.8.10 ดังนั้นจึงไม่จำเป็นต้องใช้สคริปต์ทุบตี
Guillaume Gros

1
ผมคิดว่า SVN 1.7.4 แนะนำตัวเลือก--diffเพราะมันมีการทดสอบสำหรับตัวเลือกในขณะที่ 1.7.3 มีไม่มี subversion/tests/cmdline/log_tests.py-
ใช้ได้

เพียงบันทึกย่อขนาดเล็ก: ขึ้นอยู่กับความยาวของประวัติสิ่งนี้อาจใช้เวลาค่อนข้างนานก่อนที่ไฟล์ log.txt จะแสดงผลอย่างสมบูรณ์ (แม้ว่าจะสามารถอ่านได้ทันที)
Ivan Durst

1
หนึ่งจะ จำกัด สิ่งนี้ไปยังรุ่น X ล่าสุดได้อย่างไร
Enigma

@Enigma: พร้อม--limit <number>ตัวเลือก เช่นเดียวกับ:svn log --diff --limit 5 [path_to_file]
เรด

37

คุณสามารถใช้git-svnเพื่อนำเข้าพื้นที่เก็บข้อมูลลงพื้นที่เก็บข้อมูล Git git log -p filenameแล้วใช้ นี่แสดงแต่ละรายการบันทึกสำหรับไฟล์ตามด้วย diff ที่สอดคล้องกัน


27
ติดตั้ง git สร้างที่เก็บ git ใช้คำสั่ง git หรือไม่ คำถามถูกแท็กและถามเกี่ยวกับการโค่นล้ม
Ken Gentle

21
ฉันใช้ git เป็นไคลเอนต์การโค่นล้มกับ git-svn นี่คือวิธีที่ฉันจะทำการดำเนินการ log + diff กับที่เก็บ Subversion Git มีเครื่องมือที่ยอดเยี่ยมจริงๆสำหรับการดูที่เก็บมันไม่ใช่ความคิดที่แปลก
Greg Hewgill

10
เหนือสิ่งอื่นใดคือ (ถูกต้อง) แสดงความยินดีกับการเขียนสคริปต์ที่ดี - เพื่อมอบการทำงานที่ไม่มีใน SVN เมื่อเห็นว่าคอมไพล์อยู่ในพื้นที่เว้นแต่คุณจะกดคุณสามารถเรียกเครื่องมือนี้ได้โดยไม่จำเป็นต้องกังวลเกี่ยวกับสิ่งต่าง ๆ
Adam Tolley

นอกจากนี้ยังเป็นคำตอบเดียวที่ช่วยให้คุณใช้ GUI (ตัวเลือก) เพื่อดูประวัติไฟล์ คำตอบอื่น ๆ ยังไม่ได้อธิบายถึงวิธี จำกัด การแก้ไข X ล่าสุด (เป็นไปได้ทั้งหมดหรือไม่) ซึ่งง่ายในคอมไพล์ git log X..Y -o filename
TamaMcGlinn

21

เริ่มกับ

svn log -q file | grep '^r' | cut -f1 -d' '

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


4
หรือ ... ไปต่อ! svn log -q some_file.xxx | grep ^r | awk '{print $1}' | sed -e 's/^r//' | xargs -i svn diff -rHEAD:{} some_file.xxx > ~/file_history.txtความสุขเล็ก ๆ น้อย ๆ หนึ่งซับ (awk ไม่เหมือนกันเป็นตัด)
Kasapo

8

คำสั่ง "ตำหนิ" ที่มีชื่อแปลก ๆ ทำสิ่งนี้ หากคุณใช้ Tortoise จะให้กล่องโต้ตอบ "จากการแก้ไข" จากนั้นรายการไฟล์ที่มีตัวบ่งชี้บรรทัดตามบรรทัดของหมายเลขการแก้ไขและผู้เขียนถัดจากนั้น

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


1
มีประโยชน์มาก แต่ไม่ใช่สิ่งที่ OP กำลังมองหาซึ่งเป็นประวัติเต็มของไฟล์ไม่ใช่แค่การมีส่วนร่วมในอดีตของไฟล์ปัจจุบัน ประวัติเต็มนั้นมีประโยชน์เมื่อมองย้อนกลับไปหาสาเหตุที่ทำให้มีการลบหรือเปลี่ยนแปลงรหัสบางอย่างและเมื่อใด
Adam Tolley

ในทางตรงกันข้ามชื่อค่อนข้างถูก มันบอกให้คุณรู้ว่าใครควรตำหนิโค้ดอันใดอันหนึ่ง (เส็งเคร็ง / บั๊ก / ไม่สามารถเข้าใจได้)
ivan_pozdeev

จะดีหรือไม่ถ้าชื่อที่ชัดเจนสำหรับคำสั่งนั้นคือ "เครดิต" แทนที่จะเป็น "โทษ" :)
Nick

1
@Nick svn การสรรเสริญเป็นนามแฝงของ svn ตำหนิขึ้นอยู่กับความรู้สึก
stefgosselin

@stefgosselin - ขอบคุณสำหรับบันทึกย่อนั้น ฉันดีใจที่รู้ว่ามีตัวเลือก! :)
นิค

3

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


3

ขอบคุณ Bendin ฉันชอบทางออกของคุณมาก

ฉันเปลี่ยนให้ทำงานแบบย้อนกลับโดยแสดงการเปลี่ยนแปลงล่าสุดก่อน ซึ่งเป็นสิ่งสำคัญด้วยรหัสที่ยืนยาวดูแลรักษามานานหลายปี ฉันมักจะทำให้เป็นท่อมากขึ้น

svnhistory elements.py |more

ฉันเพิ่ม -r ในการจัดเรียง ฉันลบข้อมูลจำเพาะ การจัดการสำหรับ 'บันทึกแรก' มันจะผิดพลาดในรายการสุดท้ายเนื่องจากไม่มีอะไรจะแตกต่างด้วย แม้ว่าฉันจะอยู่กับมันเพราะฉันไม่เคยลงไปไกลขนาดนั้น

#!/bin/bash                                                                    

# history_of_file                                                              
#                                                                              
# Bendin on Stack Overflow: http://stackoverflow.com/questions/282802          
#   Outputs the full history of a given file as a sequence of                  
#   logentry/diff pairs.  The first revision of the file is emitted as         
#   full text since there's not previous version to compare it to.             
#                                                                              
# Dlink                                                                        
#   Made to work in reverse order                                              

function history_of_file() {
    url=$1 # current url of file                                               
    svn log -q $url | grep -E -e "^r[[:digit:]]+" -o | cut -c2- | sort -nr | {
        while read r
    do
            echo
            svn log -r$r $url@HEAD
            svn diff -c$r $url@HEAD
            echo
    done
    }
}

history_of_file $1

0

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

svn blame -v <filename>

เพื่อให้การค้นหาของคุณง่ายขึ้นคุณสามารถเขียนผลลัพธ์ไปยังไฟล์และ grep สำหรับสิ่งที่คุณกำลังมองหา

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