Как Github позволяет встроенное редактирование файлов? (Или как добавить или отредактировать файлы в пустом хранилище git)
У меня есть небольшое приложение, которое управляет несколькими git-репозиториями, похожими на Github/Gitorious. Github допускает встроенное редактирование файлов, и я хотел бы знать, есть ли у кого-нибудь представление о том, как им это удается.
Сначала я думал, что он сделает полный клон репозитория, использует вашу заявку для замены файла, фиксации и отправки, но это похоже на очень дорогую операцию с большими репозиториями, такими как ядро linux.
Есть идеи по более эффективному способу добавления и редактирования файлов в пустой репозиторий?
1 ответ
Вы можете использовать сантехнические команды.
Получите вашу текущую ГОЛОВУ, получите дерево оттуда, затем ваши капли.
Как только у вас появится блоб, вы можете поместить содержимое в текстовое поле. Когда все закончится, вам нужно просто хэшировать новый BLOB-объект, создать новое дерево, новый коммит и tadaam. Это "толкнул".
PS: помните, что вы находитесь в пустом хранилище, поэтому убедитесь, что для каждой команды, которую вы используете, не нужен ни индекс, ни рабочий каталог.
Как уже было сказано, это пошаговый пример.
Сначала мы получаем текущее содержимое файла:
> git cat-file -p HEAD:var/test/text.txt
test
Мы вносим небольшие изменения в этот контент, и теперь у нас есть новый контент, готовый к публикации. Чтобы сохранить этот контент, мы собираемся его хешировать:
> git hash-object -t blob -w var/test/text.txt
9764d221e6b50063b83c0268544c5d5b745ec9c5
Это сохранит его и вернет sha-1 этого объекта (BLOB-объекта), следующий шаг состоит в создании новой папки test
который будет содержать наш text.txt
файл. Но сначала давайте посмотрим, что делает текущий test
папка выглядит так:
> git ls-tree HEAD:var/test
100644 blob 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 text.txt
Итак, что мы хотим сделать здесь, это заменить предыдущий SHA-1 (9daeafb...
) с новым (9764d22...
) и создайте новое дерево на основе этого (обратите внимание на \t
).
> echo -e "100644 blob 9764d221e6b50063b83c0268544c5d5b745ec9c5\ttext.txt" | git mktree
b7788f9e8e9a24be31188167a6a0bc1de9e41d24
Отлично, теперь у нас есть новый файл text.txt
и родительская папка test
нам сейчас нужно var
,
> git ls-tree HEAD:var
040000 tree 9bfb857f532d280ecd7704beb40a2ea4ba332f5a test
> echo -e "040000 tree b7788f9e8e9a24be31188167a6a0bc1de9e41d24\ttest" | git mktree
536f33626a47138499fade7df6d02327f75d80be
и теперь нам нужен родитель var
(это корень нашего хранилища):
> git ls-tree HEAD
040000 tree 31a6ee5e7d14a0569721632a05234185a109d6bd var
> echo -e "040000 tree 536f33626a47138499fade7df6d02327f75d80be\tvar" | git mktree
7db3d6bc14cce98ff89ccc285b9d17965f5ca92b
И это сделано, наше дерево готово. Единственное, чего не хватает, так это фактического коммита:
> git commit-tree -p HEAD -m "commit message" 7db3d6bc14cce98ff89ccc285b9d17965f5ca92b
4aa2de2cf9e3e4f5470bcd1ee1e83ef6e4025eaf
Но он еще не готов, теперь мы хотим, чтобы коммит был HEAD, поэтому самый последний шаг:
> git update-ref HEAD 4aa2de2cf9e3e4f5470bcd1ee1e83ef6e4025eaf
И теперь мы закончили.
Ресурсы: