Làm cách nào tôi có thể xem tất cả các thay đổi lịch sử đối với một tệp trong SVN


169

Tôi biết rằng tôi có thể svn diff -r a:b repo xem các thay đổi giữa hai phiên bản được chỉ định. Điều tôi muốn là một khác biệt cho mọi sửa đổi đã thay đổi tệp. Là một lệnh như vậy có sẵn?


16
Nó ẩn trong lệnh "đổ lỗi" kỳ lạ.
goosemanjack

6
Tôi nghĩ rằng @goosemanjack đã nói đùa, cho đến khi tôi thử nó.
SSH này vào

Câu trả lời:


181

Không có lệnh tích hợp cho nó, vì vậy tôi thường chỉ làm một cái gì đó như thế này:

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

Sau đó, bạn có thể gọi nó bằng:

history_of_file $1

35
Tôi chưa bao giờ thấy rằng thủ thuật "đường ống vào khối giằng" trước đây. Khéo léo.

5
Phiên bản tập tin hàng loạt của tập lệnh này, fwiw.
ladenedge

Tôi đã thêm nó vào tập tin .bashrc của tôi. Khi tôi khởi nghiệp, tôi nhận được svn: '.' is not a working copy svn: Syntax error in revision argument '@HEAD' svn: Syntax error in revision argument '@HEAD'
Francisc0

1
@ Francisco0: không bao gồm dòng cuối cùng trong bashrc của bạn. nó không phải là một phần của định nghĩa hàm, nó là một lời gọi đến hàm vì ví dụ như được đưa ra được sử dụng như một tập lệnh độc lập.
uốn cong

26
svn log --diff [path_to_file]hoạt động chính xác như thế này! stackoverflow.com/a/24938573/3185510
webster

143

Hơi khác với những gì bạn mô tả, nhưng tôi nghĩ đây có thể là những gì bạn thực sự cần:

svn blame filename

Nó sẽ in tệp với mỗi dòng có tiền tố theo thời gian và tác giả của cam kết cuối cùng đã thay đổi nó.


4
Whoa này thật tuyệt! Đã sử dụng SVN trong nhiều năm và chưa bao giờ biết về điều này: O
Có Barry

4
Bạn có thể cần tùy chọn verbose / -v để xem dấu thời gian (tôi thực hiện với bản dựng svn 1.7.9 mặc định của mình).
Weston C

giáo sư của tôi đã viết các plugin đổ lỗi ban đầu cho svn. Tôi đã phải tìm kiếm điều này vẫn còn. Anh ấy hoàn toàn tự làm trong nhiệm vụ này. : P
Joseph Tweetsey

93

Nếu bạn muốn xem toàn bộ lịch sử của một tệp có thay đổi mã:

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

3
Tôi không biết khi nào tùy chọn --diff đã được thêm nhưng nó hoạt động với svn 1.8.10, vì vậy không cần tập lệnh bash
Guillaume Gros

1
Tôi nghĩ rằng, svn 1.7.4 đã giới thiệu tùy chọn --diffvì nó có các thử nghiệm cho tùy chọn trong khi 1.7.3 không có - subversion/tests/cmdline/log_tests.py.
hợp lệ

Chỉ cần một lưu ý nhỏ: tùy thuộc vào độ dài của lịch sử, việc này có thể mất khá nhiều thời gian trước khi tệp log.txt hoàn toàn được hiển thị (mặc dù nó sẽ có thể đọc được ngay lập tức).
Ivan Durst

1
Làm thế nào để giới hạn điều này với các phiên bản X gần đây nhất?
Enigma

@Enigma: với --limit <number>tùy chọn. Giống như vậy:svn log --diff --limit 5 [path_to_file]
Reid

37

Bạn có thể sử dụng git-svnđể nhập kho lưu trữ vào kho Git, sau đó sử dụng git log -p filename. Điều này cho thấy mỗi mục nhật ký cho tệp theo sau là khác.


27
Cài đặt git, tạo kho git, sử dụng lệnh git? Câu hỏi đã được gắn thẻ và hỏi về Subversion.
Ken Gentle

21
Tôi sử dụng git như một máy khách Subversion với git-svn. Đây là cách tôi sẽ thực hiện thao tác log + diff đối với kho Subversion. Git có một số công cụ thực sự tuyệt vời để xem kho lưu trữ, đó không phải là một ý tưởng kỳ quặc.
Greg Hewgill

10
Ở trên ai đó là (đúng) chúc mừng vì đã viết một kịch bản hay - để cung cấp chức năng không có trong SVN. Thấy git là cục bộ trừ khi bạn đẩy, bạn có thể gọi công cụ này, không cần phải khó chịu về mọi thứ.
Adam Tolley

Đây cũng là câu trả lời duy nhất cho phép bạn sử dụng GUI (tùy chọn) để xem lịch sử của tệp. Các câu trả lời khác cũng chưa giải thích làm thế nào để giới hạn các phiên bản X cuối cùng (có thể là gì?), Điều này dễ dàng trong git. git log X..Y -o filename
TamaMcGlinn

21

Bắt đầu với

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

Điều đó sẽ giúp bạn có một danh sách các bản sửa đổi trong đó tệp đã thay đổi, sau đó bạn có thể sử dụng để kịch bản các cuộc gọi lặp lại svn diff.


4
hoặc ... tiếp tục đi! 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.txtmột miếng lót nhỏ xinh (awk cũng giống như cắt)
Kasapo

8

Lệnh "đổ lỗi" có tên kỳ quặc thực hiện điều này. Nếu bạn sử dụng Rùa, nó sẽ cung cấp cho bạn hộp thoại "từ sửa đổi", sau đó liệt kê tệp có chỉ báo từng dòng của số Sửa đổi và tác giả bên cạnh.

Nếu bạn nhấp chuột phải vào thông tin sửa đổi, bạn có thể hiển thị hộp thoại "Hiển thị nhật ký" cung cấp thông tin đăng ký đầy đủ, cùng với các tệp khác là một phần của đăng ký.


1
Đó là rất hữu ích, nhưng không phải những gì OP đang tìm kiếm, đó là một lịch sử đầy đủ của tệp, không chỉ là những đóng góp lịch sử của tệp hiện tại. Lịch sử đầy đủ đó rất hữu ích khi nhìn lại để tìm hiểu lý do tại sao một số mã nhất định bị xóa hoặc thay đổi và khi nào.
Adam Tolley

Trái lại, cái tên khá đúng. Nó cho bạn biết ai sẽ đổ lỗi cho một đoạn mã cụ thể (crappy / buggy / không thể hiểu được).
ivan_pozdeev

Sẽ không tốt nếu tên rõ ràng của lệnh là "tín dụng" chứ không phải là "đổ lỗi"? :)
Nick

1
@Nick svn khen ngợi là một bí danh để svn đổ lỗi, tùy thuộc vào cảm giác của một người.
stefgosselin

@stefgosselin - Cảm ơn bạn đã lưu ý. Tôi rất vui khi biết có một sự lựa chọn! :)
Nick

3

Theo tôi biết, không có lệnh svn tích hợp để thực hiện việc này. Bạn sẽ cần phải viết một kịch bản để chạy một số lệnh để xây dựng tất cả các khác biệt. Một cách tiếp cận đơn giản hơn sẽ là sử dụng máy khách GUI svn nếu đó là một tùy chọn. Nhiều trong số chúng như plugin lật đổ cho Eclipse sẽ liệt kê lịch sử của một tệp cũng như cho phép bạn xem độ lệch của mỗi lần sửa đổi.


3

Cảm ơn, Bendin. Tôi thích giải pháp của bạn rất nhiều.

Tôi đã thay đổi nó để làm việc theo thứ tự ngược lại, hiển thị hầu hết các thay đổi gần đây đầu tiên. Điều này rất quan trọng với mã lâu dài, được duy trì trong nhiều năm. Tôi thường ống nó vào nhiều hơn.

svnhistory elements.py |more

Tôi đã thêm -r vào loại. Tôi loại bỏ spec. xử lý cho 'hồ sơ đầu tiên'. Đó là lỗi sẽ xuất hiện ở mục cuối cùng, vì không có gì khác với nó. Mặc dù tôi đang sống với nó bởi vì tôi không bao giờ đi quá xa.

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

Tôi đã thấy một loạt các câu trả lời một phần trong khi nghiên cứu chủ đề này. Đây là những gì làm việc cho tôi và hy vọng nó sẽ giúp đỡ người khác. Lệnh này sẽ hiển thị đầu ra trên dòng lệnh, hiển thị số sửa đổi, tác giả, dấu thời gian sửa đổi và các thay đổi được thực hiện:

svn blame -v <filename>

Để làm cho tìm kiếm của bạn dễ dàng hơn, bạn có thể viết đầu ra vào một tệp và grep cho những gì bạn đang tìm kiếm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.