Как Github позволяет встроенное редактирование файлов? (Или как добавлять или редактировать файлы в голом репозитории git)

У меня есть небольшое приложение, которое управляет несколькими репозиториями git, похожими на Github/Gitorious. Github позволяет редактирование встроенного файла, и я хотел бы знать, есть ли у кого-нибудь идеи о том, как они это делают.

моя первоначальная мысль заключалась в том, что он будет делать полный клон репозитория, использовать ваше представление для замены файла, фиксации и нажатия, но это похоже на очень дорогую операцию с большими репозиториями, такими как ядро linux.

любой идеи о более эффективном способе добавления и редактирования файлов в голый репозиторий?

1 ответов


вы можете использовать команды сантехники.

получите вашу текущую голову, получите дерево оттуда, а затем ваши капли.

как только у вас есть blob, вы можете поместить содержимое в текстовое поле. Когда он закончен, вам просто нужно хэшировать новый 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, который будет содержать наш . Но сначала давайте посмотрим, что делает текущий Вид:

> 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

но он еще не готов, теперь мы хотим, чтобы фиксация была главой, поэтому самый последний шаг:

> git update-ref HEAD 4aa2de2cf9e3e4f5470bcd1ee1e83ef6e4025eaf

и теперь мы закончили.


ресурсы: