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

我知道我可以通过 svn diff -r a:b repo 查看两个指定修订版之间的变化。我想要的是每一个修订,修改了文件的差异。有这样的命令吗?

206617 次浏览

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

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

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

这将为您提供文件更改的修订列表,然后您可以使用该列表编写对 svn diff的重复调用脚本。

它没有内置的命令,所以我通常只是这样做:

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

和你描述的略有不同,但我认为这可能是你真正需要的:

svn blame filename

它将打印文件,其中每一行前缀为上次更改该文件的提交时间和作者。

命名奇怪的“怪罪”命令就是这样做的。如果你使用 Tortoise,它会给你一个“从修订”对话框,然后是一个文件列表,旁边一行一行地显示修订号和作者。

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

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

我按相反的顺序修改了它,首先显示了最近的变化。这对于维护多年的长期代码来说非常重要。我通常会把它插入更多的管道。

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

如果希望查看具有代码更改的文件的整个历史记录:

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

在研究这个话题时,我看到了一些不完整的答案。这对我很有效,希望它能帮助到其他人。该命令将在命令行上显示输出,显示修订号、作者、修订时间戳和所做的更改:

svn blame -v <filename>

为了使搜索更加容易,您可以将输出写入文件,然后对要查找的内容进行 grep。