SVN版本有没有办法通过搜索得到的文件中删除文本字符串找到一个SVN版本?我知道要搜索的确切文本和要查找的文件,但有数百个修订。找到删除的文本
找到删除的文本
回答
大厦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 [email protected]$prevRev [email protected]$rev | tr -s " " | grep -v " -\ \- " | grep -e "$2"`
if [ -n "$difftext" ]; then
echo "$rev: $difftext"
fi
done
传递文件名和搜索字符串命令行:
xyz.sh "filename" "text to search"
SVN差异给了我两种情况:它的转添加和删除的地方;如果对任何人都有用,我会把它留在这里。在最后一个版本中有一个错误消息,我不知道如何摆脱(我仍然有很多bash需要学习:)),但版本号是正确的。
这对我来说很好,谢谢! – 2012-09-27 09:55:45
这个脚本工作得很漂亮,即使是字符串/文本添加因为它在svn diff上工作。感谢您的脚本。 – 2013-01-30 11:40:03
在'grep“^ r”| cut -d“r”-f2 | cut -d“”-f1'你正在使用三个进程;我会用'sed -ne'/^r/{s/^ r //; s /。* //;代替。 – musiphil 2013-09-11 19:21:15
只是过滤掉,在修改行...如果你改变的pom.xml文件中加入一个小bash脚本可以带有附加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是其中的改变已作出的修订。
这不打印删除的行,是吗? – musiphil 2013-09-11 22:23:40
@musiphil正确。 – khmarbaise 2013-09-12 06:33:57
我喜欢blameall.py。
它的输出文件包含所有现有的和删除的行,这样我可以看到周围的情况下删除线。
<?php
$file = $argv[1];
$searchfor = $argv[2];
if (!$file) die('Please specify file name to search through as the first argument.');
if (!$searchfor) die('Please specify text to search for as the second argument.');
echo PHP_EOL .'Searching '. $file .' for: '. $searchfor . PHP_EOL . PHP_EOL;
$cmd = 'svn log '. $file .' -q';
$output = array();
exec($cmd, $output);
// Find all revisions
$all_revisions = array();
foreach ($output as $line) {
if (preg_match("/^r(\\d+) /", $line, $match)) {
$all_revisions[] = $match[1];
}
}
echo 'Checking '. count($all_revisions) .' revisions...'. PHP_EOL . PHP_EOL;
// Get diff for each revision
foreach ($all_revisions as $keykey => $rev) {
$prev_rev = $all_revisions[$keykey+1];
$cmd = 'svn diff --old='. $file .'@'. $prev_rev .' --new='. $file .'@'. $rev;
$output = array();
exec($cmd, $output);
// Check if string is present
$str = implode(PHP_EOL, $output);
if (strpos($str, $searchfor) !== false) {
echo 'Found in revision '. $prev_rev .' but removed from '. $rev .'.'. PHP_EOL;
break;
} else {
echo 'Not found in revision '. $rev .'.'. PHP_EOL;
}
}
echo 'Done.'. PHP_EOL;
运行该脚本使用以下命令脚本:
取得了公认的答案的一个简单的PHP版本,在命令行上运行
php scriptname.php "filetosearchthrough.php" "text to search for"
该脚本可能要进行微调,但要做你所需要的。请记住,搜索许多修订版本需要很长时间。
如果您不能或不想使用脚本:
svn log --diff [path_to_file] > log.txt
(在[文件路径]是可选的,如果不指定,这将包括所有文件当前文件夹和子文件夹)
在那里,你可以找到所有添加的行(他们首先+),全部去掉线(他们开始 - )和一些上下文行(他们开始用空格)。修改的行会出现与+并与重复 -
您可以处理与任何像样的文本编辑器(如记事本++)所生成的文件,grep的,脚本或者任何你喜欢的。
- 1. 找到指定文本后删除所有文本
- 2. Cleartool - 找到卸载/删除的文件
- 3. VBS脚本查找和删除文件
- 4. 查找文本并使用jQuery删除
- 5. 比较文本文件的两个版本,并找到Ruby的增加/删除?
- 6. 删除文本
- 7. 删除文本
- 8. 删除文本 -
- 9. 删除TinyMCE文本
- 10. 删除文本框
- 11. jQuery删除文本
- 12. JavaScript删除文本
- 13. 删除文本,Applescript
- 14. 找到阵副本,添加到原来的,然后删除
- 15. 查找文件删除
- 16. 添加文本到richbox没有删除
- 17. 找到文本文件中的特定字符串,然后删除
- 18. 删除文本文件
- 19. 删除文本文件
- 20. 删除上面我找到“删除”的行上的一行
- 21. 删除/清除打开文本文件
- 22. 如何删除TMemo控件中的文本所找到的一行?
- 23. 找到图像源删除不能删除的IE 7
- 24. 找到“string1”并删除它和“string2”之间的删除
- 25. 从复制文本中删除文本
- 26. 如何从“/”文本中删除文本?
- 27. Html 2文本 - 删除“隐藏”文本
- 28. 简单的删除文本脚本
- 29. Google Spreadsheets脚本删除任何找到字符串的行
- 30. 如何在Word中获取VBA宏以删除仅包含找到的文本的行,但不包含包含找到的文本和其他文本的行
您的意思是您所做的更改或日志消息中的文本?您可以使用svn日志URL /文件,以便获取修改文件的列表。使用svn blame -rRevision:修正URL /文件将打印出修订版本中已更改的行,并且将提供所需信息的grep(unix)... – khmarbaise 2010-04-29 08:59:12
我的意思是实际的文件更改,而不是日志消息。 svn blame + grep已经足够好了,但是改变是删除了文本而不是添加它,所以它没有出现在那里。我已经通过澄清更新了这个问题。感谢khmarbaise。 – 2010-04-29 09:16:26
如果添加一行或删除一行,svn blame将在两种情况下显示行。如果你使用我在我的回答中提出的方式(svn blame -r Rev:Rev URL/file)。 – khmarbaise 2010-04-29 09:25:56