Я думаю , що повідомлення @Aredridel було найближчим, але є ще трохи до цього - тому я додам це тут; справа в тому svn
, якщо ви перебуваєте в підпапці репо, і ви робите:
/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir
тоді svn
ви експортуєте всі файли, які перебувають під контролем редагування (вони могли бути також свіжододаними; або зміненим статусом) - і якщо у вас в цьому каталозі є інші "мотлохи" (і я не рахую .svn
тут папки, але видимі речі, такі як .o
файли) , він не буде експортований; експортуються лише ті файли, зареєстровані репортажем SVN. Для мене одне приємне - це те, що цей експорт включає також файли з локальними змінами, які ще не були здійснені; і ще одна приємна річ - те, що часові позначки експортованих файлів такі ж, як і оригінали. Або, як svn help export
зазначається:
- Експортує чисте дерево каталогів з робочої копії, визначеної PATH1, при перегляді REV, якщо воно дано, інакше при РОБОТІ, в PATH2. ... Якщо REV не вказаний, всі локальні зміни будуть збережені. Файли, які не перебувають під контролем версій, не будуть скопійовані.
Щоб зрозуміти, що git
часові позначки не збережуть, порівняйте вихід цих команд (у підпапці git
репо за вашим вибором):
/media/disk/git_svn/subdir$ ls -la .
... і:
/media/disk/git_svn/subdir$ git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)
... і я, в будь-якому випадку, помічаю, що git archive
всі часові позначки архівованого файлу однакові! git help archive
каже:
git-архів поводиться інакше, коли йому присвоєно ідентифікатор дерева порівняно з тим, коли йому надано ідентифікатор фіксації чи ідентифікатор тегу. У першому випадку поточний час використовується як час модифікації кожного файлу в архіві. В останньому випадку замість цього використовується час фіксації, записаний у згаданому об'єкті фіксації.
... але, мабуть, обидва випадки встановлюють "час модифікації кожного файлу"; тим самим не зберігаючи фактичні часові позначки цих файлів!
Отже, щоб також зберегти часові позначки, ось bash
сценарій, який насправді є «однолінійним», хоч і дещо складним - тому нижче він розміщений у декількох рядках:
/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 \
)
Зауважте, що передбачається, що ви експортуєте вміст у "поточному" каталозі (вище, /media/disk/git_svn/subdir
) - і призначення, в яке ви експортуєте, дещо незручно розміщене, але воно знаходиться в DEST
змінній середовищі. Зауважте, що з цим сценарієм; ви повинні створитиDEST
перед створенням вищевказаного сценарію каталог вручну самостійно.
Після запуску сценарію ви зможете порівняти:
ls -la /media/disk/git_svn/subdir
ls -la /media/diskC/tmp/subdirB # DEST
... і, сподіваємось, побачити ті самі часові позначки (для тих файлів, які були під контролем версій).
Сподіваюся, це допоможе комусь,
ура!