Eu acho que a postagem de @Aredridel foi a mais próxima, mas há um pouco mais disso - então eu adicionarei isso aqui; o problema é, svn
se você estiver em uma subpasta de um repositório, e você faz:
/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir
em seguida svn
, exportará todos os arquivos que estão sob controle de revisão (eles também podem ter o status Adicionado recentemente ou Modificado) - e se você tiver outro "lixo" nesse diretório (e não estou contando .svn
subpastas aqui, mas coisas visíveis, como .o
arquivos) , não será exportado; somente os arquivos registrados pelo repositório SVN serão exportados. Para mim, uma coisa boa é que essa exportação também inclui arquivos com alterações locais que ainda não foram confirmadas; e outra coisa interessante é que os carimbos de data e hora dos arquivos exportados são os mesmos que os originais. Ou, como svn help export
coloca:
- Exporta uma árvore de diretórios limpa da cópia de trabalho especificada por PATH1, na revisão REV, se for fornecida, caso contrário em WORKING, para PATH2. ... Se REV não for especificado, todas as alterações locais serão preservadas. Arquivos que não estão sob controle de versão não serão copiados.
Para perceber que git
não preservará os carimbos de data e hora, compare a saída desses comandos (em uma subpasta de um git
repositório de sua escolha):
/media/disk/git_svn/subdir$ ls -la .
... e:
/media/disk/git_svn/subdir$ git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)
... e eu, em qualquer caso, noto que git archive
faz com que todos os carimbos de data e hora do arquivo arquivado sejam os mesmos! git help archive
diz:
O arquivo git se comporta de maneira diferente quando recebe um ID de árvore e quando recebe um ID de confirmação ou ID de tag. No primeiro caso, a hora atual é usada como a hora de modificação de cada arquivo no arquivo morto. Neste último caso, o tempo de confirmação, conforme registrado no objeto de confirmação referenciado, é usado.
... mas aparentemente ambos os casos definem o "tempo de modificação de cada arquivo"; dessa forma, não preservando os registros de data e hora reais desses arquivos!
Portanto, para preservar também os registros de data e hora, aqui está um bash
script, que é realmente "uma linha", embora um pouco complicado - então, abaixo, ele é postado em várias linhas:
/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 \
)
Observe que se supõe que você esteja exportando o conteúdo no diretório "atual" (acima /media/disk/git_svn/subdir
) - e o destino para o qual você está exportando é um pouco inconveniente, mas está na DEST
variável de ambiente. Observe que com este script; você deve criar o DEST
diretório manualmente, antes de executar o script acima.
Após a execução do script, você poderá comparar:
ls -la /media/disk/git_svn/subdir
ls -la /media/diskC/tmp/subdirB # DEST
... e espero ver os mesmos registros de data e hora (para os arquivos que estavam sob controle de versão).
Espero que isso ajude alguém,
Saúde!