有什么方法可以使用带有cleartool / clearcase的自定义diff工具吗?

时间:2008-12-17 17:49:10

标签: diff clearcase cleartool

在clearcase快照视图中工作时,我想使用自己的diff。

据我所知,在运行“cleartool diff”时无法指定差异工具,因此我认为我可以运行类似“mydiff <predecessor file> <modified file in my view>”的内容,但我不知道我对ClearCase足够了解能够找到差异化的“前任文件”。

有什么办法吗?

忘了提到(直到现在,在阅读了处理windows的前两个回复之后),这是在Unix上,我不允许使用ClearCase配置。

11 个答案:

答案 0 :(得分:59)

如何更改默认差异工具

您可以在{c:\ program files \ rational \ ClearCase \ lib \ mgrs“

中按modifying the file map指定外部差异工具

Paul建议的WinMerge实际上修改了该文件。

每个地图行有3个部分:CC文件类型,CC操作和应用程序。

在map文件中找到text_file_delta文件类型的部分。你会在那里找到CC动作比较的行,xcompare,merge和xmerge,如下所示:

text_file_delta   compare          ..\..\bin\cleardiff.exe
text_file_delta   xcompare         ..\..\bin\cleardiffmrg.exe
text_file_delta   merge            ..\..\bin\cleardiff.exe
text_file_delta   xmerge           ..\..\bin\cleardiffmrg.exe

您可以使用executable of your diff tool choice替换它们。


或者,一个简单的差异脚本

如果你想对此进行全面的命令行(我喜欢;-)),一点ccperl可以提供帮助:

#!/bin/perl
my ($file, $switches) = @ARGV;
$switches ||= '-ubBw';

my ($element, $version, $pred) 
    = split(/;/,`cleartool describe -fmt '%En;%Vn;%PVn' $file`);

unless ($pred) { die "ctdiff: $file has no predecessor\n"; }

exec "mydiff $switches $element\@\@$pred $file";

警告:扩展路径名(@@\...)只能在动态视图中访问(M:\...,而不是快照视图(c:\...)。

该脚本与上面提到的map文件无关:

  • 该文件定义了“Type Merge Managers”。
  • 此脚本允许您在所需的任何文件上运行任何合并管理器,而无需读取任何映射文件以查找用于给定文件的正确的diff exe。

在这里,您向脚本提供了两个信息:文件(作为参数)和要运行的diff exe(在脚本实现中:用您想要的任何diff exe替换mydiff。)


或者,改进的diff脚本(也适用于静态/快照视图)

以下是此脚本的一个版本,适用于快照和动态视图。

对于快照视图,我使用chacmool的建议:cleartool get

同样,您可以使用您选择的工具替换此脚本中包含的diff命令。

#!/bin/perl
my ($file, $switches) = @ARGV;
$switches ||= '-u';

my ($element, $version, $pred) 
    = split(/;/,`cleartool describe -fmt '%En;%Vn;%PVn' $file`);

unless ($pred) { die "ctdiff: $file has no predecessor\n"; }

# figure out if view is dynamic or snapshot
my $str1 = `cleartool lsview -long -cview`;
if($? == 0) { dodie("pred.pl must be executed within a clearcase view"); }
my @ary1 = grep(/Global path:/, split(/\n/, $str1));
if($str1 =~ /View attributes: snapshot/sm) { $is_snapshot = 1; }

my $predfile = "$element\@\@$pred";
$predfile =~ s/\'//g;#'
#printf("$predfile\n");
if ($is_snapshot) { 
  my $predtemp = "c:\\temp\\pred.txt";
  unlink($predtemp);
  my $cmd = "cleartool get -to $predtemp $predfile"; printf("$cmd\n");
  my $str2 = `$cmd`;
  $predfile = $predtemp;
}
sub dodie {
    my $message = $_[0];
    print($message . "\n");
    exit 1;
}

exec "diff $switches $predfile $file";

答案 1 :(得分:6)

另一种选择是使用Git+ClearCase(或参见thisthis),然后使用Git进行差异化。

这非常容易设置,根据我的经验,一次使用两个VCS系统实际上会伤害你的大脑,而不是试图将CC打成21世纪的工具。

想想Git是CC和差异之间的桥梁: - )

答案 2 :(得分:5)

似乎有人已经在snip2code上考虑过它了! 这里有一个tcsh bash脚本,它可以完全满足您的需求。

Custom-diff-tool-for-clearcase-object

正如您所看到的,以下是获取给定文件的先前版本的关键代码:

cleartool descr -pred -short $1

其中$1是要比较的文件名。


#!/bin/tcsh -e
set _CLEARCASE_VIEW = `cleartool pwv -short -setview`
echo Set view: "$_CLEARCASE_VIEW"
set my_firstversion = ""
set my_secondversion = ""
set my_difftool = kdiff3

# check clearcase view
if ( "$_CLEARCASE_VIEW" == "** NONE **" ) then
  echo "Error: ClearCase view not set, aborted."
  exit -1
endif

if ( "$1" == "" ) then
  echo "Error: missing 1st file argument!"
  echo "Eg: `basename $0` file1.txt -> This will diff file1.txt with its previous version"
  echo "Eg: `basename $0` file1.txt file2.txt -> This will diff file1.txt and file2.txt"
  exit -1
endif  

set my_firstversion = "$1"
echo "my_firstversion=$my_firstversion"

if ( "$2" == "" ) then
  echo "No 2nd file passed, calculating previous version of $my_firstversion"
  set my_secondversion = $my_firstversion@@`cleartool descr -pred -short $my_firstversion`
else
  echo "Setting 2nd file to $2"
  set my_secondversion = "$2"
endif
echo "my_secondversion=$my_secondversion"

${my_difftool} ${my_firstversion} ${my_secondversion} &

答案 3 :(得分:4)

Kdiff3已内置集成。打开工具 - 转到设置 - &gt;配置 - &gt;集成并单击“与ClearCase集成”按钮。该工具具有出色的3路差异支持,可处理UTF-8,通过这种自动集成,您无需担心地图文件中的元素类型等。

答案 4 :(得分:3)

根据这里的建议,我有另一种工作方式。我发现了cleartool“get”命令,因此我执行此命令将以前的版本转换为临时文件:

cleartool get -to fname.temp fname @@ predecessor

然后运行我的差异,并删除该文件。

感谢所有建议。

答案 5 :(得分:3)

这是关于更改ClearCase XML diff工具的IBM文档的链接:

更改XML差异/合并类型管理器

http://www-01.ibm.com/support/docview.wss?rs=984&uid=swg21256807

答案 6 :(得分:1)

您可以尝试使用this trick

  1. 创建一个空文件

    % touch empty

  2. 检索版本A

    % cleartool diff -ser empty File@@/main/28 > A

  3. 检索版本B

    % cleartool diff -ser empty File@@/main/29 > B

  4. 差异&amp;利润!

    % your-diff-here A B

  5. 将它放在一个脚本中,使选项更加灵活,你就拥有它。

    如果你想要,你可以轻松地用一点awkcutperl或你选择的毒药来剪掉cleartool diff crud。

    Hooray for ClearCase!

答案 7 :(得分:0)

我安装了“WinMerge”(一个免费的差异工具),它将自己安装为clearcase diff工具。我不确定它是怎么做到的。

答案 8 :(得分:0)

如上所述,WinMerge会自动检测ClearCase的安装,并在Clearcase安装路径中修改映射文件。

我遇到过问题,ClearCase会打开自己的差异工具,因为WinMerge安装并没有改变所有必需的订单项。所以阅读ClearCase的文档是个好主意,这样你就可以根据需要手动修复它。

答案 9 :(得分:0)

对我而言,这很有效:

%vimdiff my_file.c my_file.c@@/main/LATEST

答案 10 :(得分:0)

我通常会这样做。

统一差异 cleartool diff -pred <my file>

对于图形差异 cleartool diff -pred -g <my file>