Myślę, że post @Aredridel był najbliższy, ale jest w tym coś więcej - dodam to tutaj; chodzi o to, svnże jeśli jesteś w podfolderze repozytorium i robisz:
/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir
następnie svnwyeksportuje wszystkie pliki, które są pod kontrolą wersji (mogły mieć również świeżo dodany lub status Zmodyfikowany) - a jeśli masz inne „śmieci” w tym katalogu (i nie liczę .svntutaj podfolderów, ale widoczne rzeczy takie jak .opliki) , nie będzie eksportowany; tylko pliki zarejestrowane przez repozytorium SVN zostaną wyeksportowane. Dla mnie jedną fajną rzeczą jest to, że ten eksport obejmuje również pliki z lokalnymi zmianami, które nie zostały jeszcze zatwierdzone; a kolejną fajną rzeczą jest to, że znaczniki czasu eksportowanych plików są takie same jak oryginalne. Lub, jak svn help exportto ujmuje:
- Eksportuje czyste drzewo katalogów z kopii roboczej określonej przez PATH1, w wersji REV, jeśli jest ono podane, w przeciwnym razie podczas WORKING, do PATH2. ... Jeśli nie określono REV, wszystkie lokalne zmiany zostaną zachowane. Pliki niepodlegające kontroli wersji nie zostaną skopiowane.
Aby zdać sobie sprawę, że gitnie zachowa znaczników czasu, porównaj dane wyjściowe tych poleceń (w podfolderze wybranego gitrepozytorium):
/media/disk/git_svn/subdir$ ls -la .
... i:
/media/disk/git_svn/subdir$ git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)
... a ja w każdym razie zauważam, że git archivepowoduje to, że wszystkie znaczniki czasu zarchiwizowanego pliku są takie same! git help archivemówi:
Archiwum git zachowuje się inaczej, gdy otrzyma identyfikator drzewa, niż gdy otrzyma identyfikator zatwierdzenia lub identyfikator znacznika. W pierwszym przypadku aktualny czas jest używany jako czas modyfikacji każdego pliku w archiwum. W tym ostatnim przypadku używany jest czas zatwierdzenia zapisany w przywoływanym obiekcie zatwierdzenia.
... ale najwyraźniej oba przypadki ustawiają „czas modyfikacji każdego pliku”; tym samym nie zachowując rzeczywistych znaczników czasu tych plików!
Tak więc, aby zachować także znaczniki czasu, oto bashskrypt, który w rzeczywistości jest „jednowierszowy”, choć nieco skomplikowany - więc poniżej jest opublikowany w wielu wierszach:
/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 \
)
Zauważ, że zakłada się, że eksportujesz zawartość do „bieżącego” katalogu (powyżej /media/disk/git_svn/subdir) - a miejsce docelowe, do którego eksportujesz, jest nieco niedogodnie umieszczone, ale znajduje się w DESTzmiennej środowiskowej. Zauważ, że z tym skryptem; musisz utworzyć DESTkatalog ręcznie, przed uruchomieniem powyższego skryptu.
Po uruchomieniu skryptu powinieneś być w stanie porównać:
ls -la /media/disk/git_svn/subdir
ls -la /media/diskC/tmp/subdirB # DEST
... i mam nadzieję, że zobaczą te same znaczniki czasu (dla plików, które były pod kontrolą wersji).
Mam nadzieję, że to komuś pomoże,
zdrowie!