git lfs prune для удаления файлов из lfs и отправки в источник

Итак, вот что произошло:

  1. Случайно зафиксировал много файлов, которые не должны были быть.
  2. Сделал git reset --soft HEAD~2, чтобы вернуться к коммиту перед аварией
  3. Модифицированный gitignore для игнорирования файлов
  4. Снова зафиксировано и отправлено в источник.

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

Итак, я попытался выполнить git lfs prune, который, по-видимому, удалил количество файлов, примерно равное количеству, которое было случайно зафиксировано, а затем git lfs push origin master. Снова проверил список файлов git lfs в битбакете, но эти файлы все еще там, и в происхождении ничего не изменилось.

Что я сделал не так?


person Arvin    schedule 28.08.2017    source источник


Ответы (3)


не является стандартным способом сделать это< /а>:

Клиент командной строки Git LFS не поддерживает удаление файлов с сервера, поэтому способ их удаления зависит от вашего хостинг-провайдера.

Bitbucket позволяет удалить файлы LFS с помощью веб-интерфейса (пожалуйста, прочтите всю связанную страницу, прежде чем продолжить):

Удалите отдельные файлы LFS из вашего репозитория.

Важно понимать, что:

  • Описанная здесь операция удаления является деструктивной — восстановить файлы LFS, на которые ссылаются удаленные файлы указателей LFS, невозможно (это не похоже на команду git remove!), поэтому сначала вам нужно создать резервную копию файлов LFS.
  • Удаление файла LFS удаляет его только из удаленного хранилища. Все указатели ссылок, хранящиеся в вашем репозитории Git, останутся.
  • Никакая ветвь, тег или ревизия не смогут ссылаться на файлы LFS в будущем. Если вы попытаетесь извлечь ветку, тег или ревизию, содержащую файл указателя, ссылающийся на удаленный файл LFS, вы получите сообщение об ошибке загрузки, и извлечение завершится ошибкой.

Администратор репозитория может удалить файлы Git LFS из репозитория следующим образом:

  1. Перейдите на страницу настроек репозитория и нажмите Git LFS, чтобы просмотреть список всех файлов LFS в этом репозитории.
  2. Удалите файлы LFS с помощью меню действий.

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

person Chris    schedule 28.08.2017
comment
Спасибо! Я нашел эту страницу вскоре после того, как опубликовал вопрос и начал использовать инструмент управления Bitbucket LFS для удаления случайных файлов, однако, поскольку мне нужно git log каждый файл, который я хочу удалить, чтобы убедиться, что на него нет ссылок из каких-либо коммитов, стало ясно что это будет очень долгий ручной процесс. Я случайно передал легко сотни файлов. Сидеть здесь и удалять эти файлы по одному — действительно не лучшее решение. Я очень надеюсь, что в будущем появятся лучшие инструменты для управления LFS. - person Arvin; 28.08.2017

В начальных шагах, которым вы следовали, я думаю, вы только что наткнулись на один из случаев, когда интеграция git / git-lfs не всегда идеально безупречна.

Команда reset переместила бы вашу ветку ref обратно. На самом деле это не удалило бы нежелательную фиксацию (или связанные объекты); но обычно это не имеет значения, потому что эти объекты недоступны, поэтому они не будут отправлены с push. Пока все хорошо... с ванильным мерзавцем.

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

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

Но, возможно, у вашего хоста репо не хватает места для хранения. Или, может быть, вы просто хотите, чтобы они исчезли; Я не могу сказать, что буду винить тебя. То, что удаление файлов локально и принудительная отправка не приводит к удалению файлов с сервера, опять же, предусмотрено дизайном. (То же самое относится и к основным объектам git; вы можете принудительно отправить ссылку, чтобы сделать удаленный объект недоступным, но физически «очистка» удаленного объекта не зависит от какой-либо локальной очистки.)

Информацию об удалении файлов LFS из репозитория, размещенного на Bitbucket, можно найти здесь: https://www.atlassian.com/git/tutorials/git-lfs#deleting-remote-files

person Mark Adelsberger    schedule 28.08.2017
comment
На самом деле у меня заканчивается хранилище в моем репозитории bitbucket, поэтому я в первую очередь беспокоился о пространстве. Мое понимание принципов ванильного git заключается в том, что git имеет сборщик мусора, который периодически запускается и удаляет любые объекты, которые больше не имеют к нему никаких ссылок. В файлах LFS наверняка нет никаких коммитов, ссылающихся на них, поэтому по принципам git эти файлы должны быть автоматически удалены, верно? Я полагаю, поскольку LFS был разработан независимо от самого git, одни и те же принципы не всегда применяются. - person Arvin; 28.08.2017
comment
Это правильно, что git gc в конечном итоге должен очищать недоступные объекты git, но также имейте в виду, что то, как это работает на размещенных удаленных устройствах, зависит от службы хостинга. В этом смысле git lfs prune похож на gc — он пытается очистить то, что непригодно для использования локально, но как работает очистка на стороне сервера, не так просто. - person Mark Adelsberger; 29.08.2017

Для пользователей BitBucket у меня есть решение, которое работает уже несколько месяцев: https://gist.github.com/danielgindi/db0e0a897d8d920f23e155bb5d59e9c6

Вы в основном открываете Chrome, находясь в репозитории Bitbucket, входите в систему и помещаете этот фрагмент кода в консоль. Он использует вашу авторизацию, чтобы пойти и удалить все файлы LFS старше указанного времени, и это занимает несколько секунд.

Важное примечание. Никогда не запускайте какой-либо фрагмент кода в браузере вслепую. Посмотрите на код, убедитесь, что вы понимаете, что он делает. Я могу сказать тебе "доверься мне", но ты меня не знаешь.

person daniel.gindi    schedule 25.02.2020