Некоторое время назад я наткнулся на сообщение Reddit о том, как функция github upload a file
на самом деле не клонирует проект, а изменяет историю git через низкоуровневый api. Я не могу снова найти этот пост на Reddit :-(
У меня есть аналогичное требование добавить и отправить файл в репозиторий git, но клонирование всего репозитория очень дорого (файлы огромны). Следовательно, я ищу низкоуровневые команды git api, которые можно использовать для добавления файла в репозиторий и отправки без клонирования.
К вашему сведению - поверхностное клонирование не сработает для меня, так как все большие файлы находятся в корне проекта.
Есть и другие подобные вопросы, но решения нет - все говорят, что это невозможно. Учитывая, что это сделал github, должен быть способ.
У GitHub есть репозиторий, так что на GitHub это просто вопрос извлечения последнего коммита, записи файла, обновления индекса и создания нового коммита. 1 Вы можете сделать то же самое на любом сервере, на котором есть весь репозиторий: принять файл, проверить желаемую фиксацию, добавить файл и сделать новую фиксацию.
Фактически, все, что вам действительно нужно сделать, это прочитать фиксацию в индексном файле с помощью git read-tree
, записать объект большого двоичного объекта с помощью git hash-object -w
, затем обновить индекс на месте и использовать git write-tree
, git commit-tree
и git update-ref
для вставки новой фиксации. Эти сантехнические команды не требуют отдельного каталога рабочего дерева. Это Полегче, если у вас есть каталог рабочего дерева, поскольку это заставляет команды пользовательского интерфейса работать.