Pourquoi TFS ne reçoit-il pas la dernière version?

177

Pourquoi Pourquoi TFS n'obtient-il pas les derniers travaux de manière cohérente?

Vous auriez pensé que cette fonctionnalité aurait été testée à fond.

Ce que je dois faire, c'est obtenir une version spécifique, puis vérifier à la fois écraser les fichiers inscriptibles + écraser tous les fichiers.

Ma configuration locale est-elle fausse ou vous faites cela aussi?

Blankman
la source
La chose la plus stupide que je vois est que "Obtenir la dernière version" ne fait rien, même lorsque le fichier local a été supprimé pour une raison quelconque. J'aurais pensé que vérifier que le fichier local existe au moins était une chose assez évidente à faire. Mais pourquoi il ne peut pas simplement comparer l'horodatage de chaque fichier sur le serveur avec l'heure à laquelle vous avez effectué pour la dernière fois un get (qui pourrait être stocké quelque part localement) me laisse perplexe.
Dylan Nicholson le
Cela devrait être un commentaire.
Jimenemex

Réponses:

118

TFS a redéfini ce que fait «Get Latest». En termes TFS, Get Latest signifie obtenir la dernière version des fichiers, mais ignorez ceux que le serveur pense être déjà dans votre espace de travail. Ce qui est faux pour moi et pour presque tout le monde sur la planète.

Voir ce lien: http://blogs.microsoft.co.il/blogs/srlteam/archive/2009/04/13/how-get-latest-version-really-works.aspx

La seule façon de faire ce que vous voulez est d'obtenir une version spécifique, puis cochez les deux cases «Écraser ...».

Pas moi
la source
7
Ce n'est pas correct. TFS "get latest" fonctionne exactement comme annoncé, tant que TFS est au courant des modifications apportées aux fichiers. Get Latest uniquement "foutre" lorsque les gens sortent et modifient des fichiers en dehors de l'EDI sans les vérifier au préalable. Ensuite, TFS pense que vous avez la dernière source sur le disque et ne l'obtient pas.
Robaticus
18
@Robaticus Comment tfs est-il vraiment annoncé. comme Chris Lively l'a déjà dit, lui et tout le monde sur la planète comprennent que «obtenir la dernière version» obtenir la dernière version, ce qui n'est pas ce que ferait tfs. vous n'avez pas à modifier la source en dehors de tfs pour tout gâcher. J'ai 2 postes de travail et je travaille de manière interchangeable et je ne peux pas obtenir la synchronisation de la source. obtenir la dernière version est déjà un problème avec tfs et je ne peux pas imaginer ce que la fusion voudrait.
Syaiful Nizam Yahya
2
@publicENEMY, j'avais l'habitude de travailler avec tfs sur deux machines et c'est en effet un problème de synchronisation des sources. Vous pourriez avoir besoin de deux utilisateurs tfs pour cela ...
kroiz
11
Pouah! C'est une douleur. Visual Studio peut facilement être gâché et parfois le réparer sur le système de fichiers est le moyen le plus simple. D'autres systèmes de contrôle de source comme Subversion ont des hooks d'explorateur Windows et cela et l'intégration VS font un meilleur travail de surveillance des changements. SVN me manque!
Dan Csharpster
3
Je suis d'accord avec l'auteur. J'ai lu «Obtenir la dernière version» comme «Obtenir la dernière version du serveur» (où d'autre pourrais-je l'obtenir?). Dans VS2010, j'ai obtenu la dernière version et j'ai dit que j'avais la dernière version, mais si je fais une comparaison, elle répertorie les différences entre la version locale et la dernière édition du serveur. Je suis d'accord avec le fait qu'il n'écrase pas le travail local, mais il devrait au moins faire une comparaison d'horodatage et ne pas me tromper avec "Vous avez la dernière version". Lorsque j'ai supprimé la version locale, Obtenir la dernière version a fonctionné comme prévu.
Swanny
42

Parfois, Get specific version même en cochant les deux cases , vous n'obtiendrez pas le dernier fichier. Vous avez probablement apporté une modification à un fichier et souhaitez annuler ces modifications en récupérant à nouveau la dernière version. Eh bien ... c'est à cela que Undo pending changessert et non le but Get specific version.

En cas de doute:

  • annuler l'archivage en attente du (des) fichier (s)
  • faites ensuite une comparaison pour vous assurer que votre fichier correspond à la version attendue
  • exécutez ensuite une `` comparaison '' récursive sur l'ensemble de votre projet pour voir ce qui est différent
  • Gardez un œil sur la fenêtre des modifications en attente et parfois vous devrez peut-être cocher 'prendre la version du serveur' pour résoudre une modification en attente incompatible

Et celui-ci est mon préféré que je viens de découvrir:

  • gardez un œil sur la Outputfenêtre pour les messages tels que celui-ci:

    Avertissement - Impossible d'actualiser R: \ TFS-PROJECTS \ www.example.com \ ExampleMVC \ Example MVC \ Example MVC.csproj car vous avez une modification en attente.

Ce message critique apparaît dans la fenêtre de sortie. Aucune autre notification! Rien dans les modifications en attente et aucun autre message de dialogue vous indiquant que le fichier que vous venez de demander explicitement n'a pas été récupéré! Et oui, vous résolvez ce problème en exécutant simplement Undo pending changeset en récupérant le fichier.

Simon_Weaver
la source
Merci, votre réponse ( Undo pending changes) a fonctionné pour moi.
RAM
Assurez-vous simplement d'annuler uniquement les modifications sur le fichier que vous voulez vraiment remplacer et non sur tout ce sur quoi vous travaillez
Simon_Weaver
@Simon_Weaver Merci que cela a résolu mon problème, il est logique que cela se passe encore très ennuyeux.
nulltron
12

TFS, comme certains autres fournisseurs de contrôle de source, tels que Perforce, faites cela, car le système sait quelle était la dernière version que vous avez obtenue avec succès, alors obtenez les dernières modifications en "obtenir les modifications depuis x". Si vous jouez selon ses règles et que vous vérifiez les choses avant de les éditer, vous ne confondez pas les choses, et "être au courant" fait vraiment ce qu'il dit.

Comme vous l'avez vu, vous pouvez le forcer à tout réévaluer, ce qui utilise une bande passante beaucoup plus grande, mais se comporte plus près de la façon dont SourceSafe le faisait auparavant.

Rowland Shaw
la source
11

Il est difficile de répondre à une déclaration sans exemples de la façon dont cela ne fonctionne pas, mais il est crucial de comprendre que TFVC (en mode "Server Workspace", qui était le mécanisme avant TFS 2012) n'examine pas l'état de votre système de fichiers local . Les espaces de travail du serveur TFVC sont un système de type «extraction-édition-archivage» où il s'agit d'une décision délibérée prise pour réduire massivement la quantité d'E / S de fichier requise pour déterminer l'état de votre espace de travail. Au lieu de cela, les informations de l'espace de travail sont enregistrées sur le serveur.

Cela permet aux espaces de travail du serveur TFVC de s'adapter très efficacement à de très grandes bases de code. Si vous êtes dans une base de code de plusieurs gigaoctets (comme Visual Studio ou l'arborescence des sources Windows), votre client n'a pas besoin d'analyser votre système de fichiers local, à la recherche de fichiers qui peuvent avoir changé, car le contrat que vous avez avec TFS est que vous extraira explicitement un fichier lorsque vous souhaitez le modifier.

Vous êtes censé ne pas marquer un fichier comme étant en écriture seule et le modifier sans le retirer explicitement au préalable. Si vous suivez cette voie, le serveur ne sait pas que vous avez apporté des modifications à votre fichier et l'exécution d'une opération "Obtenir la dernière" ne mettra pas à jour votre espace de travail local, car vous n'avez pas informé le serveur que vous avez effectué changements.

Si vous faites subvertir ce mécanisme, vous pouvez utiliser la tfpt reconcilecommande pour examiner votre espace de travail local pour les changements que vous avez fait sur place.

Si vous vous retrouvez à utiliser "Obtenir une version spécifique" et à sélectionner les options "forcer" et "écraser", il est fort probable que vous ayez l'habitude de contourner toutes les applications mises en œuvre par TFS pour vous empêcher de vous blesser, et vous devriez probablement considérer les espaces de travail locaux TFVC.

Les espaces de travail locaux TFVC fournissent un système de contrôle de version de type «édition-fusion-validation», ce qui signifie que vous n'avez pas besoin d'extraire explicitement les fichiers avant de les éditer et qu'ils ne sont pas en lecture seule sur le disque. Au lieu de cela, vous devez simplement modifier le fichier, et votre client analysera le système de fichiers, notera le changement et le présentera comme un changement en attente.

Les espaces de travail locaux TFVC sont recommandés pour les petits projets qui ne nécessitent pas un contrôle précis des autorisations, car ils présentent un flux de travail beaucoup plus agréable. Vous n'êtes pas obligé d'être en ligne et vous n'avez pas à extraire explicitement les fichiers avant de les modifier.

Les espaces de travail locaux TFVC sont la valeur par défaut dans TFS 2012, et s'ils ne sont pas activés pour vous, vous devez demander à votre administrateur de serveur. (Les organisations avec de très grandes bases de code ou des exigences d'audit strictes peuvent désactiver les espaces de travail locaux TFVC.)

L'excellent livre d'Eric Sink, Version Control By Example, décrit les différences entre les systèmes checkout-edit-checkin et edit-merge-commit et quand l'un est plus approprié que l'autre.

Le livre Professional Team Foundation Server 2013 fournit également d'excellentes informations sur les différences entre les espaces de travail du serveur TFVC et les espaces de travail locaux TFVC. La documentation et les blogs MSDN fournissent également des informations détaillées:

Edward Thomson
la source
Excellente réponse informative, mais je ne suis pas sûr que le "marquage d'un fichier comme écriture seule" réponde à l'OP. Je sais que j'utilise Visual Studio (maintenant 2013) pour apporter toutes mes modifications aux fichiers * .cs dans un projet MVC .NET, et lorsque je lance mon ordinateur portable, "Get Latest" me laisse souvent accroché au point que je Je suis presque en train de cultiver la cargaison "Avancé >>> Soyez précis >>> Dernier >>> Écraser" maintenant. Il n'y a pas de modification ou d'archivage en dehors de VS. VS trouve les fichiers que j'ai modifiés et les place correctement dans les modifications en attente. Je les enregistre avec VS. Je ne vois rien qui me ferait «mal», mais la mise à jour ne fonctionne pas de manière fiable. ??
ruffin
@ruffin Vous dites que vous avez le dernier blocage ? Ce n'est pas ce que j'ai interprété comme étant la question du PO. Est-ce que ça finit jamais? Les autres opérations sont-elles lentes ou juste un Get? Get w / Overwrite est-il toujours lent ou juste le Get Latest habituel?
Edward Thomson
Non, ne se bloque pas. Je peux obtenir la dernière version et cela semble fonctionner (et fonctionner assez rapidement), mais les fichiers ne changent pas. Si j'obtiens des >>> Dernières >>> Ecraser, tout comme les suggestions @NotMe , les fichiers "rattrapent". Hareng rouge probable: cela arrive aussi occasionnellement avec les Shelfsets. Oui, mes chemins de travail sont corrects, ou Get Specific ne fonctionnerait pas, je ne crois pas.
ruffin
Je n'ai pas de bonne suggestion ici. Je souhaite que vous contactiez le support si vous avez un problème de longue date qui, selon vous, pourrait être un bogue. Qu'il s'agisse d'un bogue ou non, vous devriez trouver une solution à ce problème.
Edward Thomson
6

Team Foundation Server (TFS) garde une trace de sa copie locale dans un répertoire caché appelé $ TF. Lorsque vous émettez le "get Latest Version", TFS regarde dans ce dossier et voit la météo que j'ai la dernière copie ou non. Si tel est le cas, il ne téléchargera pas la dernière copie. Peu importe que vous ayez ou non le fichier d'origine. En fait, vous avez peut-être supprimé le dossier entier (comme dans mon cas) et TFS ne récupérera pas la dernière copie car il ne regarde pas dans le fichier réel mais dans le répertoire caché où il enregistre les modifications. Le défaut de cette conception est que tout ce qui est fait en dehors du système ne sera pas enregistré dans TFS. Par exemple, vous pouvez accéder à l'explorateur Windows, supprimer un dossier ou un fichier et TFS ne le reconnaîtra pas. Ce sera totalement aveugle. Au moins, je m'attendrais à ce que Windows ne vous laisse pas supprimer ce fichier, mais c'est le cas!

Une façon d'appliquer la dernière copie consiste à supprimer manuellement le dossier $ TF caché. Pour ce faire, accédez à l'invite de commande et accédez au dossier racine où votre projet a été extrait et exécutez cette commande

rd/s $tf                    // remove $TF folder and everything inside it

Si vous voulez simplement vérifier le dossier caché, vous pouvez le faire en utilisant

dir /ah                    // display hidden files and folders

Remarque: si vous le faites, le tf pensera que vous n'avez aucune copie locale même si vous l'avez dans des fichiers et il synchronisera tout à nouveau.

Attention: utilisez cette méthode à vos propres risques. Veuillez ne pas l'utiliser sur des travaux critiques.

Hammad Khan
la source
Cela a fonctionné pour moi quand rien d'autre n'a fonctionné. J'ai essayé d'obtenir une version spécifique et j'ai coché les deux cases pour forcer le téléchargement, mais cela n'obtiendrait pas les fichiers. Je pense que quelque chose était corrompu. Mais cette solution a fonctionné.
Francisco d'Anconia
3

"Obtenir la dernière version" par défaut ne téléchargera que les fichiers qui ont changé sur le serveur depuis la dernière fois que vous avez exécuté "Obtenir la dernière version". TFS garde une trace des fichiers que vous téléchargez afin de ne pas perdre de temps à télécharger à nouveau la même version des fichiers. Si vous modifiez les fichiers en dehors de Visual Studio, cela peut entraîner les problèmes de cohérence que vous ressentez.

David
la source
3

Malheureusement, il doit y avoir un ou plusieurs bogues dans TFS 2008, car ce problème survient régulièrement sur les machines de développement et construit des serveurs sur lesquels je travaille également.

Je peux faire Get Latest, je peux voir dans la liste de l'historique du projet qu'il y a eu des commits après avoir fait un Get Latest pour la dernière fois, je n'ai pas touché les fichiers sur le disque de quelque manière que ce soit, mais après la fonction "Get Latest" a terminé, lorsque je vérifie l'onglet TFS, certains des fichiers indiquent toujours qu'ils ne sont pas la dernière version.

Évidemment, TFS est capable de déterminer que j'ai d'anciens fichiers localement, puisque la liste l'indique. Pourtant, Get Latest ne parvient pas à le faire, obtenez la dernière version. Si je fais ce que vous avez fait, utilisez la version Get Specific et cochez les deux cases à cocher en bas de la boîte de dialogue, les fichiers sont récupérés.

Nous avons changé nos serveurs de build pour toujours utiliser le type de fonction Get Specific version à la place, donc cette partie fonctionne maintenant, mais puisque notre serveur de build (TeamCity) repose également sur la vérification s'il y a eu des modifications dans les fichiers afin de lancer une build , parfois il passe en mode "rien de changé, rien à voir ici, avancez" et ne fait rien tant que nous n'exécutons pas de force la configuration de construction.

Notez que j'ai rencontré ce problème sur une machine qui n'est jamais touchée, à l'exception de get latest + build, les deux manuellement, donc il n'y a rien de falsifié dans les fichiers. C'est juste que TFS devient confus.

Une fois, j'ai vérifié que les fichiers sur le disque étaient en effet binaires identiques à la version précédemment récupérée, donc aucune falsification manuelle n'avait été faite avec les fichiers.

De plus, je ne vois pas comment TFS peut "savoir" si les fichiers ont changé sur le disque ou non sans en regarder le contenu. Si une partie de TFS peut voir que les fichiers ne sont en effet pas la dernière version, alors la dernière version devrait absolument pouvoir obtenir la dernière version. Ceci en référence aux commentaires sur d'autres réponses ici.

Lasse V. Karlsen
la source
TFS dépend du numéro de version des fichiers pour savoir si vous avez la «dernière» version ou non. Ce numéro est entièrement conservé dans TFS et n'est mis à jour que lorsque quelqu'un effectue un enregistrement. Ainsi, lorsque vous "Get Latest", TFS vérifie sa base de données pour voir quelle était la dernière version qui vous a été envoyée. Si ce nombre est égal à la version actuelle, il pense que vous avez la dernière; indépendamment de ce qui se trouve réellement sur votre système de fichiers local. L'idée était de limiter le trafic réseau. Malheureusement, la seule façon dont ce modèle fonctionne est si toutes les modifications se produisent dans une application qui connaît TFS.
NotMe
De plus, je suis d'accord qu'il y a au moins un bogue avec la version 2005/08 de ceci. J'ai vu les problèmes exacts que vous avez décrits sur plusieurs machines; C'est ce qui m'a conduit à utiliser religieusement la version Get Specific.
NotMe
Dans certains cas, les modifications ont eu lieu entièrement dans Visual Studio sur une machine, l'autre machine, dont le seul but est d'obtenir la dernière version +, aucune modification locale n'est en cours. Pourtant, il parvient à tout gâcher. Je ne suis pas impressionné par TFS Source Control pour dire le moins. Espérons que 2010 aura moins de ces problèmes.
Lasse V.Karlsen
3

Cela peut être dû au fait que vous vous connectez à TFS avec le même utilisateur et que le nom de l'espace de travail (basé sur le nom de la machine par défaut) est également le même, donc TFS pense que vous êtes sur la même machine et le même espace de travail, vous avez donc déjà la dernière version de les fichiers, donc il ne les obtiendra pas pour vous.

essayez de renommer votre machine et créez un nouvel espace de travail en tant que nouvelle machine.

WalkingCat
la source
2

J'ai eu le même problème avec Visual Studio 2012. Peu importe ce que j'ai fait, il n'a pas obtenu le code du contrôle de source TFS.

Dans mon cas, la cause était le mappage d'un dossier + sous-dossier du contrôle de source séparément mais dans le même arbre dans mon disque dur local.

La solution consistait à supprimer le mappage des sous-dossiers à l'aide de la fenêtre «gérer les espaces de travail».

Nir
la source
1

La plupart des problèmes que j'ai rencontrés avec les développeurs se plaignant du fait que Get Latest ne fait pas ce qu'ils attendent proviennent du fait qu'ils effectuent un Get Latest à partir de l'Explorateur de solutions plutôt que de l'Explorateur de contrôle de source. L'Explorateur de solutions obtient uniquement les fichiers qui font partie de la solution et ignore tout ce qui peut être requis par les fichiers de la solution, et donc une partie du contrôle de code source, tandis que l'explorateur de contrôle de source compare votre espace de travail local avec le référentiel sur le serveur pour déterminer les fichiers sont nécessaires.

levelnis
la source
Je l'ai essayé depuis Team Explorer, toujours le même résultat. Dans mon cas, j'ai supprimé le dossier et je voulais obtenir à nouveau la dernière copie, mais pas de chance.
Hammad Khan
1
Je ne suis pas d'accord avec cette réponse. Si vous avez partagé des projets utilisés par différentes solutions, vous devez le faire dans l'Explorateur de solutions, sinon il fera simplement un Get sur ce chemin TFS particulier
Heliac
Pourquoi ajouter l'option de l'Explorateur de solutions si vous n'êtes pas censé l'utiliser? Lorsque j'ai cliqué sur "Afficher tous les fichiers", le fichier était là mais pas inclus dans mon projet. Bizarre puisque ce n'est même pas moi qui l'ai ajouté.
mokumaxCraig
1

Lorsque je rencontre ce problème avec qu'il n'obtient pas la dernière version et les incompatibilités de version, je commence par faire un "Get Specific Version", définissez-le sur changeset et insérez-le 1. Cela supprimera tous les fichiers de votre espace de travail local (pour ce projet, ce dossier, fichier, etc.) et il aura également une mise à jour TFS afin qu'il sache que vous n'avez maintenant AUCUNE VERSION TÉLÉCHARGÉE. Vous pouvez ensuite faire un "Get Latest" et un alto, vous aurez en fait le dernier

mjlarezzo
la source
1

Cela peut arriver lorsque vous utilisez TFS à partir de deux machines différentes avec le même compte, si c'est le cas, vous devez comparer pour voir les fichiers modifiés et les extraire, puis obtenir la dernière version puis annuler les modifications en attente pour supprimer l'extraction.

Mohamed Badr
la source
1

Cela a fonctionné pour moi:
1. Quittez Visual Studio
2. Ouvrez une fenêtre de commande et accédez au dossier: "% localappdata% \ Local \ Microsoft \ Team Foundation \"
3. Naviguez vers les sous-dossiers pour chaque version et supprimez le sous-dossier "cache" et son contenu
4. Redémarrez Visual Studio et connectez-vous à TFS.
5. Testez la dernière version.

Ludwo
la source
0

je veux juste ajouter TFS MSBuild ne prend pas en charge les caractères spéciaux sur les dossiers, par exemple "@"

j'avais déjà expérimenté dans le passé où l'un de nos dossiers de projet nommé External @ Project1

nous avons créé une définition de build TFS pour exécuter un fichier msbuild personnalisé, le dossier de l'espace de travail n'obtient aucun contenu dans le dossier External @ Project1 pendant la dernière mise à jour de l'espace de travail. Il semble que tfs get échoue mais ne montre aucune erreur.

après quelques essais et erreurs et renommer le dossier en _Project1. voila, nous avons des fichiers sur le dossier (_Project1).

bherto39
la source
TFS ou pas, vous ne devez jamais utiliser de caractères spéciaux dans les noms de dossier de projet!
Heliac
@ n'est pas spécial. Et ce n'est pas non plus%, etc.
Kevin Whitefoot
0

Outil: Outils électriques TFS

Source: http://dennymichael.net/2013/03/19/tfs-scorch/

Commande: tfpt scorch / recursive / supprime C: \ LocationOfWorkspaceOrFolder

Cela fera apparaître une boîte de dialogue qui vous demandera de supprimer ou de télécharger une liste de fichiers. Sélectionnez ou désélectionnez les fichiers en conséquence et appuyez sur ok. Apparence dans la grille (CheckBox, FileName, FileAction, FilePath)

Cause: TFS se comparera uniquement aux éléments de l'espace de travail. Si des modifications ont été apportées en dehors de l'espace de travail, TFS n'en aura pas connaissance.

Espérons que quelqu'un trouve cela utile. J'ai trouvé cet article après avoir supprimé une poignée de dossiers à différents endroits. Ne pas me souvenir des dossiers que j'ai supprimés a exclu l'option habituelle Forcer / Remplacer que j'aurais utilisée.

pseudo
la source
0

Dans mon cas, Obtenir une version spécifique, même en cochant les deux cases et en annulant toutes les modifications en attente, ne fonctionnait pas.

Vérifié les espaces de travail. Modifier l'espace de travail actuel. Vérifiez tous les chemins. Le chemin de la solution était incorrect et pointait vers un dossier supprimé.

Correction du chemin et la dernière a bien fonctionné.

Himanshu Patel
la source
0

Allez avec un clic droit: Avancé> Obtenir une version spécifique . Sélectionnez "Version Letest" et maintenant, important, cochez deux vérifications: entrez la description de l'image ici

Les vérifications sont les suivantes:
Écraser les fichiers inscriptibles qui ne sont pas vérifiés

Écraser tous les fichiers même si la version locale correspond à la version spécifiée

Javier FF
la source
Veuillez décrire les éléments à vérifier plutôt que d'afficher une capture d'écran.
Chuck Adams