git-clone и хук после оформления заказа

Согласно руководству, хук post-checkout запускается после git checkout (как и ожидалось), но также и после git clone (если вы не передадите --no-checkout).

Очень хорошо, теперь, учитывая следующее:

  • у вас нет локального репозитория перед git clone
  • хуки не синхронизируются между пультами
  • хуки, хранящиеся в пользовательском каталоге шаблонов, используемом с --template, копируются как неисполняемые и, следовательно, не выполняются после git clone (на самом деле это не так, как заявил Джефроми в своем ответе, но хук до сих пор не выполнен)

Кажется невероятным, чтобы хук post-checkout когда-либо выполнялся после git clone. Тем не менее, справочная страница githooks по адресу http://git-scm.com/docs/gitooks явно указывает способ избежать его выполнения, а также параметры, передаваемые в случае его выполнения, которые указывают на возможность выполнения пользовательского хука после git-clone.

Итак, как это возможно? Я явно что-то здесь упускаю.

Оказывается


person Geoffrey Bachelet    schedule 26.01.2010    source источник
comment
Каков результат git --version?   -  person Greg Bacon    schedule 26.01.2010
comment
Смотрите мой ответ для зависимости от версии!   -  person Cascabel    schedule 26.01.2010


Ответы (2)


Я полагаю, вы могли бы сделать пользовательскую установку - переименовать хуки в .../share/git-core/templates/hooks, чтобы удалить суффикс .sample.

Вы также можете создать каталог шаблонов, полный символических ссылок на каталог ловушек внутри репозитория (например, post-checkout -> ../../hooks/post-checkout). Затем, если клонированное репо содержало этот конкретный хук, оно было бы выполнено.

Вы правы, хотя в большинстве случаев этого не произойдет.

Редактировать: я только что проверил это, и опция --template, похоже, сохраняет разрешения, так что это гораздо более простой способ сделать это. Что вы видели, чтобы указать, что он сорвал этот бит?

Последнее слово о версиях: вы просматриваете документацию в Интернете для более новой версии git, чем вы используете. Эта функция была добавлена ​​в dfa7a6c (клон: запускать хук post-checkout при оформлении); git description говорит, что это не было включено до v1.6.2-rc2.

person Cascabel    schedule 26.01.2010
comment
Да, я только что проверил, и оказалось, что они на самом деле скопированы с исполняемым битом (не знаю, почему я, хотя он был удален, должно быть, читал это где-то в Интернете). Хук все еще не выполняется, это странно, потому что если я делаю git checkout сразу после git clone, он выполняется правильно. Какая у вас версия гита? Я использую 1.6.0.4 здесь. Я разместил точную процедуру, используемую в gist: gist.github.com/287084 - person Geoffrey Bachelet; 26.01.2010
comment
Кроме того, я только что попробовал поместить хук в /usr/share/git-core/template, и он дал точно такой же результат. - person Geoffrey Bachelet; 26.01.2010
comment
Я сделал быстрый тест с clone --template - исполняемый хук post-checkout определенно выполняется для меня. Я использую текущую версию git.git (сейчас git 1.7.0.rc0.8.ge3f67d). Я не единственный, кто использует мою текущую систему, поэтому попробовать ее с более старыми версиями придется подождать. - person Cascabel; 26.01.2010
comment
Хорошо, теперь кажется очевидным, что я должен обновить свою установку Git! Я собираюсь попробовать это завтра. Всем спасибо за ответы и время :-) - person Geoffrey Bachelet; 27.01.2010
comment
поэтому, когда мы клонируем репо, мы должны указать путь к шаблонам, нельзя ли обновить --template после того, как мы вытащили репо. - person Ciasto piekarz; 13.08.2015
comment
Этот ответ актуален и сегодня? Я не понимаю. Я не вижу .../share/git-core/templates/hooks нигде в своей системе. Я на Windows 10. У меня тоже есть аналогичное требование, когда я хочу символически ссылаться на git-хуки после успешного завершения клонирования. Я попытался создать хук после оформления заказа в каталоге mylocalrepo/hooks. Я хочу создать символическую ссылку этого хука в /.git/hooks после клонирования. Но как git узнает о существовании оригинального хука после проверки в каталоге mylocalrepo/hooks, когда в первую очередь не существует отношения символической ссылки, когда мы клонируем репо. - person Asif Kamran Malick; 23.03.2020
comment
Во-первых, есть ли способ реализовать хук, который будет срабатывать после клонирования. Во-вторых, если пост-клоноподобный хук вообще существует, то как сделать так, чтобы git знал о нем, поскольку хуки не наследуются во время клонирования, а в клонированном репо есть только пробные хуки, а для пользовательских орг- принудительные хуки (хуки, уже размещенные в репозитории github в другом каталоге) для работы, нам нужно сначала установить отношение символической ссылки. Создание символических ссылок может выполняться вручную каждым разработчиком, но есть ли способ автоматизировать это, чтобы оно выполнялось после успешного клонирования. - person Asif Kamran Malick; 23.03.2020
comment
@AsifKamranMalick Вы можете написать сценарий установки, чтобы людям нужно было запустить только одну разовую команду, но в целом нет, хука после клонирования не существует, и я бы этого не ожидал. Представьте, если бы кто-то поместил вредоносный код в общедоступный репозиторий, и простое его клонирование вызвало бы запуск этого кода. - person Cascabel; 23.03.2020
comment
@Cascabel Спасибо. В этом есть смысл. И я думал о сценарии, но мне было просто любопытно, существует ли способ, который мог бы автоматически выполнять что-то после клонирования. Но как организации справляются с такими требованиями. Иметь сценарий, а затем просить разработчиков запустить его единственным способом. Просто любопытно. - person Asif Kamran Malick; 23.03.2020
comment
@AsifKamranMalick, вы можете использовать post-checkout для запуска какого-либо действия после клонирования репозитория. Есть исключения, но это возможно. - person SgtPooki; 19.12.2020

Из документации по gitooks:

При запуске git-init несколько примеров хуков копируются в каталог hooks нового репозитория, но по умолчанию все они отключены. Чтобы включить хук, переименуйте его, удалив суффикс .sample.

Эта инициализация происходит как часть создания клона — обратите внимание на вызов init_db в builtin-clone.c.

Например:

$ cat /tmp/my-git-template/hooks/post-checkout 
#! /bin/bash
echo "Hello from $0"

$ git clone --template=/tmp/my-git-template file:///tmp/repo.git my-clone
Initialized empty Git repository in /tmp/my-clone/.git/
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
Hello from .git/hooks/post-checkout
person Greg Bacon    schedule 26.01.2010
comment
Документация здесь больше говорит о том, чтобы включить ее в вашем собственном репозитории, и OP, очевидно, знает об этом. Конечно, вы можете удалить суффикс из шаблонов в каталоге установки (именно это я уже публиковал). - person Cascabel; 26.01.2010
comment
Так что он работает правильно и с вашим - либо ОП допустил глупую ошибку при тестировании, либо ошибка была исправлена ​​​​с 1.6.0 - поскольку вы ссылаетесь на источник, я подозреваю, что вы тоже используете довольно новую версию? - person Cascabel; 26.01.2010
comment
У меня стоит 1.6.5.5. У меня есть доступ к другому ящику с 1.5.5.6, который копирует хук и сохраняет биты выполнения, но, похоже, не выполняет его. - person Greg Bacon; 26.01.2010