¿Cómo encontrar archivos sin seguimiento en un árbol de Perforce?(análogo del estado svn)
-
08-06-2019 - |
Pregunta
Alguien tiene un script o alias para encontrarlo sin seguimiento (en realidad:archivos 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.
Solución
EDITAR: Por favor use p4 status
ahora.Ya no hay necesidad de pasar por obstáculos.Ver @ColonelPanic respuesta.
En la versión de P4V de enero de 2009, puede hacer clic derecho en cualquier carpeta del árbol de su espacio de trabajo y hacer clic en "conciliar el trabajo sin conexión..."
Esto procesará un poco y luego mostrará una vista de árbol dividido de los archivos que no están registrados pero que tienen diferencias con la versión de depósito o que no están registrados en absoluto.Incluso puede haber algunas otras categorías que mencione.
Puede hacer clic derecho en los archivos en esta vista y consultarlos, agregarlos o incluso revertirlos.
Es una herramienta muy útil que me ha salvado el culo varias veces.
EDITAR:Ah, la pregunta se refería específicamente a los scripts, pero dejaré esta respuesta aquí por si acaso.
Otros consejos
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 por cada archivo no contabilizado.Si desea capturar esa salida:
find . -type f -print0 | xargs -0 p4 fstat >/dev/null 2>mylogfile
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 están agregados en su cliente o en el depósito de Perforce.he usado ! -name '*~'
para excluir archivos que terminan en ~.
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 se ignorarán los archivos existentes.
Por ejemplo, dir /s /b /ad | P4 -X - Agregar
(use 'buscar'.-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.
¿Existe un análogo de
svn status
ogit status
?
Sí, pero.
A partir de la versión 2012.1 de Perforce, existe el comando p4 status
y en P4V 'conciliar el trabajo offline'.Sin embargo, ambos son muy lentos.Para excluir archivos irrelevantes, deberá escribir un p4ignore.txt
archivo por https://stackoverflow.com/a/13126496/284795
Me siento obligado a agregar una respuesta, ya que la respuesta aceptada, y algunas de las otras, tienen lo que creo que es un problema importante:no entienden la diferencia entre un comando de consulta de sólo lectura y un comando que realiza 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 en mi humilde opinión incorrecta.
---+ BREVE
Probablemente la forma más conveniente de encontrar todos los archivos sin seguimiento en un espacio de trabajo forzado es p4 reconcile -na
.
-a
dice "dame archivos que no estén en el repositorio, es decir.eso habría que añadirlo".
-n
dice "no hacer cambios", es decirun ensayo.(Aunque los mensajes pueden decir "abierto para agregar", mentalmente debes interpretar eso como "se abriría para agregar si no fuera -n")
Probablemente la forma más conveniente de encontrar todos los cambios locales realizados sin conexión, no solo los archivos que podrían necesitar agregarse, sino también los archivos que podrían necesitar eliminarse o que se han modificado sin abrirlos para editarlos a través de p4 edit
, es p4 reconcile -n
.
Varias respuestas proporcionaron guiones, que a menudo incluían p4 fstat
.Si bien no he verificado todos esos scripts, a menudo uso scripts similares para compensar las deficiencias de los comandos forzados, como p4 reconcile -n
- p.ej.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 status
NO es una consulta de solo lectura. p4 status
en realidad encuentra el mismo tipo de cambios que p4 reconcile
lo hace y los agrega al repositorio. p4 status
no parece tener un -n
opción de ejecución en seco como p4 reconcile
hace.
Si lo haces p4 status
, mira los archivos y piensa "Oh, no los necesito", entonces tendrás que p4 revert
ellos si desea continuar editando en el mismo espacio de trabajo.O si no, los cambios que p4 status
agregados a su conjunto de cambios se verificarán la próxima vez.
Parece haber poca o ninguna razón para usar p4 status
en vez de p4 reconcile -n
, excepto por algunos detalles del espacio de trabajo local frente al nombre de ruta del depósito.
Sólo puedo imaginar que quien haya elegido "estado" para un comando que no sea de sólo lectura tuviera un dominio limitado del idioma inglés y otras herramientas de control de versiones.
---+ P4V
GUI
En la interfaz gráfica de usuario p4v
, el comando de reconciliación busca cambios locales que pueden necesitar agregarse, eliminarse o abrirse 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.
Utilizo lo siguiente en mi herramienta que realiza copias de seguridad de cualquier archivo en el espacio de trabajo que difiere 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:
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:
"directorio /S /B /A-D" enumera todos los archivos en o debajo de esta carpeta (/S) en formato "simple" (/B) excluyendo directorios (/ANUNCIO).El "sed"cambia personajes peligrosos a sus"%xx"formulario (al estilo HTML) y el "p4 tiene"El comando comprueba esta lista ("-X-") contra el servidor que 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.
¡Y voilá!
Alternativamente desde P4Win, use la opción "Archivos locales no en Depot" en el panel de vista izquierdo.
No uso mucho P4V, pero creo que el equivalente es seleccionar "Ocultar archivos del espacio de trabajo local" en el menú desplegable de filtros de la pestaña Vista del espacio de trabajo.p4 ayuda fstat
En P4V 2015.1 encontrarás estas opciones debajo del botón de filtro como este:
Rápido y sucio: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 ahora contendrá todos los archivos que actualmente no forman parte del depósito.
Los siguientes comandos producen resultados similares a los de estado, pero ninguno es equivalente a svn status
o git status
, proporcionando un resumen de una línea del estado de cada archivo:
p4 status
p4 opened
p4 diff -ds
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 agregarse.Probablemente lo hagas no Quiero usar 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 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
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 desde su pago.Desde una sincronización limpia y forzada, inicie git init, agregue y confirme todos los archivos localmente.El estado de Git es rápido y mostrará archivos que no se han confirmado previamente.
El p4 fstat
El comando le permite probar si existe un archivo en el espacio de trabajo, combinarlo con find
para 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", entonces se ha eliminado del espacio de trabajo.Tenga en cuenta que el comando anterior se ejecuta en modo de vista previa (-n
).
Necesitaba algo que funcionara en Linux, Mac o Windows.Entonces escribí un script en Python para ello.La idea básica es iterar a través de archivos y ejecutar p4 fstat
en cada.(por supuesto, ignorando las dependencias y las carpetas tmp)
Lo puedes encontrar aquí: https://gist.github.com/givanse/8c69f55f8243733702cf7bcb0e9290a9
En P4V, en el elemento del menú "Ver", elija "Archivos en la carpeta", lo que abre 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 carpeta" con 2 íconos.Selecciona el ícono de la izquierda que parece un embudo y verás varias opciones.Elija "Mostrar elementos que no están en Depot" y se mostrarán todos los archivos de la carpeta.Luego simplemente haga clic derecho en el archivo que desea agregar y elija "Marcar para agregar...".Puedes verificar que esté allí en la pestaña "Pendiente".Simplemente envíelo normalmente (Ctrl+S).