Я думаю, что пост @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
... и, надеюсь, увидеть те же временные метки (для тех файлов, которые были под контролем версий).
Надеюсь, это поможет кому-то,
ура!