Creo que la publicación de @Aredridel fue la más cercana, pero hay un poco más de eso, así que agregaré esto aquí; la cosa es, en svn
, si estás en una subcarpeta de un repositorio, y haces:
/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir
luego svn
exportará todos los archivos que están bajo control de revisión (también podrían haber agregado recientemente; o estado modificado), y si tiene otra "basura" en ese directorio (y no estoy contando .svn
subcarpetas aquí, sino cosas visibles como .o
archivos) , no se exportará; solo se exportarán los archivos registrados por el repositorio SVN. Para mí, algo bueno es que esta exportación también incluye archivos con cambios locales que aún no se han confirmado; y otra cosa buena es que las marcas de tiempo de los archivos exportados son las mismas que las originales. O, como svn help export
dice:
- Exporta un árbol de directorio limpio de la copia de trabajo especificada por PATH1, en la revisión REV si se proporciona, de lo contrario en WORKING, a PATH2. ... Si no se especifica REV, se conservarán todos los cambios locales. Los archivos que no estén bajo el control de versión no se copiarán.
Para darse cuenta de que git
no conservará las marcas de tiempo, compare la salida de estos comandos (en una subcarpeta de un git
repositorio de su elección):
/media/disk/git_svn/subdir$ ls -la .
... y:
/media/disk/git_svn/subdir$ git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)
... y, en cualquier caso, ¡me doy cuenta de que git archive
todas las marcas de tiempo del archivo archivado son las mismas! git help archive
dice:
git archive se comporta de manera diferente cuando se le da una ID de árbol en comparación con una ID de confirmación o ID de etiqueta. En el primer caso, la hora actual se usa como la hora de modificación de cada archivo en el archivo. En este último caso, se utiliza el tiempo de confirmación registrado en el objeto de confirmación referenciado.
... pero aparentemente ambos casos establecen el "tiempo de modificación de cada archivo"; por lo tanto no conserva las marcas de tiempo reales de esos archivos!
Entonces, para preservar también las marcas de tiempo, aquí hay una bash
secuencia de comandos, que en realidad es una "línea única", aunque algo complicada, por lo que a continuación se publica en varias líneas:
/media/disk/git_svn/subdir$ git archive --format=tar master | (tar tf -) | (\
DEST="/media/diskC/tmp/subdirB"; \
CWD="$PWD"; \
while read line; do \
DN=$(dirname "$line"); BN=$(basename "$line"); \
SRD="$CWD"; TGD="$DEST"; \
if [ "$DN" != "." ]; then \
SRD="$SRD/$DN" ; TGD="$TGD/$DN" ; \
if [ ! -d "$TGD" ] ; then \
CMD="mkdir \"$TGD\"; touch -r \"$SRD\" \"$TGD\""; \
echo "$CMD"; \
eval "$CMD"; \
fi; \
fi; \
CMD="cp -a \"$SRD/$BN\" \"$TGD/\""; \
echo "$CMD"; \
eval "$CMD"; \
done \
)
Tenga en cuenta que se supone que está exportando el contenido en el directorio "actual" (arriba /media/disk/git_svn/subdir
), y que el destino al que está exportando está ubicado de manera algo inconveniente, pero está en DEST
una variable de entorno. Tenga en cuenta que con este script; debes crear elDEST
directorio manualmente usted mismo, antes de ejecutar el script anterior.
Después de ejecutar el script, debería poder comparar:
ls -la /media/disk/git_svn/subdir
ls -la /media/diskC/tmp/subdirB # DEST
... y espero ver las mismas marcas de tiempo (para aquellos archivos que estaban bajo control de versiones).
Espero que esto ayude a alguien,
¡salud!