- ¿Qué hace exactamente hg copy y qué tratamiento especial hace esto causa en el futuro?
Agrega nuevos archivos y los marca como copias de los archivos anteriores. Debido a que son copias, un cambio realizado en el archivo original se fusionará en copia. El tiempo fluye de izquierda a derecha:
(init) --- (edit a.txt) ---- (a.txt edit is copied to b.txt)
\ /
(hg copy a.txt b.txt)
- Si resulta que hacer 'lo que no debía (TM)' para nuestro caso, ¿cómo puedo desmarcar el archivo como beeing una copia de otro archivo ?
Este mecanismo solo se activa cuando se fusiona. Si b.txt
no está presente en la revisión de antecesor común (init en el gráfico anterior), entonces Mercurial hará haciendo una búsqueda hacia atrás para ver si b.txt
se copia desde otro lugar.
Sigamos el gráfico anterior en forma abreviada:
(i) -- (edit a) -- (a edit copied to b) -- (edit a) -- (merge)
\ / /
(copy a b) --/------- (edit b) ------------------/
La cuestión es cómo se realiza la fusión final. El punto ancestro común ahora es el nodo copy a b
y aquí están presentes a
y b
. Esto significa que no habrá ninguna búsqueda de copias! Por lo tanto, la segunda edición de a
no se combinará en b
.
volver a verificar, lo probé:
$ hg init
$ echo a > a
$ hg add a
$ hg commit -m init
$ hg copy a b
$ hg commit -m "copy a b"
Esta era la copia, b
ahora incluye solamente a
.
$ hg update 0
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ echo aa >> a
$ hg commit -m "edit a"
created a new head
$ hg merge
merging a and b to b
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg commit -m "a edit copied to b"
Esta fue la primera mezcla y la edición en a
ha sido copiado en b
:
$ cat b
a
aa
ahora hacemos cambios en paralelo:
$ echo aaa >> a
$ hg commit -m "edit a again"
$ hg update 3
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo bbb >> b
$ hg commit -m "edit b"
created new head
$ hg merge
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
no hay más copiado hecho :
$ cat a
a
aa
aaa
$ cat b
a
aa
bbb
En cuanto a deshabilitar esto ... no se puede deshabilitar explícitamente la detección de copia . Pero como espero haber ilustrado anteriormente, no te "molestará" de nuevo después de la primera fusión.
Si la primera fusión es un problema, puede usar hg resolve --tool internal:local
para restablecer los archivos a su estado antes de iniciar la fusión. Así que con
$ hg resolve --tool internal:local b
que podríamos haber traído b
en el momento justo que contiene una línea con a
.
También puede leer [Copiar archivos] (http://tortoisehg.bitbucket.org/hgbook/1.7/mercurial-in-daily-use.html#chap:daily.copy) en [Mercurial: The Definitive Guide ] (http://tortoisehg.bitbucket.org/hgbook/1.7/) libro. – Matus