Подтвердить что ты не робот

Переместите Git отслеживаемые файлы LFS под обычным Git

У меня есть проект, в котором я хранил видеофайлы с Git LFS. Теперь я столкнулся с некоторыми осложнениями с моим сервером сборки, который еще не поддерживает Git LFS. Поскольку это внешняя служба, я не могу повлиять на процесс сборки и поэтому хочу переместить файлы из Git LFS обратно в "обычный" Git. Мне удалось разобрать типы файлов с помощью git lfs untrack '<file-type>', но git lfs ls-files все еще предоставляет список ранее добавленных файлов.

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

4b9b3361

Ответ 1

В выпуске 641 упоминается та же проблема.

Я пытался прекратить использование Git LFS, но не нашел способа вернуть мои предыдущие файлы отслеживаемых указателей с помощью git lfs uninit, git lfs untrack, git rm... после того, как я переместил эти файлы обратно, он по-прежнему отображает отслеживание Git LFS с помощью git lfs ls-files, как я могу отказаться от всего Git LFS из моего репо?

Ответ был:

  1. Удалите все записи в файле filter.lfs. * Git config с помощью git lfs uninit.
  2. Удалите все атрибуты, которые используют фильтр lfs в .gitattributes, запустив git lfs untrack для каждого типа файлов или удалив .gitattributes если LFS - это все, для чего вы когда-либо использовали его.

После этого все добавленные файлы будут отправлены прямо в git.

Но это было не так просто

Позже я заканчиваю файлы указателя LFS в моем рабочем каталоге и должен восстановить все мои изображения из .git/lfs используя хэш sha1, сохраненный в этих указателях вручную.


Обновление от марта 2016 г., выпуск 957 иллюстрирует возможное решение tstephens619:

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

  • Создайте список всех файлов, которые в настоящее время отслеживаются с помощью git-lfs, отфильтруйте *.gz и *.rpm (я хочу отслеживать эти расширения с помощью git-lfs)

    git lfs ls-files | grep -vE "\.gz|\.rpm$" | cut -d ' ' -f 3 > ~/temp/lfs-files.txt
    
  • Прекратить отслеживание небольших графических файлов

    git lfs untrack "*.tts"
    git lfs untrack "*.bfx"
    git lfs untrack "*.ttf"
    git lfs untrack "*.xcf"
    git lfs untrack "*.pkm"
    git lfs untrack "*.png"
    
  • Временно удалить git-lfs

    git lfs uninit
    # Git LFS 2.x+
    git lfs uninstall
    
  • Используйте список файлов, чтобы коснуться каждого файла:

    cat ~/temp/lfs-files.txt | xargs touch
    

git status теперь будет отображать каждый файл как измененный

  • Добавьте изменения в git index (я сделал это через git gui)

  • зафиксируйте изменения и перезапустите git-lfs

    git commit
    git lfs init
    

ttaylorr добавляет:

Один из способов сделать это будет:

for file in $FILES_TO_REVERT; do
  git lfs untrack "$file";
  git rm --cached "$file";
  git add --force "$file";
done

git commit -m "..."

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

Ответ 2

Недавно я столкнулся с этой проблемой, когда активы случайно были добавлены в git -lfs на одну ветвь, которой не должно было быть. Мое решение было:

git lfs untrack '<file-type>'
git rm --cached '<file-type>'
git add '<file-type>'
git commit -m "restore '<file-type>' to git from lfs"

Результатом является переписывание указателей git -lfs oid sha256 со стандартным содержимым файла.

Ответ 3

У меня были проблемы с выполнением шагов в Windows. Чтобы удалить все отслеживаемые файлы git lfs и восстановить исходный файл, я сделал следующее в git bash:

  1. Удалены .gitattributes

  2. git lfs ls-files | cut -d ' ' -f 3 > lfs-files.txt

  3. Выполнить следующий фрагмент:

Snippet:

while read file; do
  git lfs untrack "$file";
  git rm --cached "$file";
  git add --force "$file";
done <lfs-files.txt

Ответ 4

Начиная с Git 2.16 (выпущена 17 января 2018 г.), вы можете легко это сделать с --renormalize флага --renormalize git add:

git lfs untrack "<pattern>"
git add --renormalize .
git commit -m "Restore file contents that were previously in LFS"

Из документации Git:

--renormalize: применить "чистый" процесс заново ко всем отслеживаемым файлам, чтобы принудительно добавить их снова в индекс. Это полезно после изменения конфигурации core.autocrlf или text атрибута, чтобы исправить файлы, добавленные с неправильными окончаниями строк CRLF/LF. Эта опция подразумевает -u.

Ключевая часть здесь - "все отслеживаемые файлы". Обычно фильтры запускаются, только когда операция Git изменяет файл в рабочем дереве. Изменение белого списка LFS в .gitattributes не является операцией Git, поэтому после запуска git lfs untrack в несогласованном состоянии. Запуск git add --renormalize. говорит Git повторно запускать фильтры для каждого файла в хранилище, что гарантирует, что все файлы, которые должны быть в LFS, - и что все файлы, которые не должны быть, - нет.

Ответ 5

Вы ничего не можете удалить из GIT LFS, и хотя представленные здесь решения могут работать (с изменениями), они требуют больших усилий и могут иметь побочные эффекты в вашем репозитории.

Если вы пришли сюда, пришло время спросить себя, хотите ли вы управлять своими большими файлами с помощью GIF LFS и сам ли GIT (который по своей сути плохо управляет большими файлами, потому что это система управления распределенной версией) был хорошим выбором.

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