... было ли изменение в недавнем обновлении Git или Git LFS, которое делает обязательным использование атрибута фильтра?
Нет: это всегда было обязательным.1 Причина этого в том, что Git-LFS работает так, что использует фильтры smudge и clean для хранения Git, как содержимое вашего репозитория, файла, содержащего информацию о том, как получить другой файл, вообще не хранящийся в Git. Этот другой файл хранится на каком-то сервере — он не обязательно должен совпадать с вашими серверами Git — и извлекается оттуда с помощью фильтра smudge. Файл, хранящийся на этом другом сервере, обновляется (точнее, дополняется) новым с помощью фильтра clean2.
Кстати. также кажется, что не имеет значения, заключен ли шаблон в .gitattributes в кавычки ('*.png' filter=lfs -text
) или нет (*.png filter=lfs -text
), это правильно?
Да. Кавычки нужны только в том случае, если в самом имени файла есть пробелы. Однако кавычки должны быть двойными кавычками< /a>, без одинарных кавычек: "*.png"
.
(Обратите внимание, что Git обрабатывает фильтры размазывания и очистки немного странно: определение драйвера находится в файле .gitconfig
или .git/config
и, следовательно, может быть глобальным или отдельным репозиторием, но использование драйвер помещается в .gitattributes
и, следовательно, всегда для каждого репозитория. Причина этого связана с моделью безопасности вокруг драйверов фильтров.)
1Кто-то мог и, возможно, уже создал интерфейсную команду, которая скрывает это от вас, но она по-прежнему требуется, как описано выше.
2Более подробно: когда вы проверили коммит H (какой-то хэш-идентификатор), Git, по сути, активен не один, а три копии каждого файла:
Одна из этих копий заморожена на все время и находится в текущем коммите, т. е. коммит H. Эта копия — или, во всяком случае, ее содержимое; режим и имя файла хранятся отдельно — в специальном формате, предназначенном только для чтения и только для Git, и дедуплицируются в отношении идентичных копий, которые могут быть в других коммитах Git.
Git называет эти объекты содержимого фиксированного формата объектами BLOB-объектов. Обычно вы не имеете с ними дело напрямую.
Вторая копия — это еще один дедублированный объект большого двоичного объекта — содержимое в замороженном формате, — но, поскольку он хранится в индексе Git, его можно заменить в любое время.
Последняя копия файла находится в вашем рабочем дереве и является обычным повседневным файлом. Он не сжатый и не в каком-то специальном формате, который может читать только Git и никто не может писать: это обычный повседневный файл.
Обычно этот последний файл создается путем копирования и распаковки внутреннего объекта большого двоичного объекта. Если вы настроили фильтр размытия для файла, вместо того, чтобы Git выполнял распаковку самостоятельно, Git распаковывает файл, а затем пропускает содержимое через фильтр размытия. Фильтр пятен LFS считывает содержимое, затем вызывает сервер LFS и говорит, что вот ключ поиска: дайте мне настоящее содержимое. Фильтр пятен LFS записывает полученный файл в ваше рабочее дерево.
Обычно git add file
работает путем копирования и сжатия данного файла во внутренний объект большого двоичного объекта, а затем записывает его в индекс. Однако если вы настроите для файла чистый фильтр, Git не будет читать файл напрямую: фильтр смазывания прочитает и редактирует файл. Фильтр пятен LFS редактирует файл, считывая данные и сохраняя их на сервере LFS, а затем генерируя новый ключ поиска.
Следовательно, когда у вас есть фильтры LFS, единственные данные, которые когда-либо видит Git, — это ключ поиска LFS-сервера.
Выбор того, какие фильтры размазывания и очистки использовать для каких файлов, задается в .gitattributes
и/или .git/info/attributes
. Программа, которую нужно запустить для данного фильтра размазывания или очистки, задается в файле конфигурации Git, например, используя git config
, git config --global
или git config --system
.
person
torek
schedule
06.05.2020