如何查看SVN中文件的所有历史更改


169

我知道我可以 svn diff -r a:b repo 查看两个指定修订之间的更改。我想要的是更改文件的每个修订的差异。这样的命令可用吗?


16
它隐藏在一个奇怪的“怪”命令中。
goosemanjack

6
我以为@goosemanjack在开玩笑,直到尝试为止。
SSH

Answers:


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。
ladenedge 2011年

我将此添加到我的.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中包含最后一行。它不是函数定义的一部分,而是对函数的调用,因为给出的示例旨在用作独立脚本。
bentin

26
svn log --diff [path_to_file]完全像这样!stackoverflow.com/a/24938573/3185510
webster 2015年

143

与您描述的内容略有不同,但是我认为这可能是您实际需要的:

svn blame filename

它将打印文件,每行以时间和最后更改它的提交作者为前缀。


4
哇,真棒!多年来一直在使用SVN,但从未对此有所了解:O
是Barry

4
您可能需要verbose / -v选项才能查看时间戳(我使用svn 1.7.9的默认构建)。
韦斯顿C

我的教授将最初的责任插件写到了svn。我必须仍然查一下。他完全在完成这项任务。:P
Joseph Dailey 2014年

93

如果您想查看文件的完整历史记录并进行代码更改:

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

3
我不知道何时添加--diff选项,但它与svn 1.8.10兼容,因此不需要bash脚本
Guillaume Gros 2014年

1
我认为svn 1.7.4引入了该选项,--diff因为它已经对该选项进行了测试,而1.7.3则没有测试- subversion/tests/cmdline/log_tests.py
有效

请注意:根据历史记录的长度,这可能需要相当长的时间才能完全呈现log.txt文件(尽管可以立即读取)。
伊万·杜斯特

1
如何将其限制为最新的X版本?
Enigma

@Enigma:带有--limit <number>选项。像这样:svn log --diff --limit 5 [path_to_file]
Reid

37

您可以使用git-svn将存储库导入到Git存储库,然后使用git log -p filename。这显示了文件的每个日志条目,后跟相应的差异。


27
安装git,创建git存储库,使用git命令?该问题被标记并询问有关Subversion的问题。
Ken Gentle

21
我使用git作为git-svn的Subversion客户端。这就是我对Subversion存储库执行log + diff操作的方式。Git有一些非常好的存储库查看工具,这不是一个奇怪的想法。
Greg Hewgill

10
上面(正确地)有人祝贺您编写了一个不错的脚本-提供SVN中不存在的功能。除非您按下git,否则它是本地的,您可以调用此工具,而无需为所有事情烦恼。
亚当·托利

这也是唯一允许您使用GUI(可选)来查看文件历史记录的答案。其他答案也没有说明如何限制到最近的X版本(可能吗?),这在git中很容易。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漂亮的小
单线

8

名为“怪”的命令很奇怪。如果使用Tortoise,它将为您提供“来自修订版”对话框,然后是一个文件列表,其中逐行显示修订版号和作者。

如果右键单击修订信息,则可以打开一个“显示日志”对话框,该对话框提供完整的签入信息以及作为签入一部分的其他文件。


1
那很有用,但不是OP所要查找的内容,这是文件的完整历史记录,而不仅仅是当前文件的历史记录。当回想找出为什么删除或更改某些代码以及何时删除代码时,完整的历史记录很有用。
亚当·托利

相反,这个名字是正确的。它告诉您应归咎于特定的(糟糕/笨拙/难以理解的)代码块。
ivan_pozdeev

如果命令的明显名称是“贷方”而不是“责备”,那不是很好吗?:)
尼克

1
@Nick svn赞美是svn责备的别名,具体取决于人的感受。
stefgosselin

@stefgosselin-感谢您的来信。我很高兴知道有选择!:)
尼克

3

据我所知,没有内置的svn命令来完成此操作。您将需要编写脚本来运行多个构建所有差异的命令。如果可以的话,一种更简单的方法是使用GUI svn客户端。其中许多内容(例如Eclipse的颠覆性插件)将列出文件的历史记录,并允许您查看每个修订版本的差异。


3

谢谢,本丁 我非常喜欢您的解决方案。

我将其更改为以相反的顺序工作,首先显示了最新更改。这对于保持多年的长期代码很重要。我通常将其添加到更多内容中。

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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.