actions/checkout за замовчуванням завантажує лише один коміт - той, що запустив workflow (fetch-depth: 1). Для збирання й тестів цього досить, і це швидко. Але все, що потребує історії, ламається.
Типові симптоми:
fatal: No names found, cannot describe anything. # git describe без тегів
fatal: ambiguous argument 'origin/main...HEAD' # немає гілки main
fatal: bad object ... # немає потрібного коміту
git describeчи визначення версії з тегів - тегів немає;git diff origin/main...HEAD,pint --diff=main, «запускати тести лише для змінених файлів» - немаєmainі спільного предка;- генерація змінлогу з повідомлень комітів - немає комітів;
git logдля дати останньої зміни файла - показує один коміт;- інструменти на кшталт SonarQube скаржаться на неповну історію для blame.
Варіанти виправлення:
- uses: actions/checkout@v7
with:
fetch-depth: 0 # уся історія, усі гілки й теги
0 - найпростіше, але у великому репозиторії checkout стає помітно повільнішим.
Точніше - догрузити лише потрібне:
- uses: actions/checkout@v7
- run: git fetch --no-tags --depth=50 origin main
- run: vendor/bin/pint --test --diff=origin/main
Або fetch-tags: true з невеликою глибиною, якщо потрібні лише теги.
Нюанс pull request-ів: для події pull_request checkout за замовчуванням бере тимчасовий коміт злиття PR з базовою гілкою (refs/pull/N/merge), а не останній коміт гілки PR. Тести перевіряють результат злиття, що добре, але git log покаже коміт злиття, якого немає в гілці. Якщо потрібна саме голова гілки - ref: ${{ github.event.pull_request.head.sha }}.
Правило: глибина історії в CI - свідомий вибір: мінімум для швидкості, а для кроків, яким потрібна історія, - явно догрузити рівно стільки, скільки треба.