Как отключить git-lfs?

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

Мне нужен способ просмотреть всю историю git, удалив все следы работы, которую выполняет git LFS (так что все файлы фиксируются «нормально»). Как только это будет сделано, я намерен принудительно нажать на новый репозиторий.

Я провел немало поисков и нашел предлагаемые решения. но я не понимаю, как их реализовать/запустить, потому что они высокоуровневые.

Как попрощаться с git LFS?


person Shadow    schedule 09.02.2018    source источник
comment
Это будет что-то вроде github.com/git-lfs/git -lfs/issues/326#issuecomment-104881826, наверное?   -  person VonC    schedule 09.02.2018
comment
Давайте продолжим обсуждение в чате.   -  person Shadow    schedule 09.02.2018


Ответы (3)


Обновить только текущую фиксацию

Если вы хотите отказаться от LFS, но не слишком беспокоитесь об исправлении всей истории git, вы можете сделать следующее:

git lfs uninstall
touch **/*
git commit -a

Это удалит поддержку LFS, коснется каждого отдельного файла (чтобы git распознал, что он был изменен), а затем зафиксирует их все. Если хотите, можете уточнить (например, **/*.png). Обратите внимание, что для использования ** требуется включенная расширенная поддержка glob (shopt -s globstar в bash)

Обновить всю историю

Это сработало для меня, но выдает много ошибок (я думаю, я получаю сообщение об ошибке для каждой фиксации, в которой файл не был добавлен в LFS) и занимает много времени (примерно 2 -3 секунды за фиксацию).

git lfs uninstall
git filter-branch -f --prune-empty --tree-filter '
  git lfs checkout
  git lfs ls-files | cut -d " " -f 3 | xargs touch
  git rm -f .gitattributes
  git lfs ls-files | cut -d " " -f 3 | git add
' --tag-name-filter cat -- --all

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

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

person Shadow    schedule 09.02.2018

git lfs migrate export

От git lfs migrate help:

Экспорт

Режим экспорта переносит файлы указателей Git LFS, присутствующие в истории Git, из Git LFS, преобразовывая их в соответствующие объектные файлы.

Пример рабочего процесса

  1. Убедитесь, что у вас действительно есть файлы LFS с git lfs ls-files.
  2. Удалите все строки filter=lfs из ВСЕХ файлов .gitattributes в вашем репозитории. .gitattributes может жить где угодно, поэтому убедитесь, что вы нашли их все, иначе позже это может вызвать проблемы с миграцией.
  3. Зафиксируйте все изменения, внесенные вами в .gitattributes.
  4. Убедитесь, что у вас нет изменений с git status.
  5. Запустите миграцию: git lfs migrate export --everything --include .
  6. Запустите git status, чтобы убедиться, что у вас нет изменений. Если вы оставили .gitattributes с filter=lfs, теперь у вас могут быть некорректные изменения.
  7. Убедитесь, что все ранее перечисленные файлы LFS больше не присутствуют с git lfs ls-files.
  8. Проверьте файлы (например, откройте старые файлы LFS, чтобы убедиться, что они не повреждены) и запустите сборку, чтобы убедиться, что все работает.

Советы

  • Запускайте файловую систему с учетом регистра на случай, если в какой-то момент возникнут коллизии файловой системы (например, ./LICENSE и ./License).
  • Избавьтесь от всех ваших filter=lfs строк из ВСЕХ ваших .gitattributes.
  • Вы также можете удалить остатки LFS в каталоге .git/hooks: до фиксации, после фиксации, после проверки, после слияния.
  • С $GIT_TRACE=1 не должно быть никаких признаков ...trace git-lfs: filepathfilter: accepting...
person Doug Richardson    schedule 27.08.2019
comment
Вы также можете удалить остатки LFS в каталоге .git/hooks: pre-commit, post-commit, post-checkout, post-merge. С $GIT_TRACE=1 не должно быть никаких признаков ...trace git-lfs: filepathfilter: accepting... - person pizycki; 29.11.2019
comment
@pizycki Спасибо. Добавил ваши комментарии к ответу. - person Doug Richardson; 02.12.2019
comment
Так что это было потрясающе. Сработало чудесно, тогда как простые инструкции, представленные в фактической документации git lfs.... не так уж и много. Можете ли вы объяснить, почему точка после --include? Я всегда думал, что это должно быть какое-то выражение, но когда я использовал по существу то, что было в моих .gitattributes, это не сработало. - person jkratz; 12.04.2020
comment
@jkratz Это мерзавец <pathspec>. Обратите внимание, что <pathspec>, который я использовал, работает только в том случае, если вы находитесь в каталоге верхнего уровня в git checkout. Если вы хотите иметь возможность запускать команду из любого места, как я и предполагал, вы можете вместо этого использовать :/:. Запустите git ls-files <pathspec>, чтобы увидеть, как это работает. git-scm.com/docs/gitglossary#Documentation/ - person Doug Richardson; 12.04.2020
comment
Спасибо, я не знал, что это спецификация пути, думал, что это просто шаблон глобуса, но, перечитав справочную страницу, он упоминает спецификацию пути. Благодарность! - person jkratz; 15.04.2020

Для конкретного файла

  1. Удалить файл/шаблон из .gitattributes
  2. Перейдите в папку с файлами и запустите touch myfile.bin
  3. Фиксация и отправка изменений
person Kamil Kiełczewski    schedule 22.08.2019