Git рекурсивно отслеживать папку LFS

Можно ли рекурсивно отслеживать все файлы, содержащиеся в папке и ее подпапках, с помощью Git LFS?

Я хотел бы сделать что-то вроде этого:

git lfs track myfolder/*

person csa    schedule 03.03.2016    source источник


Ответы (2)


Используйте git lfs track "myfolder/**" с кавычками, чтобы оболочка не расширяла шаблон. Все, что делает команда track, — это запись в .gitattributes, которая, в свою очередь, использует (почти) те же правила сопоставления шаблонов, что и .gitignore, см. ФОРМАТ ШАБЛОНА описание.

person sschuberth    schedule 03.03.2016
comment
Я пробовал это с подпапками, но отслеживаются только файлы и прямые подпапки (например, myfolder/myfolder2/), содержащиеся в myfolder, но не файлы, содержащиеся в подпапках (например, моя папка/моя папка/мой файл.png). Спасибо за вашу помощь - person csa; 03.03.2016
comment
Ах, вы, вероятно, стали жертвой расширения оболочки, то есть myfolder/** было расширено оболочкой до того, как было передано Git. Я обновил свой ответ, добавив цитаты, которые должны это исправить. - person sschuberth; 03.03.2016
comment
.gitattributes НЕ следует (ВСЕ) тем же правилам сопоставления шаблонов, которые описаны в приведенной выше ссылке git-scm, в противном случае myfolder/** может быть заменен на myfolder/ в соответствии с утверждением foo/ будет соответствовать каталогу foo и путям под ним. Я думаю (т.е. не подтверждено), что myfolder/ работает в .gitignore, потому что процесс игнорирования проходит через файловую систему, останавливаясь на совпадении, но .gitattributes проверяется на соответствие уже существующему списку. Если вы найдете другое, добавьте комментарий с версией git/git-lfs, которая изменила это. - person SensorSmith; 19.01.2018
comment
Нет, это не ошибка. Как уже объяснялось в связанном ФОРМАТЕ ШАБЛОНА, «начальный **, за которым следует косая черта, означает совпадение во всех каталогах». - person sschuberth; 07.07.2018
comment
git lfs track "folder/**" работает рекурсивно, проверено на 2.19.windows.1 - person Tamir Daniely; 17.10.2018
comment
git lfs track "folder/**" мне определенно не подходит. Вы проверили, что это работает, если ваши файлы находятся ниже, например. для файла folder/foo/bar/blub.c? Я скопировал тот же шаблон, который оказался в моих .gitattributes, в мой .gitignore, и файлы успешно игнорируются. Но не удалось успешно отследить git lfs (конечно, до того, как я добавил шаблон в gitignore). Это с git 2.17.1. - person Nir Friedman; 30.10.2018
comment
Да, это работает для меня и, судя по комментариям, для других. Если вы работаете в Windows, обратите внимание, что команду нужно использовать из Git Bash, а не из cmd. - person sschuberth; 30.10.2018
comment
Это сработало для меня: git lfs track Assets/Large\ Assets/\*\* В Ubuntu мне приходилось экранировать * и пробелы, а также не использовать двойные кавычки. - person mzmrk; 06.01.2019
comment
В справочной статье Atlassian говорится, что git lfs track "Assets/" будет отслеживать все файлы в каталог Assets и все подкаталоги. Таким образом, кажется, что решение должно быть git lfs track "myfolder/", а не git lfs track "myfolder/**". Эта справочная статья неверна или ** неверна? - person Senseful; 31.01.2019
comment
На самом деле только что протестировал его, и оказалось, что эта статья справочного центра неверна, и вы хотите использовать git lfs track "myfolder/**", как предлагает этот ответ. Дополнительные сведения и этапы проверки можно найти в этом ответе. - person Senseful; 31.01.2019
comment
Мне пришлось использовать git lfs track "myfolder/**/*", чтобы заставить его работать. - person Luc; 12.04.2019
comment
И я использую had to use git lfs track myfolder/**/* без кавычек на MacOS - person DavidS1992; 24.04.2020

Таким образом, вы можете отслеживать любые папки с любой подпапкой. Вы хотите рекурсивно отслеживать папки с количеством папок n и количеством подпапок m. Я бы рекомендовал делать это таким образом.

  1. Найдите все расширения файлов, используя следующую команду
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u  
  1. а затем создать файл .gitattribute и добавить синтаксис дорожки git lfs. Эта команда генерирует это для вас, она отслеживает все файлы и их расширения и создает синтаксис отслеживания lfs.
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u | awk '{print $1" filter=lfs diff=lfs merge=lfs -text"}' | sed 's/^/*./'
  1. Скопируйте вывод в файл .gitattribute и зафиксируйте.

Это работает для

  1. Любое количество файлов и папок.
  2. Большое репо с большим количеством маленьких файлов, что делает размер репо очень большим.
  3. Любое количество папок и подпапок.
person Prabesh Thapa    schedule 07.01.2021