TFS: ¿Cómo puede deshacer el pago de archivos no modificados en un archivo por lotes?

172

Usamos un archivo por lotes para generar código, y desprotege automáticamente los archivos generados desde Team Foundation Server (TFS) para que pueda regenerarlos. La mayoría de estos archivos no se modifican, pero el generador no lo sabe con anticipación.

El comando "tfs deshacer" deshace el pago, pero pregunta si algunos han sido modificados (lo que no queremos hacer). Tampoco queremos registrar los archivos generados de inmediato.

¿Existe un comando (o una serie de comandos) para deshacer el pago de todos los archivos no modificados sin avisar al usuario?

Robert Wagner
fuente
Tenga en cuenta que deshacer manualmente todos los cambios con la expectativa de elegir "No a todos" cuando se le solicite sobre los archivos que han cambiado no funcionará correctamente, ya que deshacerá los ADDcambios sin preguntar (consulte la respuesta de Ray ).
Elaskanator

Respuestas:

202

Eche un vistazo al comando Deshacer sin cambios de Team Foundation Server Power Tools Agosto de 2011

c:\myProject> tfpt uu . /noget /recursive

Gracias Matt Florence por la actualización del enlace.

Gracias Ray Vega por la sintaxis real .

Mike Chaliy
fuente
1
Esto debe ser editado / fusionado para contener la información de uso como parte del contenido de la respuesta.
mcw
44
Realmente quieres leer esta publicación: aaubry.net/undo-checkout-on-unchanged-files-tfs.html
Byron Whitlock
17
hmm, algo que casi todo el mundo hace varias veces al día: "Vamos a ponerlo en un instalador separado llamado Power Tools" ... suspiro
vidstige
1
@ Mike Chaliy, pensarías. Estoy probando TFS en este momento, estaba buscando cómo hacer esto y terminé aquí.
vidstige
3
No funciona si sus cambios son fusiones. Parece que tfpt uu siempre considera que una fusión es un cambio real, incluso si no hay cambio de archivo, y no hay opción para cambiar ese comportamiento. Está bien como comportamiento predeterminado, pero a veces no es lo que quieres.
user1164178
124

Instale Team Foundation Server Power Tools y ejecute lo siguiente desde la línea de comandos usando tfpt.exe en la raíz del directorio del espacio de trabajo de su proyecto:

c:\myProject> tfpt uu . /noget /recursive

Incluyendo /nogetes muy recomendable ya que impide una forzados 'recibir las últimas' de todos los archivos de su proyecto, que dependiendo del número total puede tomar un tiempo extremadamente largo.

Rayo
fuente
12
Esta debería ser la respuesta aceptada, tiene todos los detalles relevantes (como lo demuestra la puntuación más alta).
rikoe 01 de
77
Frio. Además, ¿por qué no agregar esto como una 'Herramienta externa' permanente a Visual Studio? Tomando esto como ejemplo: blog.kurtschindler.net/post/… Comando: [su directorio de instalación] \ TFPT.EXE Argumentos: uu. / noget / recursive Directorio inicial: $ (SolutionDir)
rohancragg
12
La pregunta especifica hacer esta operación sin el aviso , pero ninguna de las respuestas parece abordar esto. Si necesita esto, la opción adicional / noprompt es la que está buscando. ¡Falta la documentación de PowerTools! Enumera esta opción para algunos de los comandos, pero no este (UU). ¡Tener cuidado!
Johnny Kauffman
1
@ user20358 ya sea cda donde está su directorio de espacio de trabajo (por ejemplo, el mío era c:\myProject) o incluirlo explícitamente después uu(reemplazar el período .con él)
Ray
¿Tiene esto un interruptor de fuerza, como / Y o / force? Siempre me preguntan si realmente quiero deshacerlo, y me gustaría tener eso automatizado. Poner / Y allí, pero me dice que la Opción Y requiere un valor.
Squirrelkiller
118

Gracias @mike & @ray,

Deseo hacerlo más fácil.

En VS, en el menú Herramientas, haga clic en "Herramientas externas".

Herramientas externas

Haz clic en Agregar.

Ingrese el título.

Comando: tfpt.exe

Argumentos: uu. / noget / recursivo

Directorio inicial: [puede elegir desde el botón de flecha].

Deshacer sin cambios en la solución

Deshacer sin cambios en el proyecto

Se agregan dos nuevos comandos al menú Herramientas.

Úselos cuando sea necesario.

Disfrutar,

Ofir

Ofir
fuente
3
Muy genial. También puede ir un paso más allá y agregar un acceso directo. Observe qué tan abajo está su comando agregado (por ejemplo, puede ser el cuarto). Luego a Herramientas -> Opciones -> Entorno -> Teclado -> y escriba el cuadro de texto 'Mostrar comandos que contienen' "Herramientas.Externo" y asigne un acceso directo. Por ejemplo, seleccioné Tools.ExternalCommand4 ya que mi comando para deshacer recién agregado fue el cuarto hacia abajo. Luego asigné teclas de acceso directo Ctrl + Alt + U, Ctrl + Alt + U
Mario
1
¿Podríamos tener una versión actualizada de esto? Si se encuentra tf.exe, pero ¿cuál es el comando uu? me dice Comando no reconocido: uu. Gracias por la ayuda
Shay
1
@Shay: funciona para mí en VS2015 con las últimas herramientas eléctricas TFS instaladas.
Igor Malin
27
  1. Haga clic derecho en su proyecto
  2. Seleccione deshacer pago, luego haga clic en Aceptar, o cualquier confirmación que quede ...
  3. Luego, mientras deshace el pago, para cada archivo que tenga cambios REALES, un mensaje le pedirá que confirme el pago de ese archivo ... simplemente haga clic en "No a todo"

Visual Studio sabrá si el archivo desprotegido tiene cambios o ninguno.

ADVERTENCIA: Este método también elimina archivos nuevos , es decir, archivos que aún no se registraron en TFS. Si desea conservar estos archivos, simplemente debe excluirlos del conjunto de archivos que "deshace".

Ray Lionfang
fuente
14
Be aware that this method also removes added files that are not yet checked in from TFS.... sí, eso es un descalificador bastante inmediato.
shortstuffsushi
1
Funciona para la fusión de ramas sin base. Gracias. Por lo general, en este caso, VS marcó Todos los archivos en la solución como modificados.
KoViMa
2
Esto es un infierno cuando Nuget realiza el pago de un archivo de 10000 que no es necesario actualizar.
Ievgen Naida
13

Se actualizó esta pregunta con una respuesta cuando se trabaja solo con TFS2017 y VS2017 / VS2019 .

Las herramientas eléctricas no existen para TFS 2017 y las antiguas no pueden funcionar bien con ellas, pero aparentemente la mayor parte de la funcionalidad se ha trasladado a VS2017 o a los complementos (ver más abajo).

Extensión Visual Studio 2017/2019

Algunas acciones como deshacer archivos sin cambios se han movido a un

extensión para VS2017

extensión para VS2019

Ubicación del botón "Deshacer sin cambios":

deshacer la ubicación del botón sin cambios

Error conocido

Debe abrir el 'Explorador de control de código fuente' (y dejarlo abierto) para que se muestre 'Deshacer sin cambios' en el menú Acción de la vista Cambios pendientes. reportado aquí .

Extensión de integración de Windows Shell

Además, aún puede configurar la integración de shell de Windows a través de un instalador separado que ya no está vinculado a TFS Power Tools.

La integración de shell de Windows no funciona exactamente igual que las herramientas de herramientas anteriores, pero las acciones más importantes me funcionaron.

Schwarzie2478
fuente
Noté en la pregunta, que quieren escribirlo, porque no tengo una solución, me temo
Schwarzie2478
1
No puedo encontrar la opción "Deshacer sin cambios" en VS2017 después de instalar la extensión vinculada. Me he perdido algo ?
Erzékiel
No lo he usado mucho. Cuando lo usé para probarlo para mi cliente, tuve que hacer clic un poco en Team Explorer y asegurarme de que hubiera cambios para deshacer. Es posible que solo aparezca cuando solo haya cambios pendientes en cola para una confirmación que aparezca esta opción. (o solo una rama cambia) ...
Schwarzie2478
2
@ Erzékiel La opción aparece solo cuando Solution Explorer está abierto y listo.
MatrixRonny
1
Esta extensión funciona a veces y su presencia está vinculada a tener abierto el Explorador de control de origen de TFS y no el Explorador de soluciones (como algunos señalaron erróneamente): no mezcle las dos ventanas de control diferentes. Sin embargo; cuando digo a veces, es porque va y viene. En este momento no lo tengo, lo hice hace un mes. Es un poco defectuoso y me temo que otras extensiones son las culpables, como Resharper y similares.
Christian
8

Si simplemente vuelve a verificar todos los archivos que retiró, TFS es lo suficientemente inteligente como para descubrir cuáles son los cambios y solo incluirlos en el conjunto de cambios que se registra en el servidor.

TFS hace esto comparando los hash MD5 del contenido de los archivos antes y después del check-in.

Todo esto supone que su proceso de generación solo está actualizando el mismo conjunto de archivos, es decir, nunca tendrá el caso en el que un archivo que se generó en una generación anterior no es necesario en la próxima generación (es decir, querría suspender una eliminación para ese archivo) o que los archivos cambien de nombre.

Si su proceso podría necesitar la eliminación de archivos, lo mejor sería mirar el comando Team Foundation Power Tools ( tfpt ) y usar el comando tfpt en línea que solo verificará los archivos que han cambiado y será lo suficientemente inteligente como para pend se elimina para cualquier archivo que ya no sea necesario o que se haya cambiado de nombre y pend agrega.

Buena suerte,

Martín.

Martin Woodward
fuente
66
Gracias por eso, sin embargo, no queremos registrar los archivos modificados en ese momento. Los modificados no deben registrarse hasta que se complete la función, pero los no modificados deben eliminarse para que el desarrollador pueda revisar los cambios.
Robert Wagner
@RobertWagner Si tiene una compilación cerrada, puede cancelar (si no se cancela al detectar un archivo idéntico) cuando recibe la alerta emergente de que los cambios deben construirse primero.
Elaskanator
6

Tenga en cuenta que deshacer TFS no revertirá el valor "Fecha de modificación" del sistema de archivos. Esto es muy frustrante, especialmente si utiliza herramientas como robocopy para sincronizar máquinas remotas. Incluso después de deshacer su desprotección, si guardó el archivo actualizando así el valor de "Fecha de modificación", ese valor actualizado se mantendrá incluso después de deshacer el pago.

Evermeire
fuente
1
Use robocopy o un VCS, usar una mezcla siempre dará inconsistencias. Mucho mejor sería llenar cada máquina desde VCS directamente.
Richard
4

Hay un par de puntos con respecto a la opción uu para tfpt (recomendado en la mayoría de las otras respuestas) que al principio no me quedaron claros. En primer lugar, esta es la ayuda de la línea de comandos a la que se puede acceder con el comandotfpt uu /?

Deshace los cambios pendientes redundantes. Si el estado de un elemento con un cambio pendiente es el mismo que en el servidor, entonces el cambio se deshace.

Uso: tfpt uu [/ changeset: changesetnum] [/ recursive] [/ noget] [filespec ...]

  • / changeset Compare el espacio de trabajo con los estados del elemento en la versión de conjunto de cambios especificada en lugar de la última versión
  • especificación de archivos ... Sólo verifique las especificaciones de archivos enumeradas para ver si hay cambios redundantes
  • / recursive Verifica las especificaciones de archivos especificadas con recursividad completa
  • / noget No ejecute get antes de verificar

La opción / changeset no se puede usar con filespecs o / recursive.

Ahora déjame desglosar el comando que se recomienda en las otras respuestas.

tfpt uu . /noget /recursive
  • tfpt uu especifica que deseamos utilizar el comando 'Deshacer sin cambios'.
  • . indica (supongo) que el directorio de trabajo actual debe usarse como especificación de archivo.
  • /noget asegura que no se llame a 'obtener la última versión' antes de deshacer los archivos sin cambios.
  • /recursivegarantiza que no solo se considerará la especificación de archivos, sino todas las carpetas y archivos secundarios recursivos. Esto parece depender de la especificación del archivo: si no se proporciona ninguno, se procesa todo el espacio de trabajo.

Así que hay un par de cosas a tener en cuenta aquí con respecto al comando desde arriba ...

  • Depende del directorio de trabajo.
  • No procesa todo el espacio de trabajo.

He descubierto que el siguiente comando funciona mejor para mí: procesará todo el espacio de trabajo.

tfpt uu /noget

Tenga en cuenta que todavía depende del directorio de trabajo en que tfpt lo usa para determinar qué espacio de trabajo debe procesarse. Pero siempre que proporcione una ruta a un archivo o carpeta dentro del espacio de trabajo, está listo para comenzar.

Scott Munro
fuente
3

Puedo ver el enfoque de Ray LionFang arriba. No puedo comentar allí ya que no tengo el representante. Si bien me gusta este enfoque, ya que no se requieren cambios en las herramientas, etc.

  1. Haga clic derecho en su proyecto
  2. seleccione deshacer pago, luego haga clic en Aceptar, o cualquier confirmación que quede ...
  3. luego, mientras deshace el pago, para cada archivo que tenga cambios REALES, un mensaje le pedirá que confirme el pago de ese archivo ... simplemente haga clic en "No a todos"
  4. Visual Studio sabrá si el archivo desprotegido tiene cambios o ninguno. Tenga en cuenta que este método también elimina los archivos agregados que aún no se registraron desde TFS ...

....... hay un problema con ese enfoque en que presionar "No a todos" retiene algunos archivos que no se modifican. Parece hacer algo como Deshacer archivos no modificados hasta que llega al primer archivo que está realmente modificado y luego ignora el resto de los archivos no modificados, si eso tiene sentido. Solo he visto este efecto de vez en cuando.

Una posible solución es seguir el proceso anterior, pero en lugar de presionar "No a todos", presione "No" para cada archivo. Dado que esto puede llevar un tiempo dependiendo de la cantidad de archivos con los que esté trabajando, lo que normalmente hago es mantener presionada la tecla "ALT + N", y simplemente acelera a través de todos los archivos mientras deshace TODOS los archivos no modificados.

Ceniza
fuente
tenga en cuenta que esto no se puede enfatizar lo suficiente. Los archivos recién agregados al proyecto también se eliminan con este enfoque. Esto se menciona en varias de las otras respuestas también.
Christian
-20

Según tengo entendido, en TFS si desprotege un proyecto de equipo, se desprotege todo el proyecto y no tiene control de qué archivos se eliminan. Si desea evitar registros en ciertos archivos, puede bloquearlos.

En el trabajo, todos odiamos TFS.

achinda99
fuente
1
Podemos revisar los archivos individuales, y el bloqueo no permitiría que el desarrollador para comprobar en.
Robert Wagner
55
Iba a votar en contra, pero "En el trabajo, todos odiamos a TFS". lo guardé
James