Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
External Systems
Server Admin
Guides
- gitattributes
- Command-line interface conventions
- Everyday Git
- Frequently Asked Questions (FAQ)
- Glossary
- Hooks
- gitignore
- gitmodules
- Revisions
- Submodules
- Tutorial
- Workflows
- All guides...
Administration
Plumbing Commands
- 2.50.1 → 2.54.0 no changes
-
2.50.0
2025-06-16
- 2.43.1 → 2.49.1 no changes
-
2.43.0
2023-11-20
- 2.39.1 → 2.42.4 no changes
-
2.39.0
2022-12-12
- 2.34.1 → 2.38.5 no changes
-
2.34.0
2021-11-15
- 2.24.1 → 2.33.8 no changes
-
2.24.0
2019-11-04
- 2.18.1 → 2.23.4 no changes
-
2.18.0
2018-06-21
- 2.14.6 → 2.17.6 no changes
-
2.13.7
2018-05-22
- 2.12.5 no changes
-
2.11.4
2017-09-22
- 2.5.6 → 2.10.5 no changes
-
2.4.12
2017-05-05
- 2.3.10 no changes
-
2.2.3
2015-09-04
- 2.1.4 no changes
-
2.0.5
2014-12-17
ОПИС
Викликається командою git send-pack та оновлює репозиторій інформацією, що надійшла з віддаленого боку.
Ця команда зазвичай не викликається безпосередньо кінцевим користувачем. Інтерфейс користувача для протоколу знаходиться на стороні git send-pack, а пара програм призначена для використання для надсилання оновлень до віддаленого репозиторію. Щодо операцій pull див. git-fetch-pack[1].
Ця команда дозволяє створювати та перемотувати вперед SHA1-посилання (heads/tags) на віддаленому сервері (а точніше, команда git-receive-pack виконується на локальному комп’ютері, але для користувача, який знаходиться на стороні відправника, це виглядає як оновлення віддаленого сервера. Заплуталися?)
Інші реальні приклади використання гачків update та post-update можна знайти в теці Documentation/howto.
git-receive-pack враховує параметр конфігурації receive.denyNonFastForwards, який вказує, чи слід забороняти оновлення посилання, якщо вони не перемотуються вперед.
Для налаштування поведінки receive.* доступний ряд інших параметрів конфігурації, див. git-config[1].
ОПЦІЇ
- <git-dir>
-
Репозиторій для синхронізації.
- --http-backend-info-refs
-
Використовується git-http-backend[1] для обробки запитів $GIT_URL/info/refs?service=git-receive-pack. Див.
--http-backend-info-refsу git-upload-pack[1]. - --skip-connectivity-check
-
Оминає перевірки зв’язності, які підтверджують наявність усіх об’єктів у транзитивному замиканні доступних об’єктів. Ця опція призначена для адміністраторів серверів, які бажають реалізувати власну перевірку зв’язності об’єктів поза межами Git. Це корисно в тих випадках, коли на стороні сервера відома додаткова інформація про те, як використовується Git, і, отже, можна покладатися на певні гарантії для більш ефективного обчислення зв’язності об’єктів, чого не може зробити сам Git. Використання цієї опції без надійного зовнішнього механізму, що забезпечує повну зв’язність доступних обʼєктів, створює ризик пошкодження репозиторію і не повинно використовуватися в загальному випадку.
ГАЧОК PRE-RECEIVE
Перед оновленням будь-якого ref, якщо файл $GIT_DIR/hooks/pre-receive існує і має права на виконання, він буде викликаний один раз без параметрів. Стандартний вхідний потік цього гачка буде складатися з одного рядка для кожного ref, що підлягає оновленню:
sha1-old SP sha1-new SP refname LF
Значення refname є відносним до $GIT_DIR; наприклад, для вершини master це «refs/heads/master». Два значення sha1 перед кожним refname — це імена об’єктів для refname до та після оновлення. Посилання, що мають бути створені, матимуть sha1-old рівним 0{40}, тоді як посилання, що мають бути видалені, матимуть sha1-new рівним 0{40}; в іншому випадку sha1-old та sha1-new мають бути дійсними об’єктами у репозиторії.
Під час прийняття підписаного push-повідомлення (див. git-push[1]), підписаний push-сертифікат зберігається в blob-обʼєкті, а змінна середовища GIT_PUSH_CERT може бути використана для отримання назви його обʼєкта. Див. опис гачка post-receive для прикладу. Крім того, сертифікат перевіряється за допомогою GPG, а результат експортується з такими змінними середовища:
-
GIT_PUSH_CERT_SIGNER -
Імʼя та адреса електронної пошти власника ключа, який підписав push-сертифікат.
-
GIT_PUSH_CERT_KEY -
Ідентифікатор ключа GPG, який підписав push-сертифікат.
-
GIT_PUSH_CERT_STATUS -
Стан GPG-верифікації push-сертифіката, використовуючи ту саму мнемоніку, що й у форматі %G? сімейства команд
gitlog(див. git-log[1]). -
GIT_PUSH_CERT_NONCE -
Рядок nonce, який процес попросив підписувача включити до push-сертифіката. Якщо це значення не збігається зі значенням, записаним у заголовку "nonce" push-сертифіката, це може означати, що сертифікат є дійсним і відтворюється з окремого сеансу "git push".
-
GIT_PUSH_CERT_NONCE_STATUS -
-
UNSOLICITED -
"git push --signed" надіслав одноразовий код, хоча ми не просили його про це.
-
MISSING -
"git push --signed" не надіслав жодного заголовка nonce.
-
BAD -
"git push --signed" надіслав фальшивий одноразовий код.
-
OK -
"git push --signed" надіслав одноразовий номер, який ми просили надіслати.
-
SLOP -
"git push --signed" надіслав одноразове значення, відмінне від того, яке ми просили надіслати зараз, але в попередньому сеансі. Див. змінну середовища
GIT_PUSH_CERT_NONCE_SLOP.
-
-
GIT_PUSH_CERT_NONCE_SLOP -
"git push --signed" надіслав одноразове значення, відмінне від того, яке ми просили надіслати зараз, але в іншому сеансі, час початку якого відрізняється на стільки ж секунд від поточного сеансу. Має сенс лише тоді, коли
GIT_PUSH_CERT_NONCE_STATUSпоказуєSLOP. Також прочитайте про зміннуreceive.certNonceSlopу git-config[1].
Цей гачок викликається перед оновленням будь-якого посилання та перед виконанням будь-яких перевірок швидкого перемотування.
Якщо гачок pre-receive завершується з ненульовим статусом завершення, оновлення не будуть виконані, а гачки update, post-receive та post-update також не будуть викликані. Це може бути корисним для швидкого виходу, якщо оновлення не підтримується.
Дивіться примітки щодо карантинного середовища нижче.
ГАЧОК UPDATE
Перед оновленням кожного посилання, якщо файл $GIT_DIR/hooks/update існує та є виконуваним, він викликається один раз для кожного посилання з трьома параметрами:
$GIT_DIR/hooks/update refname sha1-old sha1-new
Параметр refname залежить від $GIT_DIR; наприклад, для вершини master це "refs/heads/master". Два аргументи sha1 — це імена обʼєктів для refname до та після оновлення. Зверніть увагу, що гачок викликається перед оновленням refname, тому або sha1-old дорівнює 0{40} (тобто такого посилання ще немає), або воно має відповідати тому, що записано в refname.
Гачок повинен завершитися з ненульовим статусом, якщо він хоче заборонити оновлення іменованого посилання. В іншому випадку він повинен завершитися з нулем.
Успішне виконання (нульовий статус виходу) цього гачка не гарантує, що посилання буде фактично оновлено, це лише передумова. Тому надсилати сповіщення (наприклад, електронні листи) з цього гачка не рекомендується. Натомість розгляньте можливість використання гачка post-receive.
ГАЧОК POST-RECEIVE
Після оновлення всіх посилань (або спроби оновлення), якщо оновлення будь-якого посилання було успішним, і якщо файл $GIT_DIR/hooks/post-receive існує та є виконуваним, він буде викликаний один раз без параметрів. Стандартний вхідний рядок для кожного успішно оновленого посилання буде:
sha1-old SP sha1-new SP refname LF
Значення refname залежить від $GIT_DIR; наприклад, для вершини master це "refs/heads/master". Два значення sha1 перед кожним refname — це імена обʼєктів для refname до та після оновлення. Створені посилання матимуть sha1-old, що дорівнює 0{40}, тоді як видалені посилання матимуть sha1-new, що дорівнює 0{40}, інакше sha1-old та sha1-new мають бути дійсними обʼєктами в репозиторії.
Змінні середовища GIT_PUSH_CERT* можна перевірити, як і в гачку pre-receive, після прийняття підписаного push-повідомлення.
Використовуючи цей хук, легко генерувати електронні листи з описом оновлень репозиторію. Цей приклад скрипта надсилає одне електронне повідомлення на кожне посилання зі списком комітів, надісланих до репозиторію, та реєструє сертифікати підписаних push-файлів з правильними підписами до служби логгера:
#!/bin/sh
# mail out commit update information.
while read oval nval ref
do
if expr "$oval" : '0*$' >/dev/null
then
echo "Created a new ref, with the following commits:"
git rev-list --pretty "$nval"
else
echo "New commits:"
git rev-list --pretty "$nval" "^$oval"
fi |
mail -s "Changes to ref $ref" commit-list@mydomain
done
# log signed push certificate, if any
if test -n "${GIT_PUSH_CERT-}" && test ${GIT_PUSH_CERT_STATUS} = G
then
(
echo expected nonce is ${GIT_PUSH_NONCE}
git cat-file blob ${GIT_PUSH_CERT}
) | mail -s "push certificate from $GIT_PUSH_CERT_SIGNER" push-log@mydomain
fi
exit 0
Код виходу з цього виклику гачка ігнорується, проте ненульовий код виходу генеруватиме повідомлення про помилку.
Зверніть увагу, що можливо, що refname не матиме sha1-new під час виконання цього гачка. Це може легко статися, якщо інший користувач змінить посилання після його оновлення за допомогою git-receive-pack, але до того, як гачок зміг його обчислити. Рекомендується, щоб гачки покладалися на sha1-new, а не на поточне значення refname.
ГАЧОК POST-UPDATE
Після всіх інших обробок, якщо хоча б одне посилання було оновлено, і якщо файл $GIT_DIR/hooks/post-update існує та є виконуваним, тоді буде викликано post-update зі списком оновлених посилань. Це можна використовувати для реалізації будь-яких завдань очищення всього репозиторію.
Код завершення цього виклику гачка ігнорується; єдине, що залишається зробити git-receive-pack на цьому етапі, — це все одно завершити свою роботу.
Цей гачок можна використовувати, наприклад, для запуску git update-server-info, якщо репозиторій упакований і обслуговується через невдалий транспорт.
#!/bin/sh exec git update-server-info
КАРАНТИННЕ СЕРЕДОВИЩЕ
Коли receive-pack приймає обʼєкти, вони поміщаються в тимчасову теку на "карантин" у $GIT_DIR/objects та переносяться в основне сховище обʼєктів лише після завершення обробки перехоплення pre-receive. Якщо передача не вдається раніше, тимчасова тека повністю видаляється.
Це має кілька видимих для користувача ефектів та застережень:
-
Невдалі надсилання даних через проблеми з вхідним пакунком, відсутні обʼєкти або через гачок
pre-receiveне залишать жодних даних на диску. Зазвичай це корисно, щоб запобігти повторним невдалим надсиланням даних, але може ускладнити налагодження. -
Будь-які обʼєкти, створені гачком
pre-receive, будуть створені в теці карантину (і перенесені лише за умови успішного завершення). -
Гачок
pre-receiveНЕ ПОВИНЕН оновлювати жодні посилання, щоб вони вказували на обʼєкти в карантині. Інші програми, які мають доступ до репозиторію, не зможуть бачити ці обʼєкти (і якщо гачок pre-receive не спрацює, ці посилання будуть пошкоджені). З міркувань безпеки будь-які оновлення посилань зpre-receiveавтоматично відхиляються.
GIT
Частина набору git[1]