Pregunta

Una pregunta que surge ocasionalmente es cuál es la mejor manera de determinar la lista de cambios con la que sincronizó por última vez en Perforce.Esto suele ser necesario para cosas como inyectar el número de la lista de cambios en la información de revisión mediante el sistema de compilación automática.

¿Fue útil?

Solución

Recomiendo lo contrario para los sistemas de construcción automática:Primero debes obtener la última lista de cambios del servidor usando:

p4 changes -s submitted -m1

luego sincronice ese cambio y regístrelo en la información de revisión.La razon es la siguiente.A pesar de Perforce recomienda lo siguiente para determinar la lista de cambios con la que se sincroniza el espacio de trabajo:

p4 changes -m1 @clientname

señalan algunas trampas:

  • Esto sólo funciona si no has enviado nada desde el espacio de trabajo en cuestión.
  • También es posible que un espacio de trabajo del cliente no esté sincronizado con ninguna lista de cambios específica.

y hay un problema adicional que no mencionan:

  • Si la lista de cambios más alta en la que se produjo la sincronización eliminó estrictamente archivos del espacio de trabajo, se informará la siguiente lista de cambios más alta (a menos que también haya eliminado archivos estrictamente).

Si debe sincronizar primero y grabar después, Perforce recomienda ejecutar el siguiente comando para determinar si los errores anteriores le han afectado;debería indicar que no se sincronizó ni se eliminó nada:

p4 sync -n @changelist_number

Otros consejos

Solo para responder esto yo mismo de acuerdo con la sugerencia de Jeff de usar Stackoverflow como un lugar para guardar fragmentos técnicos...

Desde la línea de comando use:

p4 changes -m1 @<clientname>

Y simplemente reemplácelo con el nombre de la especificación de su cliente.Esto producirá una salida del formulario:

Change 12345 on 2008/08/21 by joebloggs@mainline-client '....top line of description...'

Que se analiza fácilmente para extraer el número de la lista de cambios.

Puede intentar encontrar el número máximo de cambios en el resultado del comando "archivos p4".Sin embargo, el directorio de trabajo no debe contener confirmaciones posteriores a la sincronización.Esto es un poco mejor que

p4 changes -m1 "./...#have"

ya que este último parece ejecutarse en el servidor y puede fallar en árboles de fuentes grandes debido a los límites de "MaxResults".

$ p4 changes -m1 "./...#have"
Request too large (over 850000); see 'p4 help maxresults'.

$ p4 -G files "./...#have" | python c:/cygwin/usr/local/bin/p4lastchange.py
Files: 266948
2427657

donde p4lastchange.py se basa en el código del Usando P4G.py desde la línea de comando presentación de J.T.Goldstone, Kodak Information Network/Ofoto, 15 de abril de 2005.

#! /usr/bin/env python
import sys, os, marshal

if os.name == "nt":
    # Disable newline translation in Windows.  Other operating systems do not
    # translate file contents.
    import msvcrt
    msvcrt.setmode( sys.stdin.fileno(), os.O_BINARY )

lastcl = 0
num = 0
try:
    while 1:
        dict = marshal.load(sys.stdin)
        num = num + 1
        for key in dict.keys():
            # print "%s: %s" % (key,dict[key])
            if key == "change":
                cl = int(dict[key])
                if cl > lastcl:
                    lastcl = cl
except EOFError:
    pass
print "Files: %s" % num
print lastcl

También puedes usar el comando cstat:

p4 ayuda cstat

cstat -- Dump change/sync status for current client

p4 cstat [files...]

Lists changes that are needed, had or partially synced in the current
client. The output is returned in tagged format, similar to the fstat
command.

The fields that cstat displays are:

    change   changelist number
    status   'have', 'need' or 'partial'

p4 changes -m1 @clientname cuál es la forma "recomendada" de hacerlo para mi cliente, toma unos 10 minutos

esto es lo que uso:

p4 cstat ...#have | grep change | awk '$3 > x { x = $3 };END { print x }'

para el mismo cliente tarda 2,1 segundos

Si estás usando P4V puedes hacer esto gráficamente:

  • En la pestaña Panel (Ver->Panel), elija una carpeta y verá una lista de listas de cambios con las que la carpeta aún no está actualizada.Tenga en cuenta el número más bajo (en la fila más alta).
  • Asegúrese de que en el Árbol del espacio de trabajo haya seleccionado la misma carpeta que anteriormente en el Panel.Luego vaya a la pestaña Historial (Ver->Historial) y desplácese hacia abajo hasta el número anotado anteriormente.El número justo debajo de ese número es el número de su lista de cambios actual.

Para una compilación seria (una que se está preparando para prueba), especifique explícitamente la etiqueta deseada o el número de lista de cambios, sincronizar con la etiqueta, e incrustarlo en artefactos de construcción.

Si no se proporciona una lista de cambios (o etiqueta), utilice p4 counter change para obtener el número de cambio actual y registrarlo.Pero todavía necesitas sincroniza todo usando ese número de cambio.

No creo que puedas lograr exactamente lo que quieres, porque en general, un espacio de trabajo completo no está sincronizado con un número de lista de cambios en particular.Se pueden sincronizar explícitamente algunos archivos con revisiones anteriores y luego un único número de lista de cambios no tiene sentido.Por eso un fresco sync es necesario para garantizar que un único número de lista de cambios represente con precisión la versión del código.


Respecto a los comentarios:Sí, mi respuesta está destinada a los administradores de configuración que preparan una compilación para enviarla al control de calidad.Nuestros desarrolladores normalmente no sincronizan como parte de una compilación;hacen una compilación antes de enviarla, para poder asegurarse de que sus cambios no interrumpan la compilación o las pruebas.En ese contexto, no nos molestamos en incrustar una etiqueta de repositorio.

Con su enfoque, está asumiendo que todo su espacio de trabajo se sincronizó con el encabezado en el momento del último envío de su lista de cambios, y que esa lista de cambios incluía todos sus archivos abiertos.Es muy fácil equivocarse en esas suposiciones, es difícil de detectar y es terriblemente costoso en términos de tiempo perdido.Por otro lado, solucionar el problema es sencillo y no presenta inconvenientes.Y debido a que un número de lista de cambios se puede especificar explícitamente, no importa qué revisión necesite o qué tan rápido cambie el código base.

Para todo el depósito (no solo su espacio de trabajo/cliente)

p4 counter change

hace el trabajo, simplemente contando la última lista de cambios.

Lo mejor que he encontrado hasta ahora es sincronizar con cualquier lista de cambios que desee crear y luego usar cambios -m1 //...#have para obtener la lista de cambios local actual (revisión).

P4 Sync @changelist_num P4 cambia -m1 //...#have | Awk '{imprimir $ 2}'

Te proporciona el número de la lista de cambios que puedes usar donde quieras.Actualmente estoy buscando una forma más sencilla que los cambios de p4 -m1 //...#have.

No estoy seguro de haber obtenido la respuesta que necesitaba, pero tuve un problema similar.El objetivo era escribir en nuestro registrador la versión específica del proyecto.El problema era que mientras creamos nuestro propio archivo MAKE, nuestra gestión de configuración controla el sistema de compilación general.Esto significa que todas las soluciones que dicen "sincronizar con algo y luego hacer algo" realmente no funcionan y no quería cambiar manualmente la versión cada vez que confirmamos (una fuente segura de errores).La solución (que en realidad se insinúa en algunas de las respuestas anteriores) es la siguiente:En nuestro makfile, hago p4 cambios -m1 "./...#have" El resultado para esto es cambiar el cambio_number en la fecha por el usuario@client 'msg' Simplemente creo el mensaje en una cadena imprimida por el logger ( El número de cambio es el elemento importante, pero el otro también es útil para decidir rápidamente si una determinada versión contiene cambios que sabe que se ha hecho sin que se realice una perforación para verificar).Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top