Je pense que le message de @Aredridel était le plus proche, mais il y a un peu plus - je vais donc ajouter ceci ici; la chose est, dans svn
, si vous êtes dans un sous-dossier d'un repo, et vous faites:
/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir
puis svn
exportera tous les fichiers qui sont sous contrôle de révision (ils pourraient également avoir été récemment ajoutés; ou état modifié) - et si vous avez d'autres "ordures" dans ce répertoire (et je ne compte pas les .svn
sous-dossiers ici, mais des choses visibles comme des .o
fichiers) , il ne sera pas exporté; seuls les fichiers enregistrés par le dépôt SVN seront exportés. Pour moi, une bonne chose est que cette exportation inclut également des fichiers avec des modifications locales qui n'ont pas encore été validées; et une autre bonne chose est que les horodatages des fichiers exportés sont les mêmes que ceux d'origine. Ou, comme le svn help export
dit:
- Exporte une arborescence de répertoires propre de la copie de travail spécifiée par PATH1, à la révision REV si elle est donnée, sinon à WORKING, dans PATH2. ... Si REV n'est pas spécifié, toutes les modifications locales seront conservées. Les fichiers qui ne sont pas sous contrôle de version ne seront pas copiés.
Pour réaliser que git
cela ne préservera pas les horodatages, comparez la sortie de ces commandes (dans un sous-dossier d'un git
dépôt de votre choix):
/media/disk/git_svn/subdir$ ls -la .
... et:
/media/disk/git_svn/subdir$ git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)
... et je remarque en tout cas que git archive
tous les horodatages du fichier archivé sont identiques! git help archive
dit:
git archive se comporte différemment quand on lui donne un ID d'arbre par rapport à quand on lui donne un ID de commit ou un ID de tag. Dans le premier cas, l'heure actuelle est utilisée comme heure de modification de chaque fichier de l'archive. Dans ce dernier cas, le temps de validation enregistré dans l'objet de validation référencé est utilisé à la place.
... mais apparemment les deux cas fixent le "temps de modification de chaque fichier"; donc pas préservant les horodatages réels de ces fichiers!
Donc, afin de préserver également les horodatages, voici un bash
script, qui est en fait un "one-liner", quoique quelque peu compliqué - donc ci-dessous il est affiché sur plusieurs lignes:
/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 \
)
Notez que l'on suppose que vous exportez le contenu dans le répertoire "actuel" (ci-dessus, /media/disk/git_svn/subdir
) - et que la destination dans laquelle vous exportez est quelque peu gênante, mais elle est dans DEST
la variable d'environnement. Notez qu'avec ce script; vous devez créer leDEST
répertoire manuellement vous-même, avant d'exécuter le script ci-dessus.
Une fois le script exécuté, vous devriez pouvoir comparer:
ls -la /media/disk/git_svn/subdir
ls -la /media/diskC/tmp/subdirB # DEST
... et j'espère voir les mêmes horodatages (pour les fichiers qui étaient sous contrôle de version).
J'espère que cela aide quelqu'un,
Cheers!