¿Cómo encontrar archivos sin seguimiento en un árbol de Perforce? (análogo del estado svn)

87

¿Alguien tiene un script o alias para encontrar archivos sin seguimiento (en realidad: sin agregar) en un árbol de Perforce?

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

David Joyner
fuente
11
No 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
3
¡Oh, por llorar en voz alta! Lo aceptado p4 statusno solo ENCUENTRA archivos sin seguimiento, sino que EMPIEZA A SEGUIRLOS. Es decir, p4 statusno es una consulta de solo lectura, como uno sospecharía por el nombre, sino que en realidad es un comando que cambia cosas, no los archivos del espacio de trabajo. Esto NO es lo que debería hacer un comando de estado, y NO lo que svn statushace. Lo más parecido a lo que puedo encontrar svn statuses p4 reconcile -na- -a para decir "archivos que deben agregarse", -n para decir "en realidad no cambien nada". /// Originalmente dije algo mucho más fuerte.
Krazy Glew
1
Reviví stackoverflow.com/questions/9642531/... , que fue marcado incorrectamente como un duplicado de stackoverflow.com/questions/9272/... , como nueva pregunta (¿Cuál es el orden p4 equivalente a algo así como git / hg / bzr / SVN estado? (Pista: no p4 status) , y lo respondí yo mismo. Mejor bienvenida
Krazy Glew
Ambos p4 reconciley p4 statusson lentos como el infierno, mientras git statusterminan de ejecutarse en 1-3 segundos.
zwcloud

Respuestas:

81

EDIT: Utilice p4 statusahora. Ya no hay necesidad de saltar por el aro. Vea la respuesta de @ConelPanic .

En la versión de enero de 2009 de P4V, puede hacer clic con el botón derecho en cualquier carpeta del árbol de su espacio de trabajo y hacer clic en "conciliar trabajo sin conexión ..."

Esto hará un pequeño procesamiento y luego mostrará una vista de árbol dividido de los archivos que no están desprotegidos pero que tienen diferencias con la versión del depósito, o que no están registrados en absoluto. Incluso puede haber algunas otras categorías que surjan.

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

Es una herramienta muy útil que me salvó el trasero varias veces.

EDITAR: ah, la pregunta se hizo específicamente sobre los scripts, pero dejaré esta respuesta aquí por si acaso.

tenpn
fuente
Se agregó una solución de PowerShell en esta pregunta: stackoverflow.com/questions/3217152/…
tenpn
¿Esto difiere cada archivo con la versión en el repositorio? Tengo un gran repositorio y una conexión lenta (cuando trabajo desde casa). ¡Esto podría llevar una eternidad!
gdw2
No creo que sea una diferencia completa, pero no es rápida.
tenpn
10
¡Oh, por llorar en voz alta! p4 statusno solo ENCUENTRA archivos sin seguimiento, sino que EMPIEZA A SEGUIRLOS. Es decir, p4 statusno es una consulta de solo lectura, como uno sospecharía por el nombre, sino que en realidad es un comando que cambia cosas, no los archivos del espacio de trabajo. Esto NO es lo que debería hacer un comando de estado, y NO lo que svn statushace. Lo más parecido a lo que puedo encontrar svn statuses p4 reconcile -na- -a para decir "archivos que deben agregarse", -n para decir "en realidad no cambien nada". /// Originalmente dije algo mucho más fuerte.
Krazy Glew
1
p4 statuses básicamente un sinónimo de p4 reconcile -n. ¿Quizás corriste p4 status -Acuál es sinónimo de p4 reconcile?
Samwise
50

En linux, o si tiene gnu-tools instalado en Windows:

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

Esto mostrará un mensaje de error para cada archivo no contabilizado. Si desea capturar esa salida:

find . -type f -print0 | xargs -0 p4 fstat >/dev/null 2>mylogfile
Mark Harrison
fuente
1
Redirigir stderr a stdout le permitirá realizar un filtrado adicional u otras operaciones. Por ejemplo, para ver una lista desplazable de archivos Java: busque. -tipo f -print0 | xargs -0 p4 fstat 2> & 1> / dev / null | grep '\ .java' | menos
Jon Nadal
2
Esto lleva muchísimo tiempo en mi espacio de trabajo de 60K archivos. He escrito un script de Python que hace el mismo trabajo en menos de 10 segundos: p5 . También admite .p4ignorey puede obtener una vista previa y editar automáticamente archivos sin seguimiento / modificados / eliminados.
hamstergene
@hamstergene, ¡muy bonito!
Mark Harrison
Escribió un pequeño script que hace exactamente eso si alguien está interesado (incluido el argumento dir, el argumento de profundidad máxima y la salida a stdout).
Arnon Zilca
Gracias; ¡Encontré esto útil! Tenga en cuenta que esto no maneja los enlaces simbólicos ( find . -type l) y proporciona una salida engañosa para los archivos P4 agregados a la fuerza porque contienen los caracteres @o %. Sin embargo, estos archivos son una minoría, por lo que una revisión manual de estos casos extremos funcionará en la mayoría de los casos.
CJBS
19

Bajo 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 agregaron en su cliente o en el depósito de Perforce. Solía ! -name '*~'excluir archivos que terminan en ~.

ahu
fuente
12

Ahh, uno de los clásicos de Perforce :) Sí, realmente apesta que TODAVÍA no haya una manera fácil de hacerlo integrado en los comandos predeterminados.

La forma más sencilla es ejecutar un comando para buscar todos los archivos en la raíz de su cliente y luego intentar agregarlos al depósito. Terminará con una lista de cambios de todos los archivos nuevos y los archivos existentes se ignorarán.

Por ejemplo, dir / s / b / AD | 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 archivo), puede canalizar los resultados de una diferencia (o agregarlos si también los desea 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.

Andrew Grant
fuente
11

¿Existe un análogo de svn statuso git status?

Sí, PERO .

A partir de la versión 2012.1 de Perforce, existe el comando p4 statusy en P4V 'conciliar el trabajo sin conexión'. Sin embargo, ambos son muy lentos. Para excluir archivos irrelevantes, deberá escribir un p4ignore.txtarchivo según https://stackoverflow.com/a/13126496/284795

Coronel Panic
fuente
1
Ha habido varias mejoras de rendimiento p4 statusdesde la versión 2012.1. Si se ha mantenido alejado p4 statusdebido a problemas de rendimiento, podría valer la pena probarlo nuevamente para ver cómo se comporta ahora.
Bryan Pendleton
7

Me siento impulsado a agregar una respuesta, ya que la respuesta aceptada, y algunas de las otras, tienen lo que creo que es un problema significativo: no entienden la diferencia entre un comando de consulta de solo lectura y un comando que hace cambios.

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

--- + BREVE

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

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

-ndice "no hacer cambios", es decir, un ensayo. (Aunque los mensajes pueden decir "abierto para agregar", mentalmente debes interpretarlo como "se abriría para agregar si no es -n")

Probablemente la forma más conveniente para encontrar todos los cambios locales hechos sin conexión - no sólo los archivos que necesitan poder ser agregado, sino también archivos que necesitan fuerzas para eliminar, o que hayan sido cambiado sin ser abierto para la edición a través de p4 edit, es p4 reconcile -n.

Varias respuestas proporcionaron guiones, a menudo involucrando p4 fstat. Si bien no he verificado todos esos scripts, a menudo utilizo scripts similares para compensar las deficiencias de los comandos forzosos como p4 reconcile -n, por ejemplo, a menudo encuentro que quiero rutas locales en lugar de rutas de depósito de Perforce o rutas de espacio de trabajo.

--- + ADVERTENCIA

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

p4 statusNO es una consulta de solo lectura. p4 statusde hecho, encuentra el mismo tipo de cambios que lo p4 reconcilehace y los agrega al repositorio. p4 statusno parece tener una -nopción de ejecución en seco como la p4 reconciletiene.

Si lo hace p4 status, mire los archivos y piense "Oh, no los necesito", entonces tendrá que p4 revertusarlos si desea continuar editando en el mismo espacio de trabajo. De lo contrario, los cambios que se p4 statusagregaron a su conjunto de cambios se verificarán la próxima vez.

Parece que hay poca o ninguna razón para usar en p4 statuslugar de p4 reconcile -n, excepto por algunos detalles del espacio de trabajo local frente al nombre de la ruta del depósito.

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

--- + P4VGUI

En la GUI p4v, el comando reconciliar encuentra cambios locales que pueden necesitar ser agregados, eliminados o abiertos para editarlos. Afortunadamente, no los agrega a una lista de cambios de forma predeterminada; pero es posible que desee tener cuidado de cerrar la ventana de conciliación después de inspeccionarla, si no desea confirmar los cambios.

Krazy Glew
fuente
El estado p4 no parece agregar archivos. parece funcionar y está documentado como 'reconciliar -n'. ¿Estás seguro de que cambia las cosas?
kdubs
4

Utilizo lo siguiente en mi herramienta que hace una copia de seguridad de los archivos en el espacio de trabajo que difieren del repositorio (para Windows). Maneja algunos casos extraños que a Perforce no le gustan mucho, como espacios en blanco incrustados, estrellas, porcentajes y marcas de hash:

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 " enumera todos los archivos en o debajo de esta carpeta ( / S ) en formato "desnudo" ( / B ) excluyendo directorios (/ AD ). El " sed " cambia los caracteres peligrosos a su forma " % xx " (a la HTML), y el comando " p4 have " comprueba esta lista (" -x- ") y el servidor descarta cualquier cosa sobre los archivos que realmente ubica en el repositorio. (" 1> NUL: "). El resultado es un montón 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à!

Ross Patterson
fuente
Esta es una gran solución y aún funciona con la versión P4 2015.1
Rian Sanderson
¡muy rapido! find / xargs se queda sin memoria y es lento. Recuerde el doble de% cuando lo agregue al archivo .bat.
Kevinf
4

Alternativamente desde P4Win, use la opción "" Archivos locales no en depósito "en el panel de vista de la izquierda.

No uso mucho P4V, pero creo que el equivalente es seleccionar "Ocultar archivos de espacio de trabajo local" en el menú desplegable de filtros de la pestaña Vista del espacio de trabajo. P4 help fstat

En P4V 2015.1 encontrará estas opciones debajo del botón de filtro como este: ingrese la descripción de la imagen aquí

Greg Whitfield
fuente
Esto solo muestra archivos en el directorio actual, lamentablemente :(
JP P.
2

Quick 'n Dirty: En p4v, haga clic con el botón 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 ahora contendrá todos los archivos que actualmente no forman parte del depósito.

gdw2
fuente
1

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

  • p4 status
  • p4 opened
  • p4 diff -ds
Ruibarbo
fuente
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 no quieras usar su respuesta para limpiar tu espacio de trabajo.

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

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

Jac Goudsmit
fuente
0

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

kevinf
fuente
0

El p4 fstatcomando le permite probar si existe un archivo en el espacio de trabajo, combinar con findpara localizar archivos para verificar como en el siguiente ejemplo de Perl:

// throw the output of p4 fstat to a 'output file'
// find:
//  -type f  :-  only look at files,
//  -print0  :-  terminate strings with \0s to support filenames with spaces
// xargs:
//  Groups its input into command lines,
//  -0       :-  read input strings terminated with \0s
// p4:
//  fstat    :-  fetch workspace stat on files

my $status=system "(find . -type f -print0 | xargs -0 p4 fstat > /dev/null) >& $outputFile";

// read output file
open F1, $outputFile or die "$!\n";

// iterate over all the lines in F1
while (<F1>) {
  // remove trailing whitespace
  chomp $_;

  // grep lines which has 'no such file' or 'not in client'
  if($_ =~ m/no such file/ || $_ =~ m/not in client/){

     // Remove the content after '-'
     $_=~ s/-\s.*//g;

     // below line is optional. Check ur output file for more clarity.
     $_=~ s/^.\///g;

     print "$_\n";
  }
}

close F1;

O puedes usar p4 reconcile -n -m ...

Si está "abierto para eliminar", se ha eliminado del espacio de trabajo. Tenga en cuenta que el comando anterior se ejecuta en modo de vista previa ( -n).

sido una
fuente
1
Por favor, no arroje un código sin ninguna explicación como respuesta, sino que agregue alguna explicación para ayudar al OP a comprender el código y aprender algo. :)
Markus
0

Necesitaba algo que funcionara en Linux, Mac o Windows. Así que escribí un script de Python para ello. La idea básica es recorrer los archivos y ejecutarlos p4 fstaten cada uno. (por supuesto, ignorando las dependencias y las carpetas tmp)

Puede encontrarlo aquí: https://gist.github.com/givanse/8c69f55f8243733702cf7bcb0e9290a9

givanse
fuente
0

Este comando puede darle una lista de archivos que necesitan ser agregados, editados o eliminados:
p4 status -aed ...
también puede usarlos por separado
p4 status -a ...
p4 status -e ...
p4 status -d ...

Hazem Ramadán
fuente
-1

En P4V, en el elemento de menú "Ver", elija "Archivos en carpeta", que abre una nueva pestaña en el panel derecho. En el extremo derecho de las pestañas hay un pequeño icono que abre una ventana llamada "Archivos en carpeta" con 2 iconos. Seleccione el icono de la izquierda que parece un embudo y verá varias opciones. Elija "Mostrar elementos que no están en el depósito" y se mostrarán todos los archivos de la carpeta. Luego, simplemente 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 de costumbre (Ctrl + S).

Ingeniero
fuente