2008-11-12 65 views
146

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. Những gì tôi muốn là một sự khác biệt cho mỗi sửa đổi đã thay đổi tập tin. Là một lệnh như vậy có sẵn?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

+16

Nó ẩn trong tên kỳ quặc "đổ lỗi" lệnh. – goosemanjack

+6

Tôi nghĩ @goosemanjack đang nói đùa, cho đến khi tôi thử nó. –

Trả lời

166

Không có built-in lệnh 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 [email protected] 
     svn cat -r$r [email protected] 
     echo 

#  remaining revisions as differences to previous revision 
     while read r 
     do 
      echo 
      svn log -r$r [email protected] 
      svn diff -c$r [email protected] 
      echo 
     done 
    } 
} 

Sau đó, bạn có thể gọi nó với:

history_of_file $1 
+32

Tôi chưa bao giờ thấy rằng "piping vào lừa khối" lừa trước. Khéo léo. –

+5

[Phiên bản tệp hàng loạt] (http://stackoverflow.com/questions/5622367/generate-history-of-changes-on-a-file-in-svn/5721533#5721533) của tập lệnh này, fwiw. – ladenedge

+0

Tôi đã thêm tệp này vào tệp .bashrc của mình. Khi tôi bắt đầu, tôi nhận được 'svn: '.' không phải là bản sao làm việc svn: Lỗi cú pháp trong đối số sửa đổi '@HEAD' svn: Lỗi cú pháp trong đối số sửa đổi '@ HEAD'' – Francisc0

36

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

+22

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

+17

Tôi sử dụng git làm ứng dụng 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 lưu trữ Subversion. Git có một số công cụ thực sự tuyệt vời để xem kho lưu trữ, nó không phải là một ý tưởng kỳ lạ như vậy. –

+6

Trên một người nào đó (đúng) chúc mừng viết một kịch bản hay - để cung cấp chức năng không có trong SVN. Thấy rằng git là địa phương, trừ khi bạn đẩy, bạn có thể gọi dụng cụ này, không cần phải nhận được tất cả khó chịu về mọi thứ. –

3

Theo như tôi biết không có lệnh svn được xây dựng để 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 diffs. Một cách tiếp cận đơn giản hơn là sử dụng một trình khách svn GUI nếu đó là một tùy chọn. Nhiều người trong số họ chẳng hạn 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 sự khác biệt của mỗi bản sửa đổi.

17

Bắt đầu với

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

Điều đó sẽ giúp bạn có được một danh sách các phiên bản mà tập tin đã thay đổi, sau đó bạn có thể sử dụng cho các cuộc gọi kịch bản lặp đi lặp lại để svn diff.

+4

hoặc ... tiếp tục! '' 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'' đẹp nhỏ một lót (awk không giống như cắt) – Kasapo

128

Hơi khác với những gì bạn mô tả , nhưng tôi nghĩ rằng đâ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 trước cố định theo thời gian và tác giả của cam kết thay đổi lần cuối.

+4

Điều này thật tuyệt vời! Được sử dụng SVN trong nhiều năm và không bao giờ biết về điều này: O –

+2

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

+0

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

8

Lệnh "đổ lỗi" được đặt 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 một hộp thoại "từ bản sửa đổi", sau đó một danh sách tệp với một dòng theo chỉ báo dòng của số sửa đổi và tác giả bên cạnh nó.

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

Thats 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 tin, không chỉ là những đóng góp lịch sử của tập tin hiện tại. Lịch sử đầy đủ đó hữu ích khi nhìn lại để tìm ra lý do tại sao một số mã nhất định bị xóa hoặc thay đổi và khi nào. –

+0

Ngược lại, tên khá đúng. Nó cho bạn biết ai để đổ lỗi cho một đoạn mã đặc biệt (crappy/buggy/uncomprehendable). –

+0

Nó sẽ không được tốt nếu tên rõ ràng cho lệnh là "tín dụng" hơn là "đổ lỗi"? :) – Nick

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ó để hoạt động theo thứ tự ngược lại, hiển thị những thay đổi gần đây nhất trước tiên. Điều quan trọng với mã đứng lâu, được duy trì trong vài năm. Tôi thường ống nó vào nhiều hơn.

svnhistory elements.py |more 

tôi thêm -r để phân loại. Tôi đã xóa thông số. xử lý cho 'kỷ lục đầu tiên'. Nó là nó sẽ lỗi ra trên mục nhập cuối cùng, vì không có gì để khác biệt với nó. Mặc dù tôi đang sống với nó bởi vì tôi không bao giờ đi xuống xa đến thế.

#!/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 [email protected] 
      svn diff -c$r [email protected] 
      echo 
    done 
    } 
} 

history_of_file $1 
74

Nếu bạn muốn xem toàn bộ lịch sử của một tập tin với những thay đổi mã:

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

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 một tập lệnh bash –

+1

Tôi nghĩ, svn 1.7.4 đã giới thiệu tùy chọn '--diff' từ nó có các thử nghiệm cho tùy chọn trong khi 1.7.3 không có gì cả - 'subversion/tests/cmdline/log_tests.py'. – valid

+0

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

Các vấn đề liên quan