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 svn
wyeksportuje 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ę .svn
tutaj podfolderów, ale widoczne rzeczy takie jak .o
pliki) , 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 export
to 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 git
nie zachowa znaczników czasu, porównaj dane wyjściowe tych poleceń (w podfolderze wybranego git
repozytorium):
/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 archive
powoduje to, że wszystkie znaczniki czasu zarchiwizowanego pliku są takie same! git help archive
mó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 bash
skrypt, 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 DEST
zmiennej środowiskowej. Zauważ, że z tym skryptem; musisz utworzyć DEST
katalog 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!