TGViewer
BashTex | Linux BashTex | Linux @bash_tex · 2.51K subscribers
Post #341 1.28K
Автоматическое формирование changelog из git-истории

Любой проект со временем обрастает десятками коммитов. Но превращать историю git log в читаемый changelog руками - занятие неблагодарное. Bash и git позволяют автоматизировать это в пару строк.

🛠 Базовый скрипт


#!/bin/bash
# gen-changelog.sh

OUTFILE="CHANGELOG.md"

{
echo "# Changelog"
echo

# Перебираем теги в обратном порядке
for tag in $(git tag --sort=-creatordate); do
prev=$(git describe --tags --abbrev=0 "$tag"^ 2>/dev/null || echo "")
echo "## $tag"
echo

if [[ -n "$prev" ]]; then
range="$prev..$tag"
else
range="$tag"
fi

git log --pretty=format:"- %s (%an)" "$range"
echo -e "\n"
done
} > "$OUTFILE"

echo "Changelog обновлен: $OUTFILE"


▪️ Пример вывода


# Changelog

## v2.2.0
- Добавлены новые баги (Ivan)
- Исправлен баг с путями (Anna)

## v2.1.0
- Рефакторинг логики загрузки (Ivan)
- Улучшена работа с сетью (Petr)


▪️ Можно также добавить:

📍добавить дату релиза: --date=short --pretty=format:"- %s (%an, %ad)";
📍разделить по типам коммитов (feat, fix, docs) с помощью grep;
📍генерировать changelog только для новых коммитов с последнего релиза.

BashTex 📱 #bash
  • 🔥 8
More from @bash_tex
  1. Oct 9, 2026BashTex 📱 #мем
  2. Oct 8, 2026Bridge FDB - как Linux bridge узнаёт, где находится MAC Linux bridge не знает заранее, за…
  3. Oct 7, 2026/dev/tcp - сетевое соединение средствами Bash В Bash есть малоизвестная возможность работа…
  4. Oct 6, 2026Ephemeral ports - почему заканчиваются исходящие TCP-порты Когда приложение устанавливает…
  5. Oct 5, 2026name_to_handle_at() - как получить файловый объект без обычного пути В Linux обычно обраща…
  6. Oct 2, 2026madvise() - как процесс подсказывает ядру, как он собирается использовать память Когда про…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →