Como usar o git anexo em um repositório existente?

6

Qual é a melhor maneira de importar todos os arquivos grandes (ou todos os arquivos binários) para o git annex, quando eles já estão em um repositório git?

Eu não quero perder todos os meus commits, então eu acho que não é uma boa idéia apenas fazer um novo repositório e inicializar o anexo lá, importando todos os arquivos e depois confirmando.

Eu também pensei sobre o seguinte: copie o repositório, depois delete todos os arquivos binários no git, e importe novamente e adicione ao anexo. Isso seria uma imensa quantidade de trabalho para fazer com vários branches e muitas coisas binárias lá.

    
por reox 14.09.2011 / 08:48

3 respostas

3

Se você apenas remover os arquivos do commit mais recente e começar a usar o git-annex agora, ele funcionará, mas o seu repositório git existente não ficará menor. Isto é porque o seu histórico ainda contém todos os grandes arquivos verificados no Git.

Você pode usar git-filter-branch para reescrever seus commits para remover os arquivos grandes e anexá-los, como se eles estivessem lá o tempo todo. Esse comando provavelmente seria parecido com o seguinte. Eu mesmo não testei isso porque não tenho o git-annex instalado, então você deve clonar o seu repositório e testá-lo primeiro!

git filter-branch --tree-filter 'find . -size +5M -type f -not -ipath \*.git/\* -print0 | xargs -0 git rm --cached;find . -size +5M -type f -not -ipath \*.git/\* -print0 | xargs -0 git annex add' HEAD

Passo a passo, o que esperamos é:

  1. git filter-branch --tree-filter '<commands>' HEAD

    Reescreva as árvores para todos os commits alcançados pelo HEAD.

  2. find . -size +5M -type f -not -ipath \*.git/\* -print0 | xargs -0 git rm --cached;

    Para cada consolidação, localize todos os arquivos maiores que 5 MB no repositório (menos o diretório .git) e remova-os do índice.

  3. find . -size +5M -type f -not -ipath \*.git/\* -print0 | xargs -0 git annex add

    Encontre todos os arquivos maiores que 5 MB no repositório e adicione-os ao anexo

por 25.09.2011 / 19:45
3

Isso foi mencionado em algumas páginas do git-annex: link

Minha experiência foi menos complicada, eu não precisei editar .gitattributes e, portanto, não precisei fazer um monte de rebases no front end. Eu também só tinha um ramo.

git filter-branch  --tag-name-filter cat --tree-filter 'mkdir -p .git-annex; cp ${MYWORKDIR}/.tmp/* .git-annex/; find . -size +5M -type f -not -ipath \*.git\* -not -ipath \*.temp\* -print0 | parallel -0 -j1 ~/bin/gax; git reset HEAD .git-rewrite; :' -- master

O script que o GNU paralelo está chamando: ~ / bin / gax tem esta aparência:

#!/bin/bash
f=$1;
git annex add ${f};
annexdest=$(readlink ${f});
ln -sf ${annexdest#../../} ${f};

O script pode ser feito mais rápido passando todos os arquivos de uma vez (git annex ignores adiciona arquivos inexistentes), mas você teria que fazer um loop sobre a parte do symlink para corrigir todos eles.

O comando filter-branch também pode ser mais rápido gerando primeiro a lista de arquivos usando find, e usando essa lista ao invés de executar find na árvore de trabalho toda vez.

    
por 02.03.2012 / 23:17
1

Eu tive um problema semelhante, mas em vez de trabalhar com várias ramificações ou apenas arquivos específicos acima de um determinado tamanho, eu precisava fazer todos os arquivos em três subdiretórios.

Meu principal problema era que o comando find não funcionaria sob um subdiretório por algum motivo.

Eu tentei isso começar com base na sugestão do @ Rufflewind:

git filter-branch --tree-filter 'find gapps* -not -ipath \*.git/\* -type f -execdir git rm --cached {} + -execdir git annex add -- {} +' HEAD

Isso não funcionou e muitas tentativas depois eu descobri isso:

git filter-branch --tree-filter 'find ~/Documents/Git/vox_gapps/gapps -type f -execdir git rm --cached {} + -execdir git annex add -- {} +' HEAD

Se você estiver com problemas, tente digitar o caminho completo em vez de um caminho absoluto.

    
por 15.06.2015 / 07:50

Tags