c:\ temp> tf folderdiff /?
TF - Team Foundation Version Control Tool
Copyright (c) Microsoft Corporation. All rights reserved.
Displays a visual representation of the differences between files in two server
folders, in a server folder and a local folder, or in two local folders.
tf folderdiff [sourcePath] targetPath [/recursive] [/noprompt]
[/server:serverName:port] [/filter:filter]
[/filterLocalPathsOnly]
[/view:same,different,sourceOnly,targetOnly]
C:\ TEMP> TF folderdiff 1 2/
===========================================================================
Items That Exist Only in C:\temp\1
===========================================================================
C:\temp\1\baz
===========================================================================
Items That Exist Only in C:\temp\2
===========================================================================
C:\temp\2\bar
===========================================================================
Show Items That Have Different Contents
===========================================================================
C:\temp\1\quux -
C:\temp\2\quux
===========================================================================
Summary: 1 folders, 4 files, 1 source, 1 target, 1 different, 0 with errors
===========================================================================
NOPROMPT編集:それは明らかではなかった場合、デフォルトのビューが異なるsourceOnly + targetOnly +です。両方のフォルダに同じ内容の "foo"という名前のファイルがありました。
私は、コマンドラインツール自体がAPIではないことを認識していますが、残念ながらここでは最適なオプションです。それ以外の場合は、自分でツリーをクロールする必要があります。バージョンコントロールAPIにはフォルダの差分はありません。あなたが得るのは、個々のアイテムを操作する15以上の混乱する方法です。
プラスの面では、比較したいすべてのファイルをチェックインする場合、コストのかかるディスクI/Oなしで計算を実行できます。 (TFSはすべてのファイルの内容のハッシュを格納します)。クイックPowerShellは、例:サーバー差分対ローカルサポートする必要がある場合
function Compare-TfsDir([string] $dir1, [string] $dir2, [switch] $includeEqual)
{
$dir1 = $dir1.ToLower()
$dir2 = $dir2.ToLower()
filter Decorate($dir)
{
$_ | add-member noteproperty RelativePath $_.ServerItem.ToLower().Replace($dir, "") -passthru |
add-member noteproperty HashString ($_.HashValue | %{ "{0:X2}" -f $_ } | join-string) -passthru
}
$items1 = $tfs.vcs.GetItems($dir1, $tfs.VCS_RecursionType::Full).Items | Decorate $dir1
$items2 = $tfs.vcs.GetItems($dir2, $tfs.VCS_RecursionType::Full).Items | Decorate $dir2
$dirComp = compare -IncludeEqual -Property RelativePath $items1 $items2
"---Tree Comparison---"
$dirComp | ? { $_.SideIndicator -ne "==" } | ft -auto RelativePath, SideIndicator
$both = $dirComp | ? { $_.SideIndicator -eq "==" } | % { $_.RelativePath } | Linq-ToSet
filter InBoth { if ($both.Contains($_.RelativePath)) {$_} }
$contentComp = compare -inc:$includeEqual -Property HashString, RelativePath `
($items1 | InBoth) ($items2 | InBoth)
"---Content Comparison---"
$contentComp | ? { $_.SideIndicator -ne "<=" } | ft -auto RelativePath, SideIndicator
}
残念ながら、このような何かを行うと、コードの行数として5Xを取るだろう。
コードが機能しません。例:linq-ToSetはコマンドレットではありません。 – pabrams