Чи можна керувати скриптами Git Hoke разом із сховищем?


336

Ми хотіли б створити кілька основних сценаріїв гака, якими ми можемо поділитися - для таких речей, як попереднє форматування повідомлень про фіксацію. У Git є сценарії гаків для цього, які зазвичай зберігаються в <project>/.git/hooks/. Однак ці сценарії не розповсюджуються, коли люди роблять клон, і вони не контролюються версіями.

Чи є хороший спосіб допомогти кожному отримати правильні сценарії гака? Чи можу я просто змусити ці сценарії гаків вказувати на сценарії, керовані версіями, в моїй репо?


5
Гарне запитання. Я хотів би лише отримати кращу відповідь (без нарікань на @mipadi, я просто хочу, щоб у Git був спосіб зробити це більш автоматичним способом - навіть якщо тільки з опцією, вказаною для git clone.)
lindes

Я згоден, @lindes! Але, можливо, обмеження цього обміну гачками навмисно? Думаю, що для користувачів Windows все стане брудно.
kristianlm

@kristianlm: Є найрізноманітніші причини, які часом можуть бути безладним ... а також періоди, коли приємно мати його там. Я просто хочу, щоб був якийсь варіант або щось, що скопіювало б гачки. Я думаю, мені доведеться колись перевірити код git-core та зробити виправлення. :) (Або сподіваюся, що хтось інший зробить ... або жити з вирішенням відповіді mipadi , або будь-якого іншого.)
lindes

pre-commitробить це легким для зачеплення перед гачками. Не відповідає на питання ОП щодо управління будь-яким довільним гаком git, але гачки попереднього введення, мабуть, найбільш часто використовуються для цілей якості коду.
ericsoco

Відповіді:


143

Теоретично, ви можете створити hooksкаталог (або будь-яке ім'я, яке ви хочете) у своєму проектному каталозі з усіма сценаріями, а потім позначити їх .git/hooks. Звичайно, кожен, хто клонував репо, повинен був би встановити ці посилання (хоча ви можете по-справжньому уявити і мати сценарій розгортання, який клонер міг би запустити, щоб налаштувати їх напівавтоматично).

Щоб виконати символьне посилання на * nix, все, що вам потрібно зробити, це:

root="$(pwd)"
ln -s "$root/hooks" "$root/.git/hooks"

використовувати, ln -sfякщо ви готові перезаписати те, що є.git/hooks


38
це було нетривіально, тому я включаю посилання про те, як правильно посилатись: stackoverflow.com/questions/4592838/…
David T.

17
git версія 2.9 тепер має параметр config для core.hooksPathналаштування файлу поза .git для посилання на папку гаків.
Аарон Рабіновіц

215

У Git 2.9 параметр конфігурації core.hooksPathвказує користувацький каталог гаків.

Перемістіть гачки до hooksвідстеженого каталогу у вашому сховищі. Потім налаштуйте кожен екземпляр сховища для використання відстежуваного hooksзамість $GIT_DIR/hooks:

git config core.hooksPath hooks

Взагалі шлях може бути абсолютним або відносно каталогу, де запускаються гачки (як правило, корінь робочого дерева; див. Розділ ОПИС man githooks).


15
... і каталог гаків, на який можна вказати, може бути окремим сховищем гаків;)
René Link

10
Ну, чи встановлено цей параметр config автоматично, коли ви робите клон git?
Кільце

4
Як правило, змінні git config не можуть бути встановлені сховищем, яке ви клонуєте. Я думаю, що це запобігає виконанню довільного коду. git config керує виконанням коду за допомогою гачків, імені користувача у повідомленнях фіксування та інших важливих функцій.
Макс Шенфілд

1
Що робити, якщо хтось із колективу робить перевірку на іншу гілку? Вони повинні включати його у кожну галузь ..
жокер

1
Це правда. З іншого боку, якщо ви оновлюєте гачки в новіших комісіях, клоновані репозитори автоматично отримують їх під час роботи над гілками, побудованими поверх цього коміта. Обидва способи мають свої наслідки і недоліки.
fabb

15

Якщо ваш проект є проектом JavaScript, а ви використовуєте npmяк менеджер пакунків, ви можете використовувати спільні-git-гачки для примусового використання githooks npm install.


5
Тепер я знаю, хто нав'язливо додав ці лайно до .git/hooks.
gavenkoa

Попередження - не підтримує Windows (якщо тільки він не працює як адміністратор у git bash). Просте рішення полягає в тому, щоб додати "preinstall": "git config core.hooksPath hooks" як сценарій у package.json. тобто там, де гачки - це папка, що містить ваші git-скрипти.
Шейн Ганнон

8

Для користувачів Nodejs простим рішенням є оновлення package.json за допомогою

{
  "name": "name",
  "version": "0.0.1",
  ......
  "scripts": {
    "preinstall": "git config core.hooksPath hooks", 

Preinstall буде працювати до того

npm встановити

і переспрямовує git, щоб шукати гачки всередині каталогу. \ hooks (або будь-яку назву, яку ви вибрали). Цей каталог повинен імітувати . \. Git \ гачки з точки зору назви файлу (мінус вибірки) та структури.

Уявіть, що Maven та інші інструменти побудови матимуть еквівалент попередньої інсталяції .

Він також повинен працювати на всіх платформах.

Якщо вам потрібна додаткова інформація, див. Https://www.viget.com/articles/two-ways-to-share-git-hooks-with-your-team/


5

Як щодо git-hooks , це маршрут .git/hooksвикликає скрипт у каталозі проекту githooks.

Існує також безліч функцій, які дозволять мінімізувати гачок копіювання та посилання на всі місця.


5

Більшість сучасних мов програмування, а точніше їх інструменти побудови, підтримують плагіни для управління git-гаками. Це означає, що все, що вам потрібно зробити, - це налаштувати пакет.json, pom.xml тощо, і будь-хто у вашій команді не матиме нічого іншого, крім як виконати, якщо вони не змінить файл збірки. Плагін додасть вміст у .git каталог для вас.

Приклади:

https://github.com/rudikershaw/git-build-hook

https://github.com/olukyrich/githook-maven-plugin

https://www.npmjs.com/package/git-hooks


Я намагався цього досягти загальним способом, щоб використовувати у своїх проектах, тому написав цей інструмент: pypi.org/project/hooks4git
Lovato

3

Ми використовуємо рішення Visual Studio (і, таким чином, проекти), які мають події перед і після збирання. Я додаю додатковий проект під назвою "GitHookDeployer". Проект самостійно модифікує файл у події побудови. Цей файл встановлюється для копіювання в каталог збірки. Таким чином, проект будується щоразу і ніколи не пропускається. Під час збірки він також гарантує, що всі гачки для git знаходяться на своїх місцях.

Зауважте, що це не загальне рішення, оскільки деякі проекти, звичайно, не мають на чому будувати.


2

Ви можете використовувати кероване рішення для керування гачками, які попередньо здійснюють, як - от попереднє вчинення . Або централізоване рішення для git-гаків на стороні сервера на зразок Datree.io . Він має вбудовані політики, такі як:

  1. Виявлення та запобігання злиття секретів .
  2. Забезпечте належну конфігурацію користувача Git .
  3. Примусово інтеграції квитків Jira - Згадка номер квитка на ім'я запиту тягнути / повідомлення фіксації.

Він не замінить усіх ваших гачків, але може допомогти вашим розробникам найбільш очевидними, без конфігурації встановлення гаків на кожному комп'ютері / репо розробниках.

Відмова: Я один із засновників Datrees


1

Ви можете зробити свою папку з гачками іншим сховищем git і пов’язати її як підмодуль ... Я думаю, варто того лише, якщо у вас багато членів і гачки регулярно змінюються.


1

В ідеалі гачки пишуться в баш, якщо ви дотримуєтеся зразків файлів. Але ви можете написати його будь-якою доступною мовою, і просто переконайтесь, що він має прапор, що виконується.

Отже, ви можете написати Python або Go код для досягнення своїх цілей і помістити його під папку гаків. Він буде працювати, але ним не керуватиме разом із сховищем.

Два варіанти

а) Мульти сценарії

Ви можете кодувати гачки всередині вашої допомоги та додати невеликий фрагмент коду до гачків, щоб зателефонувати до ідеального сценарію:

$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/myprecommit.js

б) Єдиний сценарій

Більш крутим варіантом є додавання лише одного сценарію, щоб правити ними всі, а не кілька. Отже, ви створюєте гачки / mysuperhook.go і вказуєте на кожен гачок, який хочете мати.

$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/mysuperhook.go $(basename $0)

Параметр надасть вашому сценарію, який гак був спрацьований, і ви можете розмежувати його всередині коду. Чому? Іноді, можливо, ви хочете запустити ту саму перевірку на фіксацію та натискання, наприклад.

І потім?

Тоді, можливо, ви хочете мати додаткові функції, наприклад:

  • Увімкніть гачок вручну, щоб перевірити, чи все в порядку навіть перед фіксацією чи натисканням. Якщо ви просто зателефонуєте до свого сценарію (варіант a або b), це зробить свою справу.
  • Запустіть гачки на CI, тому вам не потрібно буде переписувати ті самі чеки для CI, це було б, наприклад, викликати тригери фіксації та натискання. Те саме, що вище, повинно це вирішити.
  • Викликайте зовнішні інструменти, наприклад валідатор розмітки, або валідатор YAML. Ви можете робити системні дзвінки та обробляти STDOUT та STDERR.
  • Переконайтеся, що всі розробники мають простий спосіб встановити гачки, тому в сховище потрібно додати приємний скрипт, щоб замінити гачки за замовчуванням на правильні
  • Майте декількох глобальних помічників, як, наприклад, чек для блокування комітетів для розробки та освоєння гілок, не потрібно додавати їх до кожного сховища. Ви можете вирішити це, маючи інше сховище з глобальними сценаріями.

Чи може це бути простіше?

Так, є кілька інструментів, які допоможуть вам керувати гачком. Кожен з них призначений для вирішення проблеми з іншого погляду, і вам може знадобитися розібратися у всіх них, щоб отримати той, який найкращий для вас або вашої команди. GitHooks.com пропонує багато читання про підключення та кілька інструментів, доступних сьогодні.

На сьогоднішній день там перелічено 21 проект із різними стратегіями управління гаками. Деякі роблять це лише для одного гачка, деякі для певної мови тощо.

Один із таких інструментів, написаний мною і запропонований безкоштовно як проект із відкритим кодом, називається hooks4git . Він написаний на Python (тому що мені це подобається), але ідея полягає в тому, щоб обробляти всі перераховані вище елементи в одному файлі конфігурації під назвою .hooks4git.ini, який знаходиться всередині вашого сховища і може викликати будь-який сценарій, який ви хочете зателефонувати, будь-якою мовою .

Використання git гаків абсолютно фантастично, але спосіб, яким вони пропонуються, зазвичай відволікає людей від цього.


Нещодавно я опублікував дуже коротку версію, і, як домовились з модераторами, це містить пояснення всередині неї, і коротке посилання на інструмент, який я написав сам, який, думаю, може допомогти іншим розробникам.
Ловато

1

Для користувачів Gradle

Я вважав ці сценарії дуже корисними для проектів Gradle.

build.gradle

apply from: rootProject.file('gradle/install-git-hooks.gradle')

gradle / install-git-hooks.gradle

tasks.create(name: 'gitExecutableHooks') {
    doLast {
        Runtime.getRuntime().exec("chmod -R +x .git/hooks/");
    }
}
task installGitHooks(type: Copy) {
    from new File(rootProject.rootDir, 'pre-commit')
    into { new File(rootProject.rootDir, '.git/hooks') }
}
gitExecutableHooks.dependsOn installGitHooks
clean.dependsOn gitExecutableHooks

попередньо здійснити

.... your pre commit scripts goes here
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.