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 svnexportará 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 .svnsubcarpetas aquí, sino cosas visibles como .oarchivos) , 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 exportdice:
- 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 gitno conservará las marcas de tiempo, compare la salida de estos comandos (en una subcarpeta de un gitrepositorio 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 archivetodas las marcas de tiempo del archivo archivado son las mismas! git help archivedice:
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 bashsecuencia 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 DESTuna 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!