Інструменти робочого простору

Правила репозиторію (.gitcito.json)

Кожен проєкт носить правила, яких із коду не вивести. Ніколи не пушити прямо в release/*. Області комітів — api, web та infra, і жодних інших. Потрібен Node 20, витягнуті підмодулі та .env, скопійований з .env.example, перш ніж щось запуститься. Такі правила живуть у README, який ніхто не перечитує, у падінні CI або в голові того, хто тут найдовше.

.gitcito.json — місце, де репозиторій їх записує, щоб інструмент міг на них спиратися. Файл лежить у корені репозиторію, версіюється як будь-який інший і тому подорожує разом із клоном: усі, хто відкриває проєкт, отримують ті самі правила, а новачок отримує їх у перший день, а не на першому відхиленому push.

Файл цілком необов'язковий. Репозиторій без нього поводиться так само, як завжди.

Писати його вручну не обов'язково: чату репозиторію передають схему цього файла, тож додай посилання на задачі виду JIRA-1234 чи захисти release-гілки повертається як файлова дія, яку можна переглянути.

Вкладка Config репозиторію з рядками доктора та секціями правил

Де його редагувати

Шестірня поруч з інструментами панелі → Config. Цей редактор пише файл у робоче дерево; більше він ніде не зберігається, тож закомітьте його, щоб поділитися правилами з командою.

Якщо файлу ще немає, Прочитати репозиторій запропонує його з того, що вже є: .nvmrc чи engines.node, .gitmodules, filter=lfs у .gitattributes, .env.example без сусіднього .env, гілки, які ви вже захищаєте локально, і області з останніх 500 заголовків комітів. Нічого не записується, доки ви не збережете. У терміналі те саме робить gitcito config init (див. командний рядок).

Що може бути у файлі

{
  "version": 1,
  "protect": ["main", "release/*"],
  "links": {
    "tickets": [
      { "match": "\\b[A-Z][A-Z0-9]+-\\d+\\b", "url": "https://tracker.example.com/browse/$0", "label": "Jira" }
    ]
  },
  "commit": {
    "scopes": ["api", "web", "infra"],
    "ticketFromBranch": true,
    "trailers": ["Refs: {ticket}"]
  },
  "requires": {
    "node": ">=20",
    "hooksPath": ".husky",
    "submodules": true,
    "lfs": true,
    "files": [{ "path": ".env", "from": ".env.example", "why": "Базова адреса API та токен для розробки" }]
  },
  "checklist": {
    "push": ["Прогнати інтеграційні тести на staging"]
  }
}
Поле Що робить
version Має бути 1. Файл новішої схеми ігнорується цілком, а не вгадується.
protect Імена гілок, * збігається з будь-якою послідовністю символів. Додаються до гілок, які ви захищаєте локально — див. захищені гілки.
links.tickets Регулярний вираз і шаблон адреси. $0 — увесь збіг, $1…$9 — його групи. Збіги в заголовках і тілах комітів стають посиланнями.
commit.scopes Області, які пропонує композитор замість вільного поля. Їх оголошення також перетворює невідому область у gitcito commit-check зі стилістичної поради на помилку.
commit.ticketFromBranch Підставляє ключ тікета з імені гілки (feature/ABC-123-thing → ABC-123) — але лише в порожній композитор, ніколи поверх того, що ви друкуєте.
commit.trailers Рядки, що дописуються в тіло коміту. {ticket} і {branch} підставляються; рядок, чий заповнювач нічим заповнити, відкидається, а не пишеться наполовину.
requires.* Що потрібно робочому клону. Кожен запис стає рядком доктора, нижче.
checklist.push Вільний текст, показаний раз за сесію перед першим push.

Доктор

requires — та частина, що відповідає на «я склонував, і воно не запускається». Gitcito перевіряє її при відкритті репозиторію й показує чип зі стетоскопом у рядку стану, коли щось не так. Клік відкриває вкладку Config на рядках доктора; Перевірити знову запускає їх ще раз.

Перевірка Проходить, коли Лагодиться
node node у вашому PATH задовольняє специфікацію —
submodules Жоден підмодуль не лишився без checkout git submodule update --init --recursive
lfs git-lfs встановлено, а відстежувані файли — справжній вміст, а не текст вказівника git lfs pull
hooksPath core.hooksPath збігається з оголошеним шляхом встановленням core.hooksPath
files Файл існує копіюванням із from, якщо він є

Два свідомі обмеження. Попередження ніколи не означає «зламано» — воно означає, що доктор не зміг чогось визначити (нечитабельна специфікація Node проходить, замість вигадувати помилку, з якою ви нічого не зробите), і попередження не валять gitcito doctor у CI. І полагодження ніколи не походить із файлу: набір вище — це весь набір, закритий на етапі компіляції. Конфігурація передає йому значення — шлях для копіювання, значення для core.hooksPath — і ніколи команду.

Копіювання ніколи не перезаписує: відсутність файлу — саме та причина, через яку цей рядок тут.

Коміти

Коли оголошено commit.scopes, кнопка області в композиторі пропонує цей список замість вільного поля — різниця між feat(renderer) і feat(rendererr). ticketFromBranch і trailers заповнюють механічні частини повідомлення, а links.tickets повертає ключам вигляд посилань усюди, де показано коміт.

Ті самі правила діють і поза вікном: gitcito commit-check читає цей файл, тож хук commit-msg і CI вимагають рівно того, що пропонує композитор. Див. командний рядок і коміти.

Список перед push

checklist.push показується як підтвердження перед першим push у сесії, по рядку на пункт. Це місце для того, що справді потребує судження — чи хтось попередив підтримку? — бо Gitcito ніколи не перевіряє це за вас. Це нагадування, а не бар'єри: прочитали й запушили або скасували. Показується раз на репозиторій за сесію, бо діалог при кожному push — це діалог, якого ніхто не читає.

Чому він не може вам зашкодити

Файл приходить разом із репозиторієм, тобто від того, хто репозиторій написав. Його вважають недовіреним вмістом, як і повідомлення коміту:

  • Ніщо в ньому не виконується. Немає поля, що містить команду, а полагодження доктора — фіксований список.
  • Він може лише додавати обмеження. protect об'єднується з вашим локальним списком: репозиторій може захистити більше, ніж обрали ви, але ніколи не відмовить вас щось захищати. Жодне поле не вимикає запобіжник.
  • Шляхи не можуть вийти за репозиторій. Абсолютні шляхи, .., ~, літери дисків і все, що торкається .git, відхиляються — і перевіряються ще раз там, де рядок стає справжнім шляхом.
  • Посилання мають бути http(s). Нічого іншого системному відкривачу адрес не передається.
  • Усе має межу — довжина списків, рядків, шаблонів, — щоб ворожий репозиторій не вставив стіну тексту в діалог і тисячу чипів у панель.

Погане поле відкидається, а не руйнує все. Решта файлу далі діє, а відкинуте перелічено під заголовком Проігноровано Gitcito у вкладці Config із причиною. Єдиний виняток — невалідний JSON або невідома version: там нема чого рятувати.

Чого він свідомо не робить

  • Ні команд, ні скриптів, ні хуків. Для цього є хуки, і це рішення, яке ви ухвалюєте для кожного клона.
  • Ні правил на гілку, ні на людину. Один файл, один набір правил.
  • Він не замінює CI. Список — це текст; доктор перевіряє середовище, а не вашу роботу.
  • Він нічого не може послабити. Усі запобіжники Gitcito лишаються вашими.

Див. також: Налаштування репозиторію · Командний рядок · Коміти · Хуки та .gitignore

Покращити цей переклад на GitHub