2010-01-28 6 views
7

L'utilisation d'outils Visual Studio 2008,Explication tf diff

Je suis en train de faire une diff ASCII du changement définit 14318 et 14317.

je peux le faire en utilisant l'interface graphique:

tf changeset 14318 

et puis sélectionnez un fichier et faites un clic droit et sélectionnez comparer avec la version précédente. Cependant, c'est un peu fastidieux et c'est basé sur l'interface graphique. Ma tâche à accomplir est de transférer de nombreux changements dans une branche différente. Je voudrais automatiser le test (disons en utilisant Python), en m'assurant que je l'ai fait correctement. Eh bien, à des fins éducatives, je vais faire tous les changements à la main sans regarder la solution, puis je vais comparer les deux changements et essayer de chercher des différences. Voici ce que j'aime à propos de tf - Je peux taper:

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

pour afficher les détails des fichiers qui ont été affectés.

De même, je souhaite obtenir un out.txt avec toutes les différences enregistrées dedans. Je suis assez sûr que je peux gérer la partie Python. Je veux vraiment savoir comment le faire en utilisant l'outil tf.exe, mais si vous avez également appris à connaître d'autres astuces pour y parvenir (un outil sympa d'une tierce partie, ou un script PowerShell, merci de me le faire savoir aussi).

Merci!

Oh, en passant, j'ai vérifié ceci: http://msdn.microsoft.com/en-us/library/6fd7dc73(VS.80).aspx

Et j'ai essayé ceci:

tf diff 14318 14317 

Et j'ai obtenu cette erreur: fichier (ou dossier) c: \ Program Files (x86) \ Microsoft Visual Studio 9.0 \ VC \ 14318 n'existe pas.

Maintenant, merci.

EDIT: Y a-t-il des outils du tout qui peuvent faire cela?

+0

Pourquoi avez-vous dites "Je peux le faire en utilisant l'interface graphique: tf changeset 14318" ?? tf.exe est en ligne de commande, pas d'interface graphique. – pabrams

Répondre

17

Vous n'utilisez pas la bonne syntaxe lorsque vous l'appelez. Dans ce cas, il a essayé de faire une différence entre votre copie de travail, et la version du référentiel de base, des fichiers (inexistants) 14318 et 14317.

Ce que vous devez faire à la place est d'utiliser une gamme de changeset dans /version, comme ceci:

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

Notez que vous pouvez utiliser ~ avec d'autres spécifications version - étiquettes, dates etc. Voir here pour plus de détails .

+0

Merci! Et comment pourrais-je faire un diff sur la version actuelle (locale) et la dernière, ou non modifié? Merci beaucoup! –

+0

Si vous ne spécifiez pas la plage, mais seulement une seule version, votre version locale sera comparée à celle que vous avez spécifiée, c'est-à-dire'/ version: C1000' compare la version locale à celle après le changeset 1000. La version la plus récente peut être spécifiée par'/version: T'. La version de base pour votre version locale est '/ version: W' (notez que tous ceux-ci sont également utilisables dans les plages, donc'/version: C1000 ~ T' est parfaitement valide). De même, vous pouvez utiliser des chemins de fichier locaux au lieu de chemins de serveur TFS. –

+0

Je pense que cela fait exactement ce que je veux! Pourquoi les gens ne votent-ils pas votre réponse? –

1

Voici un script PowerShell (V2), l'extension de la réponse de Pavel, ce sera plus performant, parce que nous trouvons les fichiers qui ont été modifiés, puis obtenir tf pour les diff individuellement:

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 
} 
+0

Merci, quels sont les pré-requis si vous en avez pour cela? –

+0

Vous devez disposer d'outils TFS Power pour utiliser TF.exe et PowerShell version 2.0 doit être installé. Les outils Power incluront un composant logiciel enfichable PowerShell, utilisé au début du script. – Russell

+0

Bon point de départ, bien que si quelqu'un essaye de reproduire ceci sur une machine x64, assurez-vous de changer "C: \ Program Files \" en "C: \ Program Files (x86) \". En outre, cela doit être exécuté dans un répertoire mappé afin que Get-TfsChangeset puisse trouver le serveur ($ tfs_server n'est jamais utilisé). Enfin, si vous voulez connaître la différence entre deux versions, il ne suffit pas de différencier tous les fichiers contenus dans le premier changeset. Les modifications en dehors de ces fichiers peuvent les affecter. Vous voudrez inclure tous les fichiers qui ont changé entre la première et la deuxième version, peut-être limité à un dossier particulier. – SvenS