2008-12-02 11 views
27

Ejemplo:¿Cuáles son los usos de svn copy?

$ svn copy foo.txt bar.txt 
A bar.txt 
  • ¿Cuándo utilizar esta técnica, y por qué?
  • ¿Este comando (tomado del "libro rojo" de svn) crea una copia de <foo.txt> conservando el historial del mismo para ser compartido con <bar.txt>?
  • Si cambio <bar.txt>, ¿qué pasará con <foo.txt>?

¿Cuáles son los equivalentes a esto en otros sistemas modernos (Clearcase, Accurev, Perforce)?

Déjenme enfatizar el punto que estoy buscando:
¿Este tipo de ramificación se extiende a nivel de archivo?
Qué sucede si lo usa en la misma rama, es decir, crea una copia de un archivo y luego comienza a cambiar ese nuevo archivo. todos en la misma rama?
Entiendo que también se usa para etiquetar, pero lo que me interesa es qué esperar al realizar <svn copy> en el nivel de archivo.

Respuesta

37

Además de ramificar/etiquetar, también puede usarlo cuando divide un archivo en dos. En este caso, ambos archivos nuevos tendrán historial y podrás ver el código antes de la división.

BTW: esa es una de las pocas características que tiene SVN, pero Git no (Git intentará adivinar el origen del código después del hecho, especialmente si agrega -C a los comandos).

+2

Bien, no he visto eso antes. –

+0

Aparentemente, Git puede hacer esto: consulte la [respuesta] de Dustin (http://stackoverflow.com/a/335791/44390). – mskfisher

+1

@mskfisher Git hace eso adivinando qué archivos se ven similares (si habilita la opción/configuración '-C'), no almacenando metadatos explícitos sobre el origen del archivo. Si modifica demasiadas líneas, entonces git no podrá resolverlo (para evitarlo, realizo dos confirmaciones: una con la copia de archivo sin cambios y la segunda con los cambios que quería hacer, pero eso no es muy elegante). – Kornel

23

¿Cuándo utilizarías esta técnica y por qué?

Para crear etiquetas, y también para crear ramas, aunque normalmente lo usaría en un directorio en lugar de un único archivo. Una etiqueta es una copia de uno o más archivos, que guarda para su comodidad pero nunca cambia otra vez. Una rama es una copia de uno o más archivos, que luego evoluciona separado del original

Será este comando de crear una copia de foo.txt preservando al mismo tiempo la historia de la misma para ser compartido con bar.txt?

No del todo, la historia foo.txt 's efectivamente se copian en la historia de bar.txt, a continuación, una entrada adicional aparece en la historia de bar.txt lo que indica que se ha copiado de foo.txt, y, posteriormente, son independientes. Entonces la historia hasta el punto de la copia es idéntica/compartida.

Si cambio bar.txt, ¿qué pasará con foo.txt?

Nada, están completamente separados. Pero luego puede fusionar los cambios de uno a otro.

+0

Creo que Copy también será lo suficientemente inteligente como para almacenar de manera eficiente el historial ... si el archivo (s) tiene un largo historial, esto ahorra un espacio significativo. Las actualizaciones del registro también se compartirán entre archivos que creo. –

+0

log = mensajes de registro. –

+0

Sí, estoy seguro de que es correcto. SVN anuncia en voz alta que el archivo es una copia "lógica", pero no duplica el contenido del archivo en la base de datos. Esta afirmación sería absurda si no se aplica a toda la historia, y el etiquetado sería increíblemente caro en el espacio de DB. Lo cual no es –

1

Utilizo esta técnica cuando estoy creando un archivo nuevo, y quiero copiar el andamiaje (actualmente uso Perforce, pero solía usar Subversion). Cambiar una copia no afectará al otro archivo.

+0

No estoy seguro de por qué se votó en contra: he hecho esto yo mismo. Significa que si cambias el texto repetitivo (aviso de copyright y bla bla), entonces fusionar el cambio en los archivos derivados que lo necesiten es exactamente la misma operación que una combinación normal de tronco-> rama. –

8

¿Cuáles son los equivalentes a esto en otros sistemas modernos ( Clearcase, Accurev, Perforce)?

git notarán que el archivo es el mismo en una copia normal y lo muestran como una copia.

+1

Por favor, describa por qué siente que esto es incorrecto, así que puedo corregirlo y no limitarme a votar. – Dustin

+0

¡eso es asombroso! +1 –

1

Branch no es un ciudadano de primera clase en Subversion, ya que está "implementado" como un directorio.

Por lo tanto, el svn copy permite el tipo de rama de archivo dentro de la misma rama (directorio). Luego puede fusionar nuevamente el archivo copiado en el primero. Pero esto es poco adecuado para un solo archivo de, como lo mencionan en this thread

El equivalente en ClearCase sería una regla de selección como

element * .../myBranchForCopy/LATEST 
element /myPath/myFile /main/myBranch/LATEST -mkbranch myBranchForCopy 

Sin embargo, en esta vista realizada para la ramificación de un archivo, solo verá un foo.txt a la vez (en el myBranch, o si está desprotegido, en el myBranchForCopy). No hay una "copia" real, es el mismo elemento. Cualquier combinación sería entre:

9

Este es un uso poco inusual, pero me parece que a veces tengo que dividir un archivo de origen en dos archivos separados - por ejemplo, si contiene dos conjuntos de funcionalidades no relacionadas, y yo uso svn copy para hacer esto. Luego modifico ambos archivos y elimino los bits inapropiados de cada uno. De esta manera, ambos archivos nuevos conservan el historial de revisiones para sus bits relevantes.

1

svn copy fue muy útil después de que accidentalmente borré un archivo. Ver el anwer a un question avator que he pedido.

Cuestiones relacionadas