6

Каков наилучший способ импортировать все большие файлы (или все двоичные файлы) в приложение git, если они уже находятся в репозитории git?

Я не хочу потерять все свои коммиты, поэтому я думаю, что не стоит создавать новое хранилище и инициализировать приложение, импортировать все файлы и затем фиксировать.

Я также подумал о следующем: скопируйте репозиторий, затем удалите все двоичные файлы в git, затем снова импортируйте и добавьте в приложение. Это было бы огромным количеством работы с несколькими ветвями и множеством бинарных вещей.

3 ответа3

3

Некоторые из них были затронуты на странице приложения git:http://git-annex.branchable.com/forum/migrate_existing_git_repository_to_git-annex/

Мой опыт был менее сложным, мне не нужно было редактировать .gitattributes и, следовательно, не нужно было делать кучу ребаз в передней части. У меня тоже была только одна ветка.

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

Сценарий, который вызывает GNU параллельно: ~/bin/gax выглядит так:

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

Сценарий можно сделать быстрее, передав все файлы одновременно (git Annex игнорирует добавления для несуществующих файлов), но вам придется сделать цикл по части символической ссылки, чтобы исправить их все.

Команду filter-branch также можно выполнить быстрее, сначала сгенерировав список файлов, используя find, и используя этот список вместо того, чтобы каждый раз запускать find в рабочем дереве.

3

Если вы просто удалите файлы из самого последнего коммита и начнете использовать git-annex прямо сейчас, это будет работать, но ваш существующий git-репозиторий не станет меньше. Это потому, что ваша история все еще содержит все большие файлы, проверенные в Git.

Возможно, вы сможете использовать git-filter-branch для перезаписи ваших коммитов, чтобы удалить большие файлы и присоединить их, как если бы они были там все время. Эта команда, вероятно, будет выглядеть примерно так: Я не проверял это сам, так как у меня не установлено git-annex, так что вы должны сначала клонировать свой репозиторий и протестировать его там!

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

Шаг за шагом, что мы надеемся сделать, это:

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

    Перепишите деревья для всех коммитов, доступных из HEAD.

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

    Для каждого коммита найдите в репо все файлы размером более 5 МБ (за исключением каталога .git) и удалите их из индекса.

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

    Найдите в репо все файлы размером более 5 МБ и добавьте их в приложение.

1

У меня была похожая проблема, но вместо того, чтобы работать с несколькими ветками или только с определенными файлами выше определенного размера, мне нужно было сделать каждый файл в 3 подкаталогах.

Моя главная проблема заключалась в том, что команда find по какой-то причине не работала в подкаталоге.

Я попытался это начать, основываясь на предложении @ Rufflewind:

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

Это не сработало, и через много попыток я придумал это:

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

Поэтому, если у вас возникли проблемы, попробуйте ввести полный путь вместо абсолютного.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .