2011-12-16 15 views
11

Hace poco hicimos un hg copy de un directorio en nuestro repositorio. Pensamos que hace algo así como cp -a y hg add y tal vez marcar de alguna manera que este archivo ha sido copiado de otro archivo dentro del repositorio (para que hg annotate muestre el committer original). Pero ahora parece que hg copy hace más o cosas diferentes que eso. Realmente no pude encontrar sobre cómo funciona exactamente la copia. Por lo tanto:¿Qué hace la copia hg?

  • ¿Qué hace exactamente hg copy hacer y qué tratamiento especial hace esto causa en el futuro?
  • Si resulta que se hace "lo incorrecto (tm)" en nuestro caso, ¿cómo puedo desmarcar el archivo como una copia de otro archivo?

(Esta pregunta se hizo en la lista de correo Mercurial, es posible que desee follow the original thread también.)

+0

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

Respuesta

14
  • ¿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.

+0

Lo sentimos, ** no puedo ** confirmar los cambios de copia en los cabezales de combinación en la prueba * my *. '> hg versión Mercurial Distributed SCM (versión 2.0.1)' –

+0

¿No está también en la primera combinación? Por favor escriba [email protected] para que podamos analizarlo en su totalidad, eso es mucho mejor que estos pequeños cuadros de comentarios :) –

+0

"¿También no está en la primera fusión?" - si. correo electrónico anotado, el mensaje se enviará (con registros) –