2012-08-17 16 views
11

Contexto: Alguien realiza un trabajo de reestructuración en un depósito de Perforce grande en desarrollo activo y p4 move s archivos mientras se están trabajando. Todos los demás deben mantener sus cambios pendientes, pero moverlos a las nuevas ubicaciones en la nueva estructura de directorios.Perforce: Cómo resolver los cambios pendientes cuando los archivos se han movido por otro cambio enviado

Considere mi lista de cambios pendiente con agrega, edita, elimina y movimientos de varios archivos.

Si otro usuario envía un p4 move de todos esos archivos en un subdirectorio, mientras mi lista de cambios aún está pendiente, ¿cómo puedo resolver para que los mismos cambios se apliquen a los mismos archivos en su nueva ubicación?

Después de otro usuario mueve los archivos y hago un p4 sync lo que hace que los archivos en su nueva ubicación en mi espacio de trabajo, p4 resolve simplemente dice que hay No file(s) to resolve.

He tratado de hacer un p4 move path newdir/path para cada archivo en mi cambio, esto no funciona bien:

  • Archivos he añadido se mueven a ser un complemento en la nueva ubicación. BUENO.
  • Los archivos que he editado requieren el uso del indicador -f en p4 move (sin él, obtiene //depot/newdir/path - is synced; use -f to force move). DE ACUERDO.
  • Los archivos que he eliminado no se pueden mover (//depot/path - can't move (already opened for delete)). MALO
  • Los archivos que he movido no se pueden mover nuevamente. Si mi cambio pendiente se movía de //depot/path a //depot/newpath, y el otro cambio se ha movido //depot/path a //depot/newdir/path entonces puedo p4 move newpath newdir/newpath para recoger la parte "mover/agregar" del cambio pero no puedo p4 move path newdir/path para recoger también el "mover/eliminar "parte del cambio (el mismo error que en el punto anterior). MALO.

Si los comandos p4 no funcionan, tendré que extraer el bash-fu para mover archivos y unir los comandos correctos. Necesito una solución automatizada, ya que puede haber una gran cantidad de cambios pendientes en una gran cantidad de usuarios afectados por la mudanza, y todos deben resolverse lo más fácilmente posible.

También consideré adaptar el método Working Disconnected From The Perforce Server para aplicar mis cambios en la nueva ubicación, pero esto pierde los metadatos "mover" y, más importante aún, no funcionará si varias personas tienen que hacer lo mismo que ellos Tendré que resolver con los cambios que haga yo si me presento antes que ellos.

Si quieres jugar junto con un ejemplo de juguete, que aquí son de mi examen reproducción pasos de caso:

# Get p4 client and server, install in path (~/bin for me) 
cd ~/bin 
wget http://www.perforce.com/downloads/perforce/r12.1/bin.linux26x86/p4 
chmod +x p4 
wget http://www.perforce.com/downloads/perforce/r12.1/bin.linux26x86/p4d 
chmod +x p4d 

# Start p4 server in a test area (server dumps files in CWD) 
mkdir -p ~/p4test/server 
cd ~/p4test/server 
p4d& 
sleep 3 
export P4PORT=localhost:1666 
unset P4CONFIG # In case you use elsewhere :) 

# Create some default client specs and workspaces for them. 
mkdir ../workspace1 
cd ../workspace1 
export P4CLIENT=client1 
p4 client -o | p4 client -i 
mkdir ../workspace2 
cd ../workspace2 
export P4CLIENT=client2 
p4 client -o | p4 client -i 

# Create files and commit initial depot from client1 
cd ../workspace1 
export P4CLIENT=client1 
for i in 1 2 3 4; do echo "This is file $i" > file$i; done 
p4 add file* 
p4 submit -d 'Initial files' 

# Now make some changes to the files. But do not submit - leave pending. 
# Add 
echo "New file 0" > file0 
p4 add file0 
# Edit 
p4 edit file1 
echo "Edited $(date)" >> file1 
# Delete 
p4 delete file2 
# Move 
p4 edit file3 
p4 move file3 file3.1 

# Pending changelist looks like this: 
# p4 opened 
#//depot/file0#1 - add default change (text) 
#//depot/file1#1 - edit default change (text) 
#//depot/file2#1 - delete default change (text) 
#//depot/file3#1 - move/delete default change (text) 
#//depot/file3.1#1 - move/add default change (text) 

# Meanwhile, in client2, another user moves everything to a new dir 
cd ../workspace2 
export P4CLIENT=client2 
p4 sync 
p4 edit file* 
p4 move ... main/... 
p4 submit -d 'Move everything to new "main" directory' 

# Now what happens in client1? 
cd ../workspace1 
export P4CLIENT=client1 
p4 sync 

# //depot/file4#1 - deleted as /home/day/p4test/workspace1/file4 
# //depot/file1#1 - is opened for edit - not changed 
# //depot/file2#1 - is opened for delete - not changed 
# //depot/file3#1 - is opened for move/delete - not changed 
# //depot/file3.1#1 - is opened for move/add - not changed 
# //depot/main/file1#1 - added as /home/day/p4test/workspace1/main/file1 
# //depot/main/file2#1 - added as /home/day/p4test/workspace1/main/file2 
# //depot/main/file3#1 - added as /home/day/p4test/workspace1/main/file3 
# //depot/main/file4#1 - added as /home/day/p4test/workspace1/main/file4 
# [email protected]:~/p4test/workspace1$ tree 
# . 
# ├── file0 
# ├── file1 
# ├── file3.1 
# └── main 
#  ├── file1 
#  ├── file2 
#  ├── file3 
#  └── file4 
# 
# 1 directory, 7 files 

# Now ... how to resolve? 

Respuesta

7

En teoría, ahora debería ser capaz de hacer esto:

p4 move -f ... main/...    # meld your opened files to their renamed files 
p4 move -f main/file3.1 main/file3 # meld your renamed file to their renamed file 
p4 revert '*'      # revert your now-spurious pending deletes 
p4 move main/file3 main/file3.1  # move their renamed file to the name you wanted 
p4 resolve       # merge their edits with your edits 

Pero parece haber un error con ese tercer 'movimiento de p4', y está descartando la resolución pendiente en main/file3.1 (fka main/file3).

Sin embargo, parece que no funciona bien si lo haces en este orden:

p4 move -f ... main/... 
p4 move -f main/file3.1 main/file3 
p4 revert '*' 
p4 resolve 
p4 move main/file3 main/file3.1 
+1

en cuenta que necesita una versión bastante reciente cliente y el servidor para que esto funcione. Probé esto con 2012.1. – user1054341

+0

Eso funciona gracias. ¿Cómo puedo automatizar los comandos 'p4 move' que migran el cambio de nombre al nuevo directorio (file3 => file3.1 en mi ejemplo de juguete, los comandos segundo y tercero' p4 move' en su solución). Tendría que trabajar con los archivos "desde" y "desde" a partir de la salida de 'p4 abierto' pero esto no le da suficiente información para que no pueda resolverlo si hay más de un movimiento de archivo en la lista. ¿Algunas ideas? – Day

+2

'p4 fstat' da la información de movimiento requerida. – Day

Cuestiones relacionadas