Как работает функция загрузки файлов на github?

Некоторое время назад я наткнулся на сообщение Reddit о том, как функция github upload a file на самом деле не клонирует проект, а изменяет историю git через низкоуровневый api. Я не могу снова найти этот пост на Reddit :-(

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

К вашему сведению - поверхностное клонирование не сработает для меня, так как все большие файлы находятся в корне проекта.

Есть и другие подобные вопросы, но решения нет - все говорят, что это невозможно. Учитывая, что это сделал github, должен быть способ.


49
1

Ответ:

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


Фактически, все, что вам действительно нужно сделать, это прочитать фиксацию в индексном файле с помощью git read-tree, записать объект большого двоичного объекта с помощью git hash-object -w, затем обновить индекс на месте и использовать git write-tree, git commit-tree и git update-ref для вставки новой фиксации. Эти сантехнические команды не требуют отдельного каталога рабочего дерева. Это Полегче, если у вас есть каталог рабочего дерева, поскольку это заставляет команды пользовательского интерфейса работать.