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.51.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 (заголовки/теги) на віддаленому кінці (строго кажучи, це локальний кінець, де виконується git-receive-pack, але для користувача, який сидить на стороні send-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 не може створити. Використання цієї опції без надійного зовнішнього механізму для забезпечення повної досяжності зв’язності об’єктів ризикує пошкодити репозиторій і не повинна використовуватися в загальному випадку.
ПОПЕРЕДНЬОГО ПРИЙОМУ ГАЧОК
Перед оновленням будь-якого посилання, якщо файл $GIT_DIR/hooks/pre-receive існує та є виконуваним, він буде викликаний один раз без параметрів. Стандартний вхідний рядок для кожного посилання, яке потрібно оновити, буде один:
sha1-old SP sha1-new SP refname LF
Значення refname залежить від $GIT_DIR; наприклад, для головного заголовка це "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? сімейства команд
git
log
(див. 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 також не будуть викликані. Це може бути корисним для швидкого виходу, якщо оновлення не підтримується.
Дивіться примітки щодо карантинного середовища нижче.
ОНОВЛЕННЯ ХАКА
Перед оновленням кожного посилання, якщо файл $GIT_DIR/hooks/update існує та є виконуваним, він викликається один раз для кожного посилання з трьома параметрами:
$GIT_DIR/hooks/update refname sha1-old sha1-new
Параметр refname залежить від $GIT_DIR; наприклад, для головного заголовка це "refs/heads/master". Два аргументи sha1 – це імена об’єктів для refname до та після оновлення. Зверніть увагу, що гачок викликається перед оновленням refname, тому або sha1-old дорівнює 0{40} (тобто такого посилання ще немає), або воно має відповідати тому, що записано в refname.
Хук повинен завершитися з ненульовим статусом, якщо він хоче заборонити оновлення іменованого посилання. В іншому випадку він повинен завершитися з нулем.
Успішне виконання (нульовий статус виходу) цього хука не гарантує, що посилання буде фактично оновлено, це лише передумова. Тому надсилати сповіщення (наприклад, електронні листи) з цього хука не рекомендується. Натомість розгляньте можливість використання хука post-receive.
ГАК ПІСЛЯ ПРИЙОМУ
Після оновлення всіх посилань (або спроби оновлення), якщо оновлення будь-якого посилання було успішним, і якщо файл $GIT_DIR/hooks/post-receive існує та є виконуваним, він буде викликаний один раз без параметрів. Стандартний вхідний рядок для кожного успішно оновленого посилання буде:
sha1-old SP sha1-new SP refname LF
Значення refname залежить від $GIT_DIR; наприклад, для головного заголовка це "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.
ПІСЛЯОНОВЛЕННЯ ХУК
Після всіх інших обробок, якщо хоча б одне посилання було оновлено, і якщо файл $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]