Init repo adicional do gix-annex com arquivos existentes

6

Eu configurei git-annex para acompanhar um diretório contendo vários GB de dados. Seu conteúdo é replicado em um controle remoto do S3, então posso soltar alguns arquivos para liberar algum espaço e recuperá-los quando eu precisar deles.

Eu também tenho outro computador onde gostaria de fazer a mesma coisa. Este outro computador já contém a maioria dos arquivos armazenados no controle remoto do S3.

Como posso dizer ao git-annex para iniciar um novo repositório neste outro computador sem baixar do S3 os arquivos que ele pode encontrar no diretório local?

    
por gioele 12.05.2013 / 22:00

2 respostas

4

EDIT 2015-04-30:

anarcat escreveu um guia para este caso de uso que ele postou nos comentários para esta resposta.

EDIT 2013-05-31:

Obrigado por aceitar! gioele apontou nos comentários que reinject não funciona em repos de git anexo de modo direto, o que faz sentido, e meio que tira o vento da minha resposta. O slm encontrou um método alternativo usando git annex add , com o qual Gioele se parece. Confira a resposta de slm para mais informações sobre isso.

Original

Não ouvi falar do git anexo; essa é uma ferramenta legal!

Ok, pelo que li no site do git annex, no novo computador você pode fazer git clone do repositório S3 e não será caro, já que é apenas copiar links simbólicos. Então cd e git annex init <reponamehere> como de costume para fazer git anexo ciente do repo.

Até onde eu entendi, a coisa mais complicada que você está tentando fazer é fazer com que o git anexo fique ciente das cópias locais da máquina dos dados do repo. Eu encontrei um comando em sua página man chamado reinject que eu acho que vai fazer o que você quer:

git annex reinject /path/to/files/* /path/to/repo

Você pode querer adicionar a opção --fast que pode desabilitar o "fsck" (termo do git annex para checagem de checksum dos arquivos) que é executado automaticamente por reinject . Isso, obviamente, é um pouco perigoso e pode até não funcionar: não está claro se reinject aceita --fast ou não.

Além disso, você pode precisar de algum tipo de find one-liner se os arquivos que você deseja reinject forem mais complicados do que um único diretório. Algo como:

find /path/to/files/* -type f -exec bash -c 'echo $1 "/path/to/repo/${1#/path/to/files}"' -- '{}' \;

Esse (eu acho) ecoará o caminho de todos os arquivos em /path/to/files enquanto ecoando um caminho de destino em seu repositório com /path/to/files removidos. Substitua echo por git annex reinject depois de executá-lo e você tem certeza de que a saída está fazendo o que você pretende. Usar find em conjunto com bash -c traz grande poder e grande responsabilidade :)

Fonte: trabalhando em um trabalho de análise de dados que envolve uma quantidade hilariante de operações em lote em arquivos, e praticamente apaixonado pelo git.

    
por 27.05.2013 / 18:28
4

Eu fiz sua pergunta para o desenvolvedor do git-annex nos seus fóruns. Aqui está minha / sua pergunta:

I have a question on setting up a new repo. Is it possible to initialize a new repo using files which are already local on say my laptop, instead of downloading them from a S3 remote repository? Sorry if this is unclear. But I'm trying to make use of the files that are local on my laptop so I don's have to go through the ordeal of downloading them from S3.

I should also mention that I don't have a complete set of all the files locally on the laptop vs. what's already in the S3 repository.

O autor de git-annex , Joey, disse que você pode usar uma das seguintes opções:

  1. Use git annex reinject para alimentar arquivos específicos.
  2. Verifique todos os arquivos locais em um diretório temporário. O assistente git-annex ou o manual git annex add notará se esses arquivos têm o mesmo conteúdo que os arquivos já existentes o repositório. Os arquivos estarão disponíveis em dois locais, o diretório temporário e onde quer que ele tenha sido verificado em seu repositório antes. Você pode então excluir o diretório temporário.
por 30.05.2013 / 07:05

Tags