Как Github позволяет встроенное редактирование файлов? (Или как добавить или отредактировать файлы в пустом хранилище git) - PullRequest
7 голосов
/ 27 июля 2011

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

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

Есть идеи по более эффективному способу добавления и редактирования файлов в пустой репозиторий?

1 Ответ

8 голосов
/ 27 июля 2011

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

Получить текущую ГОЛОВКУ, получить оттуда дерево, а затем и ваши большие объекты.

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

И теперь все готово.


Ресурсы:

...