2008-08-12 16 views
82

¿Alguien tiene un script o alias para encontrar archivos sin seguimiento (realmente: sin agregar) en un árbol de Perforce?¿Cómo encontrar archivos sin seguimiento en un árbol de Perforce? (análogo de estado de svn)

EDITAR: Actualicé la respuesta aceptada en esta, ya que parece que P4V agregó soporte para esto en el lanzamiento de enero de 2009.

+11

No me puedo imaginar cómo es que a la herramienta SCM corporativa más utilizada le falta esta funcionalidad. Probablemente todos sus desarrolladores estén usando solo la GUI. – sorin

+2

¡Oh, por gritar en voz alta! El 'status p4 'aceptado no solo ENCUENTRA archivos no rastreados, realmente COMIENZA A SEGUIRLOS. Es decir. 'p4 status' no es una consulta de solo lectura, como uno sospecharía del nombre, sino que en realidad es un comando que cambia cosas, no los archivos del espacio de trabajo. Esto NO es lo que un comando de estado debería hacer, y NO lo que hace 'svn status'. Lo más parecido que puedo encontrar a 'svn status' es' p4 reconciliar -na' - -a para decir "archivos que deberían agregarse", -n para decir "en realidad no cambia nada". /// Originalmente dije algo mucho más fuerte. –

+1

He revivido http: // stackoverflow.com/questions/9642531/what-is-the-p4-command-equivalent-to-something-like-svn-status, que se marcó incorrectamente como un duplicado de http://stackoverflow.com/questions/9272/how- to-find-untracked-files-in-a -force-tree-analogue-of-svn-status, como nueva pregunta [(¿Cuál es el comando p4 equivalente a algo así como git/hg/bzr/svn status? (Sugerencia: no 'p4 status')] (http://stackoverflow.com/questions/39937962/what-is-the-p4-command-equivalent-to-something-like-git-hg-bzr-svn-status-hint) , y lo contesté yo mismo. Mejor recibido –

Respuesta

76

EDITAR: Por favor, use p4 status ahora. Ya no hay necesidad de saltar por los aros. Ver @ ColonelPanic's answer.

En la versión Ene 2009 del P4V, puede hacer clic derecho sobre cualquier carpeta en el árbol de espacio de trabajo y haga clic en "conciliar el trabajo fuera de línea ..."

Esto va a hacer un poco de procesamiento a continuación, llevar una dividida vista en árbol de los archivos que no están desprotegidos pero tienen diferencias con respecto a la versión de depósito, o no se han registrado en absoluto. Incluso puede haber algunas otras categorías que trae a colación.

Puede hacer clic con el botón derecho en los archivos en esta vista y verlos, agregarlos o incluso revertirlos.

Es una herramienta muy útil que me salvó el culo un par de veces.

EDITAR: ah la pregunta sobre los guiones específicamente, pero voy a dejar esta respuesta aquí por si acaso.

+1

Impresionante. Gracias por la actualización! –

+0

Se agregó una solución powershell en esta pregunta: http: // stackoverflow.com/questions/3217152/in-perforce-how-can-i-delete-files-from-a-directory-in- my-workspace-where-the-fil/3219246#3219246 – tenpn

+0

Esto difiere cada archivo contra la versión en el repositorio? Tengo un repositorio grande y una conexión lenta (cuando trabajo desde casa). ¡Esto podría llevar una eternidad! – gdw2

12

Ahh, uno de los clásicos de Perforce :) Sí, realmente apesta que todavía EXISTE una forma fácil de hacerlo en los comandos predeterminados.

La manera más fácil es ejecutar un comando para buscar todos los archivos en la raíz de sus clientes, y luego intentar agregarlos al depósito. Obtendrá una lista de cambios de todos los archivos nuevos y los archivos existentes se ignorarán.

E.g dir/s/b/A-D | p4 -x - agregar

(use 'find. -type f -print' desde una línea de comando nix).

Si desea una lista física (en la consola o el archivo), puede canalizar los resultados de un diff (o agregar si también los quiere en una lista de cambios).

Si está ejecutando esto dentro de P4Win, puede usar $ r para sustituir la raíz del cliente del espacio de trabajo actual.

49

en Linux, o si tiene GNU-herramientas instaladas en las ventanas:

find . -type f -print0 | xargs -0 p4 fstat >/dev/null 

Esto le mostrará un mensaje de error para cada archivo en paradero desconocido. Si desea capturar esa salida:

find . -type f -print0 | xargs -0 p4 fstat >/dev/null 2>mylogfile 
+0

Redirigir stderr a stdout le permitirá realizar filtros adicionales u otras operaciones. Por ejemplo, para ver una lista desplegable de archivos Java: find. -type f -print0 | xargs -0 p4 fstat 2 > & 1>/dev/null | grep '\ .java' | menos –

+2

Esto lleva muchísimo tiempo en mi espacio de trabajo de 60 K. He escrito un script de python que hace el mismo trabajo en menos de 10 segundos: [p5] (https: //github.com/hamstergene/p5). También suppo rts '.p4ignore' y puede previsualizar y editar automáticamente archivos sin seguimiento/cambiados/eliminados. – hamstergene

+0

@hamstergene, muy agradable! –

4

alternativa de P4Win, utilice el "" archivos locales no en Depot" opción en el panel de vista de la mano izquierda

No consumo P4V mucho, pero. Creo que es el equivalente a seleccionar "Ocultar archivos locales de área de trabajo" en el menú desplegable de filtro de la ayuda Área de trabajo tab.p4 fstat

en P4V 2.015,1 usted encontrará estas opciones bajo el botón de filtro como este: enter image description here

+0

Esto solo muestra archivos bajo el directorio actual, por desgracia :( –

18

Unde r Unix:

find -type f ! -name '*~' -print0| xargs -0 p4 fstat 2>&1|awk '/no such file/{print $1}' 

Esto imprimirá una lista de archivos que no se agregan en su cliente o el depósito de Perforce. He usado ! -name '*~' para excluir archivos que terminan en ~.

+0

Me gusta mucho esta solución. Funciona muy bien. – engtech

4

Utilizo lo siguiente en mi herramienta que realiza una copia de seguridad de los archivos en el área de trabajo que difieren del repositorio (para Windows). Se ocupa de algunos casos extraños que Perforce no le gusta mucho, como espacios en blanco incrustados, estrellas, porcentajes y hashmarks:

dir /S /B /A-D | sed -e "s/%/%25/g" -e "s/@/%40/g" -e "s/#/%23/g" -e "s/\*/%2A/g" | p4 -x- have 1>NUL: 

"dir/S/B/AD" listas de todos los archivos en o por debajo de esta carpeta (/S) en formato "vacío" (/B) excluyendo directorios (/ AD).La "sed " cambios de personajes peligrosos a su "xx %" forma (al estilo de HTML), y los "p4 tener" comando comprueba esta lista ("-x-") contra el servidor de desechar nada acerca de los archivos que realmente ubica en el repositorio ("1> NUL:"). El resultado es un grupo de líneas como:

Z:\No_Backup\Workspaces\full\depot\Projects\Archerfish\Portal\Main\admin\html\images\nav\navxx_background.gif - file(s) not on client. 

Et voil & agrave ;!

+0

Esta es una gran solución, y aún funciona con P4 versión 2015.1 –

+0

muy rápido! find/xargs se queda sin memoria y lento. Recuerda doblar% cuando se agrega al archivo .bat – kevinf

1

Quick 'n Dirty: en p4v haga clic derecho en la carpeta en cuestión y agregue todos los archivos debajo de ella a una nueva lista de cambios. La lista de cambios contendrá ahora todos los archivos que actualmente no forman parte del depósito.

+0

Lo suficientemente rápido como para justificar un voto positivo, pero sucio. –

9

¿Hay un análogo de svn status o git status?

Sí, PERO.

A partir de la versión 2012.1 de Perforce, existe el comando p4 status y en P4V 'conciliar el trabajo fuera de línea'. Sin embargo, ambos son muy lentos. Para excluir archivos irrelevantes que necesita para escribir un archivo p4ignore.txt por https://stackoverflow.com/a/13126496/284795

+0

Ha habido varias mejoras de rendimiento en el estado 'p4' desde la versión 2012.1. Si se ha mantenido alejado del estado 'p4' debido a problemas de rendimiento, podría valer la pena probarlo nuevamente para ver cómo se comporta ahora. –

-1

En P4V, bajo el punto de menú "Ver" elija "archivos de la carpeta", que nos lleva a una nueva pestaña en el panel derecho. En el extremo derecho de las pestañas hay un pequeño ícono que abre una ventana llamada "Archivos en la carpeta" con 2 íconos. Seleccione el icono de la izquierda que se parece a un embudo y verá varias opciones. Elija "Mostrar elementos que no están en el almacén" y se mostrarán todos los archivos en la carpeta. Luego haga clic con el botón derecho en el archivo que desea agregar y elija "Marcar para agregar ...". Puede verificar que esté allí en la pestaña "Pendiente". Simplemente envíe como normal (Ctrl + S).

0

No tengo suficientes puntos de reputación para comentar, pero la solución de Ross también enumera los archivos que están abiertos para agregar. Probablemente lo haga no desea utilizar su respuesta para limpiar su espacio de trabajo.

los siguientes usos p4 fstat (gracias Mark Harrison) en lugar de p4 have, y enumera los archivos que no están en el depósito de y no están abiertos para complemento.

dir /S /B /A-D | sed -e "s/%/%25/g" -e "s/@/%40/g" -e "s/#/%23/g" -e "s/\*/%2A/g" | p4 -x- fstat 2>&1 | sed -n -e "s/ - no such file[(]s[)]\.$//gp" 

=== Jac

1

Los siguientes comandos producen salida de estado similar, pero ninguno es bastante equivalente a svn status o git status, proporcionando un resumen de una línea sobre el estado de cada archivo:

  • p4 status
  • p4 opened
  • p4 diff -ds
4

Me siento obligado a agregar una respuesta, ya que la respuesta aceptada, y algunas de las otras, tienen lo que considero un problema importante: no entienden la diferencia entre un comando de consulta de solo lectura y un comando que hace cambios

No espero ningún crédito para esta respuesta, pero espero que ayude a otros a evitar perder el tiempo y cometer errores siguiendo la respuesta incorrecta pero en mi humilde opinión aceptada.

--- + Breve

Probablemente la forma más conveniente para encontrar todos los archivos sin seguimiento en un espacio de trabajo es forzosamente p4 reconcile -na.

-a dice "dame archivos que no están en el repositorio, es decir, que deberían agregarse".

-n dice "no hacer cambios", es decir, una ejecución en seco. (Aunque los mensajes pueden decir "abierto para agregar", mentalmente debe interpretar eso como "se abriría para agregar si no -n")

Probablemente la forma más conveniente de encontrar todos los cambios locales realizados sin conexión, no solo los archivos que pueden necesitar ser agregados, pero también los archivos que podrían necesitar ser eliminados, o que han sido modificados sin abrirse para su edición a través del p4 edit, es p4 reconcile -n.

Varias respuestas proporcionan secuencias de comandos, a menudo con p4 fstat. Si bien no he verificado todos esos scripts, a menudo utilizo scripts similares para compensar las deficiencias de los comandos forzados, como p4 reconcile -n, p. Ej. a menudo me parece que quiero rutas locales en lugar de vías de acceso de depósito de Perforce o de espacio de trabajo.

--- + ADVERTENCIA

p4 status NO es la contrapartida de los comandos de estado de otros sistemas de control de versiones.

p4 status NO es una consulta de solo lectura. p4 status realmente encuentra el mismo tipo de cambios que p4 reconcile y los agrega al repositorio. p4 status no parece tener una opción de ejecución en seco -n como p4 reconcile.

Si lo hace p4 status, mire los archivos y piense "Ah, no los necesito", entonces tendrá que p4 revert si desea seguir editando en el mismo espacio de trabajo. O bien, los cambios que p4 status agregaron a su conjunto de cambios se verificarán la próxima vez.

Parece que hay pocas o ninguna razón para usar p4 status en lugar de p4 reconcile -n, excepto por algunos detalles del espacio de trabajo local frente al nombre de ruta del almacén.

Solo puedo imaginar que quien eligió 'estado' para un comando que no sea de solo lectura tenía un comando limitado del idioma inglés y otras herramientas de control de versiones.

--- + P4V GUI

En la GUI p4v, el comando de conciliación encuentra cambios locales que pueden necesitar ser añadido, eliminado o abierto para su edición. Afortunadamente no los agrega a una lista de cambios por defecto; pero aún así debería tener cuidado de cerrar la ventana de conciliación después de inspeccionarla, si no desea confirmar los cambios.

0

Método rápido, pero poco ortodoxo. Si la base de código no agrega nuevos archivos/cambia de vista con demasiada frecuencia, puede crear un repositorio 'git' local de su salida. Desde una sincronización limpia y clara, git init, agregue y comprometa todos los archivos localmente. El estado de Git es rápido y mostrará los archivos no comprometidos previamente.

0

// tirar la salida del fstat p4 a un 'archivo de salida'

mi estado $ = sistema "(Encontrar type f -print0 |. Xargs -0 p4 fstat>/dev/null)> & $ outputFile ";

// leer el archivo de salida abrir F1, $ outputFile or die "$! \ N";

while (<F1>){ 
    chomp $_; 

líneas // grep que tiene 'no existe el fichero' o 'no en el cliente'

if($_ =~ m/no such file/ || $_ =~ m/not in client/){ 

// Eliminar el contenido después '-'

 $_=~ s/-\s.*//g; 

// más adelante la línea es opcional Verifique su archivo de salida para mayor claridad. $ _ = ~ s /^./// g;

 print "$_\n"; 
    } 
} 
close F1; 

O puede utilizar conciliar -n -m ...

Si se 'abre para eliminar' entonces se ha retirado del espacio de trabajo. Tenga en cuenta que el comando anterior se está ejecutando en modo de vista previa ('-n').

+1

Por favor, no solo arroje un código sin ninguna explicación como respuesta, sino agregue algunas explicaciones para ayudar al OP a entender el código y aprender algo. :) – Markus

Cuestiones relacionadas