【问题标题】:Explaining tf diff解释 tf 差异
【发布时间】:2014-10-27 22:27:33
【问题描述】:

使用 Visual Studio 2008 工具,

我正在尝试获取更改集 14318 和 14317 的 ASCII 差异。

我可以使用 GUI 来做到这一点:

tf changeset 14318

然后选择一个文件并右键单击并选择与以前的版本比较。但是,这有点乏味,而且它是基于 GUI 的。我手头的任务是将许多更改反向移植到不同的分支中。我想自动化测试(比如使用 Python),确保我做对了。好吧,出于教育目的,我将在不查看解决方案的情况下手动进行所有更改,然后我将比较两个更改并尝试寻找任何差异。以下是我对 tf 的喜爱——我可以输入:

tf changeset 14318 > out.txt&&notepad out.txt

查看受影响文件的详细信息。

同样,我希望得到一个 out.txt,其中保存了所有差异。我很确定我可以处理 Python 部分。我当然想知道如何使用 tf.exe 工具来完成它,但如果您也碰巧知道完成此操作的其他技巧(一些很酷的 3rd 方工具或 PowerShell 脚本,那么也请告诉我)。

谢谢!

哦,顺便说一句,我检查了这个:http://msdn.microsoft.com/en-us/library/6fd7dc73(VS.80).aspx

我试过这个:

tf diff 14318 14317

我收到此错误:文件(或文件夹)c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\14318 不存在。

现在谢谢你。

编辑:是否有任何工具可以做到这一点?

【问题讨论】:

  • 你为什么说“我可以使用 GUI 做到这一点:tf changeset 14318”?? tf.exe 是命令行,而不是 GUI。

标签: visual-studio-2008 tfs diff tf-cli


【解决方案1】:

你只是在调用它时没有使用正确的语法。在这种情况下,它尝试在您的工作副本和基本存储库版本(不存在的)文件1431814317 之间进行比较。

您需要做的是使用/version 中的变更集范围,如下所示:

tf diff $/Foo /version:C14317~C14318 /recursive /format:unified > foo.diff

请注意,您可以将~ 与任何其他版本规范(标签、日期等)一起使用。有关详细信息,请参阅here

【讨论】:

  • 谢谢!我将如何对当前版本(本地)和最新版本或未修改版本进行比较?非常感谢!
  • Pavel,由于某种原因,该命令在我身上运行得非常缓慢。 /recursive 选项也会减慢它的速度。有很多代码。我该如何加快速度?从理论上讲,如果我同时指定两者,变更集编号应该是我需要的一切。我认为这就像字典查找一样 - 例如快。
  • 如果没有/recursive,您将只能获得目录本身的差异。如果那里有很多代码,我希望它运行缓慢,因为它几乎必须对树中的每个文件进行比较。是的,我希望它能够对变更集编号进行快速字典查找,然后将其乘以 N 个文件,它可能不再那么快了......
  • TFS2010 肯定不会进行字典查找——我有一个更改集更改了 4 个文件(该目录中有数千个未更改的文件),此命令大约需要 30 秒。
  • 在 TFS2012 中似乎没有改进。 tf.exe 无法在我们约 7GB 的文件上使用,需要很长时间。自从我开始 diff 已经有几个小时了,我仍在等待第一行输出出现......
【解决方案2】:

这是一个 PowerShell (V2) 脚本,从 Pavel 的答案扩展而来,这将更加高效,因为我们找到了已更改的文件,然后让 tf 单独区分它们:

Write-Host "Checking if TFS snap-in has been added..." -ForegroundColor green

# Find all TFS snapins.
$snapins = Get-PSSnapin -Registered | Where-Object { $_.Name -like "*TeamFoundation*" } 

foreach($snapin in $snapins)
{ 
    # Add snapin if not already added.
    $exists = Get-PSSnapin | Where-Object { $_.Name -eq $snapin.Name } 
    if (!$exists)
    {
        Write-Host "Adding Snapin " $snapin.Name -ForegroundColor green 
        Add-PSSnapin $snapin.Name 
    }
    else
    {
        Write-Host "Snapin already added." -ForegroundColor green
    }
}



# Get TFS Server object reference.
$tfs_server = Get-TfsServer -Name $/<serverName>/<RepoDir>

# Get list of changed files 
$changes_from_changeset = Get-TfsChangeset -ChangesetNumber 829 | Select -Expand Changes | % { $_.Item.ServerItem }
#$changes_from_changeset

foreach($change in $changes_from_changeset)
{
    &"C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\TF.exe" diff $change /version:829~T /format:unified
}

【讨论】:

  • 谢谢,运行它的前提条件是什么?
  • 您需要安装 TFS Power 工具才能使用 TF.exe,并安装 PowerShell 2.0 版。 Power 工具将包含一个 PowerShell 管理单元,该管理单元在脚本开始时使用。
  • 不错的起点,但如果有人试图在 x64 机器上重现此内容,请确保将“C:\Program Files\”更改为“C:\Program Files (x86)\”。此外,这需要在映射目录中执行,以便 Get-TfsChangeset 可以找到服务器(从未使用过 $tfs_server)。最后,如果您想知道两个版本之间的区别,仅区分第一个变更集中包含的所有文件是不够的。这些文件之外的更改可能会影响它们。您需要包含在第一个版本和第二个版本之间更改的所有文件,可能仅限于特定文件夹。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 2022-06-21
  • 2017-08-17
  • 2015-03-26
  • 1970-01-01
  • 2019-08-13
  • 2022-01-22
相关资源
最近更新 更多