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
enp4 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 puedop4 move newpath newdir/newpath
para recoger la parte "mover/agregar" del cambio pero no puedop4 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?
en cuenta que necesita una versión bastante reciente cliente y el servidor para que esto funcione. Probé esto con 2012.1. – user1054341
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
'p4 fstat' da la información de movimiento requerida. – Day