Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Version control 如何搜索整个CVS存储库(所有分支/历史记录/注释)?_Version Control_Search_Cvs_Grep_History - Fatal编程技术网

Version control 如何搜索整个CVS存储库(所有分支/历史记录/注释)?

Version control 如何搜索整个CVS存储库(所有分支/历史记录/注释)?,version-control,search,cvs,grep,history,Version Control,Search,Cvs,Grep,History,如果我想从本质上grep存储库中的每一行,有没有办法?我知道这对于大型项目来说需要很长时间 如果不是全部,至少是当前分支及其整个源历史 编辑:我应该更明确一些如果我不能直接访问CVS存储库所在的服务器,该怎么办?因此我无法直接对包含CVS存储库的文件系统进行grep操作。这取决于您要查找的内容。CVS版本文件以明文形式包含对该文件所做的所有编辑。因此,如果您只是查找包含特定单词的所有文件,请在存储库上执行递归grep 如果要查找包含这些单词的特定版本,则必须从存储库中提取这些版本,这是非常昂贵的

如果我想从本质上grep存储库中的每一行,有没有办法?我知道这对于大型项目来说需要很长时间

如果不是全部,至少是当前分支及其整个源历史


编辑:我应该更明确一些如果我不能直接访问CVS存储库所在的服务器,该怎么办?因此我无法直接对包含CVS存储库的文件系统进行grep操作。

这取决于您要查找的内容。CVS版本文件以明文形式包含对该文件所做的所有编辑。因此,如果您只是查找包含特定单词的所有文件,请在存储库上执行递归grep


如果要查找包含这些单词的特定版本,则必须从存储库中提取这些版本,这是非常昂贵的。但是,如果您可以通过对存储库进行灰显来限制文件集,那么就没那么糟糕了。

如果不访问存储库,使用标准CVS工具是无法做到这一点的。第三方工具可能会做到这一点(我不知道有一个,尽管CS-CVS似乎是这样),但要以编程方式做到这一点,您必须在所有相关文件上做CVS日志,然后检索和搜索日志中CVS报告的每个版本(cvs日志是cvs中的一个命令行选项,它显示任何文件的修订历史记录,但不显示内容).

这是我最近使用的,在我无法访问服务器的情况下。当时它似乎可以工作。从工作副本中调用它,路径中有cvs。请注意,这不会搜索提交消息,但您只需grep“cvs日志”即可

#!/usr/bin/perl

# Searches CVS diffs and first revisions behind the current working
# directory for an expression (perlre syntax).

# Synopsis: cvsgrep [-n] <search-expression> [<file_1> ... <file_n>]

# -n means that contents of matching files should not be printed to stdout.

use Getopt::Std;

my %options=();
getopts("n",\%options);
my $no_content_dump=$options{"n"};

my $search_term=shift
    or die "Error: usage is: cvsgrep [-n] <search-expression>".
    " [<file_1> ... <file_n>]";

sub quote_fn
{
    my $fn=shift;
    $fn =~ s/\'/\'\"\'\"\'/g;
    "'".$fn."'";
}

my $args_str;
while(@ARGV)
{
    my $arg=shift;
    $args_str.=' ' if $args_str;
    $args_str.=&quote_fn($arg);
}

print 
    "Searching for term: $search_term",
    ($args_str?" in: $args_str":""),
    "\n";

open CVSLOGH,"cvs log -N $args_str|" or die "Cannot execute cvs log: $!";

my @files_revisions=();

my $cur_file;
my $cur_revision;

while(<CVSLOGH>)
{
    chop;
    if(/^Working file\:\s*(.*)$/)
    {
        $cur_file=$1;
        $cur_revision='';
    }
    elsif(/^revision\s+(.*)$/)
    {
        $cur_revision=$1;
    }
    elsif((/^\=\=\=\=/ || /^\-\-\-\-/) && $cur_revision)
    {
        push @files_revisions,{file=>$cur_file,rev=>$cur_revision};
    }
}

close CVSLOGH;

my $matchcount=0;
my $count=0;
my $progress_msg="Scanned %d out of %d commit(s)\r";
my $erase_ln=(" " x (length($progress_msg)+20)) . "\r";

foreach my $file_revision(@files_revisions)
{
    printf($progress_msg,$count++,scalar(@files_revisions));

    my($file,$rev) = ($file_revision->{file},$file_revision->{rev});

    $rev =~ /^(.*\.)([0-9]+)/;
    my $revbase=$1;
    my $revlastdigit=$2;
    my $rev1=$revbase.($revlastdigit - 1);
    my $diffcommand = "cvs diff -N -r $rev1 -r $rev ".&quote_fn($file);
    open CVSDIFFH,"$diffcommand|" or die "Cannot execute cvs diff: $!";

    my $diffresult;
    while(<CVSDIFFH>)
    {
        if(/^[\<\>]/)
        {
            s/^.//;
            $diffresult.=$_;
        }
    }
    close CVSDIFFH;

    if($diffresult =~ /$search_term/s)
    {
        print "${erase_ln}FOUND: in diff for $file $rev1:$rev\n";
        $matchcount++;
        system($diffcommand) unless $no_content_dump;
    }
}

print "${erase_ln}Done ($matchcount match(es)).\n";
!/usr/bin/perl
#搜索当前工作后的CV差异和第一次修订
#表达式的目录(perlre语法)。
#简介:cvsgrep[-n][…]
#-n表示匹配文件的内容不应打印到标准输出。
使用Getopt::Std;
我的%options=();
getopts(“n”,\%options);
我的$no_content_dump=$options{“n”};
我的$search\u term=shift
或“错误:用法为:cvsgrep[-n]”。
" [ ... ]";
分项报价(fn)
{
我的$fn=班次;
$fn=~s/\'/\'\'\'\'\'\'\'\'/g;
“““$fn。””;
}
我的$args_str;
while(@ARGV)
{
我的$arg=班次;
$args_str.=''如果$args_str;
$args_str.="e_fn($arg);
}
印刷品
“搜索术语:$search_term”,
($args_str?“$args_str”:“),
“\n”;
打开CVSLOGH,“cvs日志-N$args|u str |”或die“无法执行cvs日志:$!”;
我的@files_revisions=();
我的$cur_文件;
我的$cur_修订版;
while()
{
印章;
如果(/^工作文件\:\s*(.*)$/)
{
$cur_file=$1;
$cur_revision='';
}
elsif(/^revision\s+(.*)$/)
{
$cur_revision=$1;
}
elsif(/^\=\=\=\=/^-\-\-\-\-/)&&cur\u修订版)
{
推送@files\u revisions,{file=>$cur\u file,rev=>$cur\u revision};
}
}
闭合间隙;
我的$matchcount=0;
我的$count=0;
my$progress\u msg=“已扫描%d次,共提交%d次)\r”;
我的$erase\u ln=(“x(长度($progress\u msg)+20))。“\r”;
foreach my$file\u修订版(@files\u修订版)
{
printf($progress_msg,$count++,scalar(@files_revisions));
my($file,$rev)=($file\u revision->{file},$file\u revision->{rev});
$rev=~/^(.*\)([0-9]+)/;
我的$revbase=$1;
my$revlastdigit=$2;
my$rev1=$revbase($revlastdigit-1);
my$diffcommand=“cvs diff-N-r$rev1-r$rev”。"e\u fn($file);
打开CVSDIFFH,“$diffcommand |”或die“无法执行cvs diff:$!”;
我的$diffresult;
while()
{
如果(/^[\]/)
{
s/^./;
$DIFFERESULT.=$\u0;
}
}
关闭CVSDIFFH;
如果($diffresult=~/$search\u term/s)
{
打印“${erase\u ln}:在$file$rev1:$rev\n的差异中找到”;
$matchcount++;
系统($diffcommand),除非$no\u content\u dump;
}
}
打印“${erase_ln}Done($matchcount match(es))。\n”;

没有对存储库的访问权限是一件非常重要的事情,您不认为吗?但是,除非您使用的是pserver,或者您的IT部门已经做了很多工作,否则您可能有权访问存储库-只是访问不方便。请编辑您的问题并添加CVS/Root文件的内容(您可以在工作树中的任何目录中找到它)。如果您不想让人们了解您的网络,请将任何主机名引用替换为foo.example.com,如果需要,请替换目录名。但不要更改任何其他内容。抱歉,我不知道标准CVS设置是什么。我使用subversion已经很长时间了,上次使用CVS是在8年前。我正在使用我在主机上尝试了sshing,但没有成功。我将询问有关设置帐户的问题,因为这似乎是最好的方法。