¿Por qué TFS no obtiene lo último?

177

¿Por qué? ¿Por qué los TFS no obtienen el último trabajo de manera consistente?

Habría pensado que esa característica se habría probado a fondo.

Lo que tengo que hacer es obtener una versión específica, luego verificar ambos sobrescribir archivos de escritura + sobrescribir todos los archivos.

¿Está mal mi configuración local o tú también haces esto?

Blankman
fuente
Lo más tonto que veo es que "Obtener la última versión" no hace nada, incluso cuando el archivo local se ha eliminado por cualquier razón. Pensé que verificar que el archivo local al menos existe era algo bastante obvio. Pero por qué no puede simplemente comparar la marca de tiempo de cada archivo en el servidor con la última vez que obtuvo (que podría almacenarse en algún lugar local) me deja perplejo.
Dylan Nicholson el
Esto debería ser un comentario.
Jimenemex

Respuestas:

118

TFS redefinió lo que hace "Get Latest". En términos de TFS, Obtener más reciente significa obtener la última versión de los archivos, pero ignore los que el servidor cree que ya están en su espacio de trabajo. Lo que para mí y para casi todos los demás en el planeta está mal.

Ver este enlace: http://blogs.microsoft.co.il/blogs/srlteam/archive/2009/04/13/how-get-latest-version-really-works.aspx

La única forma de lograr que haga lo que desea es obtener una versión específica, luego marque las dos casillas "Sobrescribir ...".

Yo no
fuente
77
Esto no es correcto TFS "get latest" funciona exactamente como se anuncia, siempre que TFS conozca los cambios en los archivos. Get Latest solo se "arruina" cuando las personas salen y modifican los archivos fuera del IDE sin consultarlos primero. Entonces, TFS cree que tiene la última fuente en el disco y no la obtiene.
Robaticus
18
@Robaticus ¿Cómo se anuncia realmente la última versión de tfs? tal como Chris Lively dijo antes, él y todos en el planeta entienden que 'obtener la última' obtener la última versión, que no es lo que haría tfs. no tienes que editar la fuente fuera de tfs para desordenarla. Tengo 2 estaciones de trabajo y trabajo indistintamente y simplemente no puedo obtener la sincronización de origen. obtener la última versión ya es una molestia con tfs y no puedo imaginar lo que le gustaría fusionar.
Syaiful Nizam Yahya
2
@publicENEMY, solía trabajar con tfs en dos máquinas y, de hecho, es un problema para la sincronización de fuente. Es posible que necesite dos usuarios de tfs para esto ...
kroiz
11
Ugh! Esto es un dolor Visual Studio puede estropearse fácilmente y, a veces, arreglarlo en el sistema de archivos es la forma más fácil de hacerlo. Otros sistemas de control de fuente como Subversion tienen ganchos de Windows Explorer y tanto eso como la integración VS hacen un mejor trabajo de monitoreo de cambios. Echo de menos SVN!
Dan Csharpster
3
Estoy de acuerdo con el autor. Leí "Obtener la última versión" como "Obtener la última versión del servidor" (¿de dónde más podría obtenerla?). En VS2010 obtuve la última versión y me dijeron que tenía la última versión, pero si hago una comparación, enumera las diferencias entre la edición del servidor local y la última. Estoy de acuerdo con que no sobrescriba el trabajo local, pero al menos debería hacer una comparación de marca de tiempo y no confundirme con "Tienes la última versión". Cuando eliminé la versión local, Obtener la última versión funcionó como se esperaba.
Swanny
42

A veces, Get specific version incluso al marcar ambas casillas de verificación no obtendrá el último archivo. Probablemente ha realizado un cambio en un archivo y desea deshacer esos cambios volviendo a obtener la última versión. Bueno ... para eso Undo pending changeses y no para qué Get specific version.

En caso de duda:

  • deshacer el check-in pendiente en los archivos
  • luego haga una comparación para asegurarse de que su archivo coincida con la versión esperada
  • ejecute una 'comparación' recursiva en todo su proyecto después para ver qué más es diferente
  • Esté atento a la ventana de cambios pendientes y, a veces, es posible que deba marcar 'tomar versión del servidor' para resolver un cambio pendiente incompatible

Y este es mi favorito que acabo de descubrir:

  • Esté atento a la Outputventana de mensajes como este:

    Advertencia: no se puede actualizar R: \ TFS-PROJECTS \ www.example.com \ ExampleMVC \ Example MVC \ Example MVC.csproj porque tiene una edición pendiente.

Este mensaje crítico aparece en la ventana de salida. No hay otras notificaciones! ¡Nada en cambios pendientes y ningún otro mensaje de diálogo que le indique que el archivo que acaba de solicitar explícitamente no se recuperó! Y sí, resuelve esto simplemente ejecutando Undo pending changesy obteniendo el archivo.

Simon_Weaver
fuente
Gracias, su respuesta ( Undo pending changes) funcionó para mí.
RAM
Solo asegúrese de deshacer solo los cambios en el archivo que realmente desea reemplazar y no todo en lo que está trabajando
Simon_Weaver
@Simon_Weaver Gracias, esto resolvió mi problema, sin embargo, tiene sentido por qué está sucediendo.
nulltron
12

TFS, al igual que algunos otros proveedores de control de origen, como Perforce, hace esto, ya que el sistema sabe cuál fue la última versión que obtuvo con éxito, así que obtenga los últimos cambios en "obtener cambios desde x". Si juegas según sus reglas y realmente revisas las cosas antes de editarlas, no confundes las cosas, y "obtener lo último" realmente hace lo que dice.

Como ha visto, puede obligarlo a reevaluar todo, lo que tiene un uso de ancho de banda mucho mayor, pero se comporta más cerca de lo que solía hacer SourceSafe.

Rowland Shaw
fuente
11

Es difícil responder a una declaración sin ejemplos de cómo no está funcionando, pero es crucial comprender que TFVC (en el modo "Espacio de trabajo del servidor", que era el mecanismo anterior a TFS 2012) no examina el estado de su sistema de archivos local . Los espacios de trabajo del servidor TFVC son un tipo de sistema "checkout-edit-checkin" en el que esto es por diseño, una decisión intencional tomada para reducir masivamente la cantidad de E / S de archivo requerida para determinar el estado de su espacio de trabajo. En cambio, la información del espacio de trabajo se guarda en el servidor.

Esto permite TFVC áreas de trabajo del servidor a escala a muy grandes bases de código de manera muy eficiente. Si está en una base de código de varios gigabytes (como Visual Studio o el árbol fuente de Windows), entonces su cliente no necesita escanear su sistema de archivos local, buscando archivos que pueden haber cambiado, porque el contrato que tiene con TFS es que usted verificará explícitamente un archivo cuando desee editarlo.

Se espera que no marque un archivo como de solo escritura y que lo cambie sin verificarlo explícitamente primero. Si sigue esta ruta, el servidor no sabe que ha realizado cambios en su archivo, y realizar una operación "Obtener más reciente" no actualizará su espacio de trabajo local, porque no le ha dicho al servidor que ha realizado cambios

Si haces subvertir este mecanismo, puede utilizar el tfpt reconcilecomando para examinar su espacio de trabajo local para los cambios que se han hecho en la localidad.

Si se encuentra utilizando "Obtener versión específica" y seleccionando las opciones "forzar" y "sobrescribir", entonces es muy probable que tenga la costumbre de eludir todas las aplicaciones que TFS ha implementado para evitar que se lastime, y probablemente debería considerar los espacios de trabajo locales TFVC.

Los espacios de trabajo locales de TFVC proporcionan un tipo de sistema de control de versiones "edit-merge-commit", lo que significa que no es necesario verificar explícitamente los archivos antes de editarlos y no son de solo lectura en el disco. En cambio, simplemente necesita editar el archivo, y su cliente escaneará el sistema de archivos, notará el cambio y lo presentará como un cambio pendiente.

Los espacios de trabajo locales TFVC se recomiendan para proyectos pequeños que no requieren un control de permisos específico, ya que presentan un flujo de trabajo mucho más agradable. No es necesario que esté en línea, y no tiene que retirar explícitamente los archivos antes de editarlos.

Los espacios de trabajo locales de TFVC son los predeterminados en TFS 2012, y si no están habilitados para usted, debe consultar al administrador del servidor. (Las organizaciones con bases de código muy grandes o requisitos estrictos de auditoría pueden deshabilitar los espacios de trabajo locales de TFVC).

El excelente libro Control de versiones de Eric Sink, por ejemplo, describe las diferencias entre los sistemas checkout-edit-checkin y edit-merge-commit y cuándo uno es más apropiado que el otro.

El libro Professional Team Foundation Server 2013 también proporciona información excelente sobre las diferencias entre los espacios de trabajo del servidor TFVC y los espacios de trabajo locales TFVC. La documentación y los blogs de MSDN también proporcionan información detallada:

Edward Thomson
fuente
Excelente respuesta informativa, pero no estoy seguro de que "marcar un archivo como de solo escritura" responda al OP. Sé que estoy usando Visual Studio (ahora 2013) para hacer todos mis cambios en los archivos * .cs en un proyecto MVC .NET, y cuando enciendo mi computadora portátil, "Get Latest" a menudo me deja colgado al punto que Estoy casi cargando "Avanzado >>> Obtener específico >>> Último >>> Sobrescribir" ahora. No hay edición o registro fuera de VS. VS encuentra los archivos que he editado y los coloca en Cambios pendientes correctamente. Los reviso con VS. No puedo ver nada que pueda estar "lastimándome a mí mismo", pero obtener lo último no funciona de manera confiable. ??
ruffin
@ruffin ¿Estás diciendo que obtienes los últimos bloqueos ? Eso no fue lo que interpreté que era la pregunta del OP. ¿Alguna vez termina? ¿Otras operaciones son lentas o solo un Get? ¿Get w / Overwrite es lento o es el habitual Get Latest?
Edward Thomson
No, no se cuelga. Puedo obtener la última versión, y parece funcionar (y funciona razonablemente rápido), pero los archivos no cambian. Si lo hago Obtener >>> Más reciente >>> Sobrescribir, al igual que @NotMe sugerencias , los archivos "se ponen al día". Arenque rojo probable: también ocurre ocasionalmente con Shelfsets. Sí, mis caminos de trabajo son correctos, o Get Specific no funcionaría, no lo creo.
ruffin
No tengo una buena sugerencia aquí. Me gustaría que contactaras con soporte si tienes un problema de larga data que crees que podría ser un error. Ya sea que se trate de un error o no, debe obtener una solución a este problema.
Edward Thomson el
6

Team Foundation Server (TFS) realiza un seguimiento de su copia local en un directorio oculto llamado $ TF. Cuando emite "obtener la última versión", TFS busca en esta carpeta y ve si tengo la última copia o no. Si lo hace, no descargará la última copia. No importa si tiene el archivo original o no. De hecho, es posible que haya eliminado toda la carpeta (como en mi caso) y TFS no obtendrá la última copia porque no se ve en el archivo real sino en el directorio oculto donde registra los cambios. La falla con este diseño es que todo lo que se haga fuera del sistema no se grabará en TFS. Por ejemplo, puede ingresar al explorador de Windows, eliminar una carpeta o archivo y TFS no lo reconocerá. Será totalmente ciego. ¡Al menos esperaría que Windows no le permitiera eliminar este archivo, pero lo hace!

Una forma de aplicar la última copia es eliminar la carpeta oculta $ TF manualmente. Para hacer eso, vaya al símbolo del sistema y navegue a la carpeta raíz donde se desprotegió su proyecto y emita este comando

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

Si solo desea verificar la carpeta oculta, puede hacerlo usando

dir /ah                    // display hidden files and folders

Nota: Si lo hace, el tf pensará que no tiene ninguna copia local a pesar de que la tiene en los archivos y volverá a sincronizar todo.

Precaución: use este método bajo su propio riesgo. Por favor, no lo use en trabajos críticos.

Hammad Khan
fuente
Esto funcionó para mí cuando nada más lo hizo. Intenté obtener una versión específica y marqué ambas casillas de verificación para forzar la descarga, pero no obtuve los archivos. Creo que algo estaba corrupto. Pero esta solución funcionó.
Francisco d'Anconia
3

"Obtener la última versión" de forma predeterminada solo descargará los archivos que han cambiado en el servidor desde la última vez que ejecutó "Obtener la última versión". TFS realiza un seguimiento de los archivos que descarga para que no pierda tiempo descargando la misma versión de los archivos nuevamente. Si está modificando los archivos fuera de Visual Studio, esto puede causar los problemas de consistencia que parece que está viendo.

David
fuente
3

Desafortunadamente, tiene que haber uno o más errores en TFS 2008, ya que este problema surge regularmente en las máquinas de desarrollo y construye servidores donde también trabajo.

Puedo hacer Get Latest, puedo ver en la lista de historial del proyecto que ha habido confirmaciones después de haber realizado Get Latest, no he tocado los archivos en el disco de ninguna manera, pero después de que la función "Get Latest" completado, cuando reviso la pestaña TFS, algunos de los archivos todavía dicen que no son la última versión.

Obviamente, TFS puede determinar que tengo archivos antiguos localmente, ya que la lista lo dice. Sin embargo, Get Latest no puede hacer eso, obtén la última versión. Si hago lo que hizo, use la versión Obtener específica y marque las dos casillas de verificación en la parte inferior del cuadro de diálogo, luego se recuperarán los archivos.

Cambiamos nuestros servidores de compilación para usar siempre el tipo de función Obtener versión específica, por lo que esta parte ahora funciona, pero dado que nuestro servidor de compilación (TeamCity) también se basa en verificar si ha habido cambios en los archivos para iniciar una compilación , a veces cae en un modo de "nada cambiado, nada que ver aquí, moverse" y no hace nada hasta que ejecutamos por la fuerza la configuración de compilación.

Tenga en cuenta que he experimentado este problema en una máquina que nunca se toca, a excepción de obtener la última compilación +, ambas manualmente, por lo que no hay nada que altere los archivos. Es solo que TFS se está confundiendo.

Una vez que esto apareció, verifiqué que los archivos en el disco eran de hecho binarios idénticos a la versión recuperada previamente, por lo que no se había hecho ninguna manipulación manual con los archivos.

Además, no veo cómo TFS puede "saber" si los archivos han cambiado en el disco o no sin mirar realmente el contenido. Si una parte de TFS puede ver que los archivos no son la última versión, entonces la última versión debería ser absolutamente capaz de obtener la última versión. Esto en referencia a los comentarios a otras respuestas aquí.

Lasse V. Karlsen
fuente
TFS depende de un número de versión de archivos para saber si tiene la versión "más reciente" o no. Ese número se mantiene por completo en TFS y solo se actualiza cuando alguien realiza un check in. Por lo tanto, cuando "Obtiene lo último", TFS verifica su base de datos para ver cuál fue la última versión que se le envió. Si este número es igual a la versión actual, entonces cree que tiene la última; independientemente de lo que esté realmente en su sistema de archivos local. La idea era limitar el tráfico de red. Desafortunadamente, la única forma en que funciona este modelo es si todas las ediciones ocurren dentro de una aplicación que tiene conocimiento de TFS.
NotMe
Además, estoy de acuerdo en que hay al menos un error con la versión de 2005/08 de esto. He visto los problemas exactos que ha descrito en varias máquinas; que es lo que me llevó a usar la versión Obtener específicamente religiosamente.
NotMe
En algunos casos, las ediciones se han realizado completamente dentro de Visual Studio en una máquina, la otra máquina, cuyo único propósito es obtener la última versión + compilación, nunca se realizan cambios locales. Sin embargo, se las arregla para arruinar esto. No estoy impresionado con TFS Source Control para decir lo menos. Esperemos que 2010 tenga menos problemas de este tipo.
Lasse V. Karlsen
3

Puede ser porque está iniciando sesión en TFS como el mismo usuario, y el nombre del espacio de trabajo (basado en el nombre de la máquina por defecto) también es el mismo, por lo que TFS cree que está en la misma máquina y el mismo espacio de trabajo, por lo que ya tiene la última versión de los archivos, por lo que no los obtendrá para usted.

intente cambiar el nombre de su máquina y cree un nuevo espacio de trabajo como una nueva máquina.

WalkingCat
fuente
2

Tuve el mismo problema con Visual Studio 2012. No importa lo que hice, no obtuvo el código del control de fuente TFS.

En mi caso, la causa fue mapear una carpeta + subcarpeta desde el control de origen por separado pero al mismo árbol en mi HD local.

La solución fue eliminar la asignación de subcarpetas mediante la ventana "administrar espacios de trabajo".

Nir
fuente
1

La mayoría de los problemas que he visto con los desarrolladores quejándose de que Get Latest no hace lo que esperan se debe al hecho de que están realizando Get Latest de Solution Explorer en lugar de Source Control Explorer. El Explorador de soluciones solo obtiene los archivos que forman parte de la solución e ignora todo lo que puedan requerir los archivos dentro de la solución y, por lo tanto, parte del control de origen, mientras que el explorador de Control de origen compara su espacio de trabajo local con el repositorio en el servidor para determinar qué archivos Se necesitan.

levelnis
fuente
Lo probé en Team Explorer, sigue siendo el mismo resultado. En mi caso, eliminé la carpeta y quería obtener la última copia nuevamente, pero no tuve suerte.
Hammad Khan
1
No estoy de acuerdo con esta respuesta. Si usted ha compartido proyectos utilizados por diferentes soluciones, que tiene que hacerlo en el Explorador de soluciones, de lo contrario se acaba de hacer un GET en ese camino particular, TFS
Heliac
¿Por qué agregar la opción del Explorador de soluciones si se supone que no debes usarla? Cuando hice clic en "Mostrar todos los archivos", el archivo estaba allí pero no incluido en mi proyecto. Extraño ya que ni siquiera fui yo quien lo agregó.
mokumaxCraig
1

CUANDO me encuentro con este problema, ya que no obtiene la última versión y los desajustes de versión, primero hago una "Obtener versión específica", la configuro en changeset y la coloco en 1. Esto eliminará todos los archivos de su espacio de trabajo local (para ese proyecto, carpeta, archivo, etc.) y también tendrá una actualización TFS para que sepa que ahora NO HAY VERSIÓN DESCARGADA. Luego puedes hacer un "Get Latest" y viola, en realidad tendrás el último

mjlarezzo
fuente
1

Puede suceder cuando usa TFS desde dos máquinas diferentes con la misma cuenta, si es así, debe comparar para ver los archivos modificados y revisarlos, luego obtenga lo último y deshaga los cambios pendientes para eliminar el pago

Mohamed Badr
fuente
1

Esto funcionó para mí:
1. Salga de Visual Studio
2. Abra una ventana de comandos y navegue a la carpeta: "% localappdata% \ Local \ Microsoft \ Team Foundation \"
3. Navegue a las subcarpetas para cada versión y elimine la subcarpeta "caché" y su contenido
4. Reinicie Visual Studio y conéctese a TFS.
5. Pruebe la última versión.

Ludwo
fuente
0

solo quiero agregar TFS MSBuild no admite caracteres especiales en carpetas, es decir, "@"

había experimentado en el pasado donde una de nuestras carpetas de proyectos se llamaba External @ Project1

creamos una definición de compilación TFS para ejecutar un archivo msbuild personalizado, luego la carpeta del espacio de trabajo no obtiene ningún contenido en la carpeta External @ Project1 durante el último espacio de trabajo. Parece que tfs get está fallando pero no muestra ningún error.

después de alguna prueba y error y renombrar la carpeta a _Project1. voila tenemos archivos en la carpeta (_Project1).

bherto39
fuente
TFS o no, ¡nunca debes usar caracteres especiales en los nombres de las carpetas del proyecto!
Heliac
@ no es especial. Y tampoco lo es%, etc., etc. Es solo la pereza de parte de Microsoft lo que hace que tales caracteres sean tratados de manera diferente a los caracteres 'normales'.
Kevin Whitefoot
0

Herramienta: herramientas eléctricas TFS

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

Comando: tfpt scorch / recursive / delete C: \ LocationOfWorkspaceOrFolder

Aparecerá un cuadro de diálogo que le pedirá que elimine o descargue una lista de archivos. Seleccione o deseleccione los archivos en consecuencia y presione OK. Apariencia en la cuadrícula (CheckBox, FileName, FileAction, FilePath)

Causa: TFS solo se comparará con los elementos del espacio de trabajo. Si se hicieron alteraciones fuera del espacio de trabajo, TFS no se dará cuenta de ellas.

Esperemos que alguien encuentre esto útil. Encontré esta publicación después de eliminar un puñado de carpetas en diferentes ubicaciones. Al no recordar qué carpetas eliminé, excluí la opción habitual de Obtención / Reemplazo de Force que hubiera utilizado.

Mella
fuente
0

En mi caso, Obtener una versión específica, incluso marcar ambas casillas de verificación y deshacer todos los cambios pendientes no funcionó.

Comprobado los espacios de trabajo. Editar el espacio de trabajo actual. Verifica todos los caminos. La ruta de la solución era incorrecta y apuntaba a una carpeta eliminada.

Se corrigió el camino y la última funcionó bien.

Himanshu Patel
fuente
0

Vaya con el botón derecho: Avanzado> Obtener versión específica . Seleccione "Versión más reciente" y ahora, importante, marque dos comprobaciones: ingrese la descripción de la imagen aquí

Las verificaciones son:
Sobrescribir archivos que se pueden escribir que no están verificados

Sobrescribir todos los archivos incluso si la versión local coincide con la versión especificada

Javier FF
fuente
Describa los elementos que deben verificarse en lugar de publicar una captura de pantalla.
Chuck Adams el