clearcase在父分支和子分支之间创建差异

时间:2013-12-18 17:49:14

标签: diff clearcase

因此,我在clearcase中的两个分支之间创建差异日志/补丁的典型方法是简单地创建两个视图并执行典型的unix差异。但我必须假设有更明确的方式(也是'1-liner')。

所以知道如何获取已在分支上修改的所有文件的列表:

cleartool find . -type f -branch "brtype(<BRANCH_NAME>)" -print

并且知道如何为两个单独的文件获取diff格式的输出:

cleartool diff FILE FILE@@/main/PARENT_BRANCH_PATH/LATEST

所以有人看到以下任何问题来获取分支中已更改的所有文件的差异吗?

cleartool find . -type f -branch "brtype(CHILD_BRANCH)" -exec 'cleartool diff -ser $CLEARCASE_PN `echo $CLEARCASE_XPN | sed "s/CHILD_BRANCH/LATEST/"` ' > diff.log

非常欢迎任何修改和评论

提前感谢!

更新:关于如何将其作为unix统一差异的任何想法也将非常感激。

update2:所以我认为我有我的解决方案,感谢VonC向我发送正确的方向:

cleartool find . -type f -branch "brtype(CHILD_BRANCH)" -exec 'cleartool get -to $CLEARCASE_PN.prev `echo $CLEARCASE_XPN | sed "s/CHILD_BRANCH/LATEST/"`; diff -u $CLEARCASE_PN.prev $CLEARCASE_PN; rm -f $CLEARCASE_PN.prev' > CHILD_BRANCH.diff

输出似乎有效,我可以通过kompare读取文件而无需投诉。

2 个答案:

答案 0 :(得分:2)

这个想法很合理。

我只需确保$CLEARCASE_PN$CLEARCASE_XPN与双引号一起使用,以考虑文件路径或文件名中的潜在空格(如“{{3所示) }}“)。

cleartool find . -type f -branch "brtype(CHILD_BRANCH)" -exec 'cleartool diff -ser "$CLEARCASE_PN" `echo "$CLEARCASE_XPN" | sed "s/CHILD_BRANCH/LATEST/"` ' > diff.log

使用-exec指令的简单引号是一个好主意,如“How do I list ClearCase versions without the Fully-qualified version?”中所述。


但是,CLEARCASE_XPN not parsed as variable in clearcase command,即使使用-ser-serial)选项,也不会产生完全 cleartool diff(或{{3简而言之。)

-diff_format)选项是最接近的,正如我在“Unix unified diff format”中提到的那样

  

-diff_format选项导致以UNIX和Linux diff实用程序的样式报告标头和差异,编写将要比较的第一个文件转换为第二个文件所需的更改列表。 / p>

一个想法是使用cleartool diff,但直接使用diff,因为它可以通过 {{在动态视图中访问正确的版本3}} 找到的元素。


Unified FormatHow would you measure inserted / changed / removed code lines (LoC)?与使用cleartool extended pathname的内容很接近:

cleartool find . -type f -branch "brtype(CHILD_BRANCH)" -exec 'cleartool get -to $CLEARCASE_PN.prev `echo $CLEARCASE_XPN | sed "s/CHILD_BRANCH/LATEST/"`; diff -u $CLEARCASE_PN.prev $CLEARCASE_PN; rm -f $CLEARCASE_PN.prev' > CHILD_BRANCH.diff 
  

输出似乎有效,我可以通过kompare读取文件而无需投诉。

多行,为了便于阅读:

cleartool find . -type f -branch "brtype(CHILD_BRANCH)" 
  -exec 'cleartool get -to $CLEARCASE_PN.prev 
           `echo $CLEARCASE_XPN | sed "s/CHILD_BRANCH/LATEST/"`; 
         diff -u $CLEARCASE_PN.prev $CLEARCASE_PN; 
         rm -f $CLEARCASE_PN.prev' > CHILD_BRANCH.diff 

答案 1 :(得分:2)

将答案从VonC和einpoklum转移到Windows,我想到了以下内容。创建一个单独的批处理文件,我称为diffClearCase.bat,这可以大大简化命令行。它为所有修改过的文件创建了一个单独的树,我个人很喜欢,但是以后可以删除文件和文件夹。

@echo off
SET PLAINFILE=%1
SET PLAINDIR=%~dp1
SET CLEARCASE_FILE=%2
SET BRANCH_NAME=%3
SET SOURCE_DRIVE=T:
SET TARGET_TEMP_DIR=D:
SET DIFF_TARGET_FILE=D:\allPatch.diff
call set BASE_FILE=%%CLEARCASE_FILE:%BRANCH_NAME%=LATEST%%
call set TARGET_FILE=%%PLAINFILE:%SOURCE_DRIVE%=%TARGET_TEMP_DIR%%%
call set TARGET_DIR=%%PLAINDIR:%SOURCE_DRIVE%=%TARGET_TEMP_DIR%%%
echo Diffing file %PLAINFILE%
IF NOT EXIST %TARGET_DIR% mkdir %TARGET_DIR%
cleartool get -to %TARGET_FILE% %BASE_FILE%
diff -u %TARGET_FILE% %PLAINFILE% >> %DIFF_TARGET_FILE%
rem del /F/Q %TARGET_FILE%

然后我创建了第二个bat文件,该文件仅将分支名称作为参数。在我们的例子中,该目录包含多个VOB,因此我遍历它们并按VOB进行操作。

@echo off
SET BRANCHNAME=%1
SET DIFF_TARGET_FILE=D:\allPatch.diff
SET SOURCE_DRIVE=T:
SET DIFF_TOOL=D:\Data\Scripts\diffClearCase.bat
IF EXIST %DIFF_TARGET_FILE% DEL /Q %DIFF_TARGET_FILE%
for /D %%V in ("%SOURCE_DRIVE%\*") DO (
    echo Checking VOB %%V
    cd %%V
    cleartool find %%V -type f -branch "brtype(%BRANCHNAME%)" -exec "%DIFF_TOOL% \"%%CLEARCASE_PN%%\" \"%%CLEARCASE_XPN%%\" %BRANCHNAME%"
)