通过删除的文本查找svn修订

通过删除的文本查找svn修订,svn,search,revision,Svn,Search,Revision,有没有办法通过搜索文件中删除的文本字符串来查找SVN修订版?我知道要搜索的确切文本和要查找的文件,但有数百个修订版本。只是一个小bash脚本,它可以过滤掉更改的行…如果您将pom.xml更改为您的文件,可能会添加补充URL,您就有了所需的内容…(如果您使用的是类Unix系统)。将以下内容放入脚本文件(xyz.sh)并对输出进行筛选 #!/bin/bash REVISIONS=`svn log pom.xml -q|grep "^r" | cut -d"r" -f2 | cut -d" " -f1

有没有办法通过搜索文件中删除的文本字符串来查找SVN修订版?我知道要搜索的确切文本和要查找的文件,但有数百个修订版本。

只是一个小bash脚本,它可以过滤掉更改的行…如果您将pom.xml更改为您的文件,可能会添加补充URL,您就有了所需的内容…(如果您使用的是类Unix系统)。将以下内容放入脚本文件(xyz.sh)并对输出进行筛选

#!/bin/bash
REVISIONS=`svn log pom.xml -q|grep "^r" | cut -d"r" -f2 | cut -d" " -f1`
for rev in $REVISIONS; do
    svn blame -r$rev:$rev pom.xml | tr -s " " | grep -v " -\ \- "
done


xyz.sh | grep "Text you are searching for"
打印输出将类似于:

256 ......

256是修改过的版本。

基于khmarbaise的脚本,我提出了以下建议:

#!/bin/bash
file="$1"
REVISIONS=`svn log $file -q --stop-on-copy |grep "^r" | cut -d"r" -f2 | cut -d" " -f1`
for rev in $REVISIONS; do
    prevRev=$(($rev-1))
    difftext=`svn diff --old=$file@$prevRev --new=$file@$rev | tr -s " " | grep -v " -\ \- " | grep -e "$2"`
    if [ -n "$difftext" ]; then
        echo "$rev: $difftext"
    fi
done
在命令行上传递文件名和搜索字符串:

xyz.sh "filename" "text to search"
svn diff为我提供了添加和删除的版本;我把它留在这里,以防对任何人有用。上一次修订时有一条错误消息,我不知道如何消除(我还有很多bash需要学习:),但修订号是正确的。

我喜欢


文件的输出包含所有现有的和已删除的行,以便我可以在周围的上下文中看到已删除的行。

制作了一个简单的PHP版本的可接受答案,并在命令行上运行:

xyz.sh "filename" "text to search"

如果您不能或不想使用脚本:

svn log --diff [path_to_file] > log.txt
(路径到文件是可选的,如果不指定,它将包括当前文件夹和子文件夹中的所有文件)

在那里,您可以找到所有添加的行(以+)开头,所有删除的行(以-)和一些上下文行(以空格开头)。修改的行将以+显示,并以重复显示-

您可以使用任何合适的文本编辑器(如记事本++)、grep、脚本或任何您喜欢的工具来处理生成的文件

更新:

如果文件在历史记录的某个点被删除并再次添加,您可以执行以下操作在该点之前进行搜索:

  • 删除文件时的首次查找:
    • svn log-v[父文件夹路径]>logParent.txt
    • 在logParent.txt中搜索“D[文件路径]”
    • 对于找到的搜索修订(我们称之为[deleted revision]),减去1:[prev deleted revision]=[deleted revision]-1
    • svn日志--diff[path to file]@[prev deleted revision]>log.txt

您指的是您所做的更改还是日志消息中的文本?您可以使用svn日志URL/file,以便获得更改此文件的修订列表。使用svn-rRevision:Revision URL/file将打印出在修订版中已更改的行,并在其上显示一个grep(unix)以提供所需的信息…我指的是实际的文件更改,而不是日志消息。svn durum+grep几乎足够好了,但是更改是删除文本而不是添加文本,所以它没有显示在那里。我已经用澄清更新了问题;感谢khmarbaise.svn如果您添加行或删除行,则在这两种情况下都会显示行。如果您使用我在回答中建议的方式(svn dull-r Rev:Rev URL/file)。实际上,这显示了添加行时的Rev,而不是删除行时的Rev(dull不会为删除的行生成输出)。不过,你的建议仍然有帮助——事实证明,我要查找的文本根本没有添加到文件中。oops:)此脚本即使对于添加的字符串/文本也能很好地工作,因为它在svn diff上工作。感谢您的脚本。在
grep“^r”| cut-d“r”-f2 | cut-d”-f1中,您使用了三个进程;我会使用类似于
sed-ne'/^r/{s/^r/;s/*/;p}
的东西。我猜
tr-s“| grep-v”-\\\-”
不再与您从
svn
迁移相关,在那里它用来过滤掉未更改的行。因此,您的脚本还将打印具有给定单词的未更改的行,这些行与更改的行足够接近。您应该查找以
-
+
开头的行,即使用
grep“^[-+]”
进行筛选。这不会打印已删除的行,是吗?