Переместите Git отслеживаемые файлы LFS под обычным Git
У меня есть проект, в котором я хранил видеофайлы с Git LFS. Теперь я столкнулся с некоторыми осложнениями с моим сервером сборки, который еще не поддерживает Git LFS. Поскольку это внешняя служба, я не могу повлиять на процесс сборки и поэтому хочу переместить файлы из Git LFS обратно в "обычный" Git. Мне удалось разобрать типы файлов с помощью git lfs untrack '<file-type>'
, но git lfs ls-files
все еще предоставляет список ранее добавленных файлов.
Я предполагаю, что я мог бы удалить файлы, нажать изменения и затем вручную их повторно добавить, но действительно ли это рекомендуемый способ сделать что-то?
Ответы
Ответ 1
В выпуске 641 упоминается та же проблема.
Я пытался прекратить использование Git LFS, но не нашел способа вернуть мои предыдущие файлы отслеживаемых указателей с помощью git lfs uninit
, git lfs untrack
, git rm
... после того, как я переместил эти файлы обратно, он по-прежнему отображает отслеживание Git LFS с помощью git lfs ls-files
, как я могу отказаться от всего Git LFS из моего репо?
Ответ был:
- Удалите все записи в файле filter.lfs. * Git config с помощью
git lfs uninit
. - Удалите все атрибуты, которые используют фильтр 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
теперь будет отображать каждый файл как измененный
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:
-
Удалены .gitattributes
-
git lfs ls-files | cut -d ' ' -f 3 > lfs-files.txt
-
Выполнить следующий фрагмент:
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 может работать лучше для вас.