在ClearCase中,我该如何从命令行查看静态视图中文件的旧版本?

17
如何在静态视图中查看旧版本的文件?
给定一个空文件(在本例中称为empty),我可以通过曲线救国的方式使用diff命令来显示旧版本:
    % cleartool diff -ser empty File@@/main/28
这感觉像是一种相当丑陋的方法。我错过了更基本的命令吗?有没有更简便的方法呢?
(我不想编辑配置规范 - 那太繁琐了,而我正试图查看一堆旧版本。) 澄清:我想将文件的版本发送到标准输出, 以便我可以在Unix系统下使用其他工具,例如grep, sed等。如果您发现这个问题是因为您正在寻找将元素的版本保存到文件的方法,请参见Brian's answer

在这里讨论的是CC相关的编程内容 - shoosh
5个回答

15

我正在尝试查看一堆旧版本。

我不确定你是在谈论一个文件的“一堆旧版本”,还是来自“多个”文件的“一堆旧版本”。

要可视化一个文件的几个旧版本,最简单的方法是显示其版本树 (ct lsvtree -graph File),然后选择一个版本,右键单击它并将其“发送到”接受多个文件的编辑器(例如Notepad++)。通过几次点击,您将可以查看这些旧版本。
注意:您必须拥有CC6.0或7.0.1 IFix01 (7.0.0和7.0.1无法将文件“发送到”,并显示以下错误消息:“Access to unnamed file was denied”)

但是,要可视化不同文件的几个旧版本,则建议使用动态视图并编辑该视图的配置规范(而不是您当前使用的快照视图),以便快速选择所有那些旧文件(希望通过简单的选择规则如“element * aLabel”)。


[来自评论:]

如何用惯用法“cat”一个文件的早期版本?

惯用的方法是通过一个动态视图(您需要使用与现有快照视图完全相同的配置规范来配置它)。

然后,您可以浏览(如“更改目录到”)文件的各种扩展路径

如果要 cat 一个文件分支的所有版本,则进入:

cd /view/MyView/vobs/myVobs/myPath/myFile@@/main/[...]/maBranch
cat 1
cat 2
...
cat x

'1', '2', ... 'x' 分别代表该分支下文件的版本号,从1到x。


对于“快照视图”,无法访问“扩展路径”,因此您的“hack”方式是可行的。

不过,在这里有两点需要注意:

  • 要快速显示给定分支中快照文件的所有先前修订版本,您可以键入:

(适用于复制粘贴的单行版本,Unix 语法:)

cleartool find addon.xml -ver 'brtype(aBranch) && !version(.../aBranch/LATEST) && ! version(.../aBranch/0)' -exec 'cleartool diff -ser empty "$CLEARCASE_XPN"'

(适用于可读性更好的多行版本:)

cleartool find addon.xml -ver 'brtype(aBranch) && 
                             !version(.../aBranch/LATEST) && 
                             ! version(.../aBranch/0)' 
                     -exec 'cleartool diff -ser empty "$CLEARCASE_XPN"'
  • 您可以使用以下命令更快地获得输出:

(适用于复制粘贴的单行版本,Unix 语法:)

cleartool find addon.xml -ver 'brtype(aBranch) && !version(.../aBranch/LATEST) && ! version(.../aBranch/0)' -exec 'cleartool diff -ser empty "$CLEARCASE_XPN"' | ccperl -nle '$a=$_; $b = $a; $b =~ s/^>+\s(?:file\s+\d+:\s+)?//g;print $b if $a =~/^>/'

(适用于可读性更好的多行版本:)

cleartool find addon.xml -ver 'brtype(aBranch) && 
                             !version(.../aBranch/LATEST) && 
                             ! version(.../aBranch/0)'
          -exec 'cleartool diff -ser empty "$CLEARCASE_XPN"' 
| ccperl -nle '$a=$_; $b = $a; $b =~ s/^>+\s(?:file\s+\d+:\s+)?//g;print $b if $a =~/^>/'
$b =~ s/^>+\s(?:file\s+\d+:\s+)?//g; 如果 $a 以 '>' 开头,就打印出 $b。

这样做输出的效果会更好。


"cleartool get" 命令(man page) 在此下面提到 ,由 Brian 提供,不会输出到 stdout:

get 命令仅将文件元素复制到视图中。

在 UNIX 或 Linux 系统上,将 /dev/hello_world/foo.c@@/main/2 复制到当前目录。

cmd-context get –to foo.c.temp /dev/hello_world/foo.c@@/main/2
在Windows系统中,将\dev\hello_world\foo.c@@\main\2复制到C:\build目录中。
cmd-context get –to C:\build\foo.c.temp \dev\hello_world\foo.c@@\main\2

所以说,通过将结果导入到 cat(或者在 Windows 中是type)中,你就可以对该命令的输出做一些处理。

cmd-context get –to C:\build\foo.c.temp \dev\hello_world\foo.c@@\main\2 | type C:\build\foo.c.temp 

谢谢,但我需要在命令行上执行它(主机是Unix,通过我们缓慢的网络链接无法使用X GUI)。通过“一堆旧版本”,我试图查看各个修订版之间的变化,因此有许多文件和许多修订版。 - Matt Curtis
编辑配置规范似乎是绕了一个大弯路(当我只有一行代码时)。我想我想问的是:如何以惯用方式“cat”文件的早期版本? - Matt Curtis
我刚刚更新了我的答案。请查看并留下评论,如果还不够好的话。 - VonC
是的,这对我来说看起来像是一个明确的答案。(我想我会在静态视图中坚持使用 "diff" hack。) 谢谢 VonC。 - Matt Curtis

13

我知道这是一个老线程......但我不能让这个争论不解决....

静态视图有一个 "ct get" 命令,正好可以满足您的要求。

cleartool get -to ~/foo File@@/main/28

这将保存文件的版本至~/foo


啊!太完美了。我不知道为什么错过了这个(费尽心思,是在ClearCase 6中吗?)。不管怎样,答案已被接受!谢谢Brian。我稍微编辑了一下你的答案并附上了一个使用示例。 - Matt Curtis
实际上,抱歉Brian,我取消了您的答案并将其退回给VonC。不幸的是,虽然它可以让您将元素的版本保存到文件中,但仅仅获取文件的内容却很棘手,因为它不能与stdout(/dev/fd/1)一起使用;cleartool会报告“目标路径名已经存在”。 - Matt Curtis
@VonC 好棒的答案整理工作。我刚刚意识到我已经接受了你的答案但没有点赞。所以在两年多之后给你点了个赞 :) 话说,有点遗憾的是CC(至少CC7)不允许将get输出到标准输出。组合规则(http://www.faqs.org/docs/artu/ch01s06.html#id2877684)是一件美妙的事情。 - Matt Curtis

2

[基于第一个评论进行重写]

Clearcase中的所有文件,包括版本,都可以在虚拟目录结构中找到。我对静态视图不是很熟悉,但我认为它们仍然通过虚拟文件系统进行操作,只是更新方式有所不同。

在这种情况下,您只需要执行以下操作:

   cat File@@/main/28

如果您还需要找到包含该文件元素的目录的正确版本,情况可能会变得很糟糕。我们在工作中使用一个PERL脚本来分析对文件所做的历史更改,并且我们很快就在Windows的命令行空间上用完了实际运行命令的空间!


我不想比较版本之间的差异,我只想查看以前的一个版本(不一定是直接的前身)。我只使用diff是因为它是我知道的唯一一个可以查看完整版本的单个命令。我真正想要的是像“cleartool cat”这样的东西(据我所知并不存在)。 - Matt Curtis
谢谢Chris。虚拟目录结构在静态视图中不存在(据我所知)。我猜答案是:在单行的静态视图中没有更干净的方法...关于Perl脚本的故事很有意思,似乎大多数ClearCase商店都有一堆必要的“支持脚本” :) - Matt Curtis
@Matt,你说得对,扩展路径无法直接从快照视图中访问。但是我已经更新了我的答案,以便从快照视图中获得先前文件版本的更清晰输出。 - VonC

1
如果文件是Clearcase元素,并且cat File可以正常工作,并且视图设置正确,则尝试:
cat File@@/main/28

(注:如果您已经在视图中,则不需要ct shell。)
尝试输入:
ct ls -l File

如果它显示的文件具有类似于上面的扩展名,则您应该能够使用扩展名 cat 文件。

1
在静态视图下不正确(在问题中多次提到)。 - Matt Curtis

-1

ct shell cat File@@version


似乎不起作用,我收到了这个错误: cat:File@@/main/28:没有那个文件或目录 - Matt Curtis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接