Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: GIT: "ручной" коммит  (Прочитано 707 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« : 13-10-2023 19:26 » new

Бывает, что такое надо сделать программно. Мне нужно было для модификации .gitmodules.
И так, на входе у нас:
  • remote — сервер, куда мы хотим запушить результат.
  • branch — некая ветка, причем мы на ней не стоим!
  • filename_src — имя физического файла, источника данных.
  • filename — имя файла, как его будет знать GIT.
  • commit_message — текст сообщения для коммита.
  • author — автор в формате "name <email>.

Последовательность действий:
# получаем текущий хеш ветки (далее $commit_hash)
$git show-ref --hash refs/heads/$branch

# — получаем хеш дерева
$ git cat-file -p $commit_hash | grep '^tree '

# очищаем индекс
$ git reset

# читаем дерево в индекс
$ git read-tree $tree_hash

# создаем объект на основе содержимого файла в локальном кеше GIT, выводит его хеш (далее $file_hash)
$ git hash-object -w $filename_src

# обновляем дерево в индексе
$ git update-index --add --cacheinfo "100644,$file_hash,$filename"

# создаем объект в локальном кеше GIT — новое дерево из индекса, выводит его хеш (далее $new_tree_hash)
$ git write-tree

# коммитер всегда из берется из конфига "~/.gitconfig", если не установить GIT_AUTHOR_NAME, то и автор будет из конфига
$ GIT_AUTHOR_NAME=$author git commit-tree -p $commit_hash -m "$commit_message" $new_tree_hash

# чистим за собой индекс
$ git reset

# обновляем ветку
$ git branch --no-track -f $branch $new_commit_hash

# пушим ветку
$ git push $remote $branch

Если на любом этапе, от read-tree до commit-tree включительно, произошла ошибка, надо почистить индекс.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines