{"id":18028208,"url":"https://github.com/llorllale/loggit-maven-plugin","last_synced_at":"2026-03-15T12:29:50.445Z","repository":{"id":80584457,"uuid":"118929912","full_name":"llorllale/loggit-maven-plugin","owner":"llorllale","description":"Generates changelog and release notes for projects using git","archived":false,"fork":false,"pushed_at":"2018-09-11T20:51:02.000Z","size":296,"stargazers_count":10,"open_issues_count":1,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-22T22:11:47.083Z","etag":null,"topics":["changelog","changelog-generator","git","maven","maven-plugin","release-automation","release-notes"],"latest_commit_sha":null,"homepage":"https://llorllale.github.io/loggit-maven-plugin/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/llorllale.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-01-25T15:22:16.000Z","updated_at":"2025-02-06T04:52:20.000Z","dependencies_parsed_at":null,"dependency_job_id":"ef64bf03-1875-4ca5-8f86-4f0f237dc5a8","html_url":"https://github.com/llorllale/loggit-maven-plugin","commit_stats":null,"previous_names":["llorllale/gitlog-maven-plugin"],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/llorllale%2Floggit-maven-plugin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/llorllale%2Floggit-maven-plugin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/llorllale%2Floggit-maven-plugin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/llorllale%2Floggit-maven-plugin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/llorllale","download_url":"https://codeload.github.com/llorllale/loggit-maven-plugin/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245769295,"owners_count":20669156,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["changelog","changelog-generator","git","maven","maven-plugin","release-automation","release-notes"],"created_at":"2024-10-30T08:14:29.757Z","updated_at":"2026-03-15T12:29:45.423Z","avatar_url":"https://github.com/llorllale.png","language":"Java","readme":"# loggit-maven-plugin ![icon](/src/site/resources/images/icon_64.png)\n\n[![EO principles respected here](http://www.elegantobjects.org/badge.svg)](http://www.elegantobjects.org)\n[![codecov](https://codecov.io/gh/llorllale/loggit-maven-plugin/branch/master/graph/badge.svg)](https://codecov.io/gh/llorllale/loggit-maven-plugin)\n[![Build Status](https://travis-ci.org/llorllale/loggit-maven-plugin.svg?branch=master)](https://travis-ci.org/llorllale/loggit-maven-plugin)\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.llorllale/loggit-maven-plugin/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.llorllale/loggit-maven-plugin)\n[![PDD status](http://www.0pdd.com/svg?name=llorllale/loggit-maven-plugin)](http://www.0pdd.com/p?name=llorllale/loggit-maven-plugin)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://llorllale.github.io/loggit-maven-plugin/license.html)\n\n## Why another changelog plugin?\n\nNone of the other changelog plugins have the right *combination* of features that I need:\n* Markdown format\n* Smarter selection of commit ranges (including tags)\n* Project activity\n\n## Features\n\n* Transform the git log into any format using [XSLT 3.0](https://www.w3.org/TR/xslt-30/).\n* Specify start and end tags to create a changelog that shows a slice of your git log\n* Filter commits based on regular expressions\n* Specify all configurations via the command line or `settings.xml`\n\n## Non goals\n\n* Performance: this plugin does not aim to be the fastest nor use the least resources nor have the smallest footprint\n\n## Usage\n\nInclude the plugin in your pom. Its only goal is **changelog** and is set to execute in the `prepare-package` phase by default.\nAll configurations have default values and are optional (values shown below are default).\nThey are also available from the command line if you prefix them with `loggit.` (eg. `mvn loggit:changelog -Dloggit.maxEntries=50`).\n\n```xml\n  \u003cbuild\u003e\n    \u003cplugins\u003e\n      ...\n      \u003cplugin\u003e\n        \u003cgroupId\u003eorg.llorllale\u003c/groupId\u003e\n        \u003cartifactId\u003eloggit-maven-plugin\u003c/artifactId\u003e\n        \u003cversion\u003e${pluginVersion}\u003c/version\u003e\n        \u003cconfiguration\u003e\n          \u003crepo\u003e${basedir}\u003c/repo\u003e\n          \u003coutputFile\u003e${project.build.directory}/gitlog.xml\u003c/outputFile\u003e\n          \u003cformat\u003edefault\u003c/format\u003e\n          \u003ccustomFormatFile\u003e\u003c/customFormatFile\u003e \u003c!-- empty --\u003e\n          \u003cbranch\u003emaster\u003c/branch\u003e\n          \u003cmaxEntries\u003e2147483647\u003c/maxEntries\u003e \u003c!-- Integer.MAX_VALUE --\u003e\n          \u003cstartTag\u003e\u003c/startTag\u003e \u003c!-- empty --\u003e\n          \u003cendTag\u003e\u003c/endTag\u003e \u003c!-- empty --\u003e\n          \u003cincludeRegex\u003e.*\u003c/includeRegex\u003e\n          \u003cincludeRegexFlags\u003e\u003c/includeRegexFlags\u003e \u003c!-- empty --\u003e\n          \u003cexcludeRegex\u003e.*\u003c/excludeRegex\u003e \u003c!-- default value explained below --\u003e\n          \u003cexcludeRegexFlags\u003e\u003c/excludeRegexFlags\u003e \u003c!-- empty --\u003e\n          \u003cstartCommit\u003e\u003c/startCommit\u003e   \u003c!-- empty --\u003e\n        \u003c/configuration\u003e\n      \u003c/plugin\u003e\n      ...\n    \u003cplugins\u003e\n  \u003c/build\u003e\n```\n\n### Configuration\n\n* `\u003crepo\u003e`: path to the root directory of the git repo\n* `\u003coutputFile\u003e`: path to the file where the changelog should be written to\n* `\u003cformat\u003e`: desired output format (see relevant example below). Possible values are `default`, `markdown`, and `custom`\n* `\u003ccustomFormatFile\u003e`: path to the custom format file (used only when `\u003cformat\u003e` is `custom` (see relevant example below))\n* `\u003cbranch\u003e`: the git branch from which to read the changelog\n* `\u003cmaxEntries\u003e`: the maximum number of entries to read into the changelog\n* `\u003cstartTag\u003e`: if specified, will truncate the log starting at the commit with the given tag\n* `\u003cendTag\u003e`: if specified, will exclude all commits that appear *before* a commit with the given tag\n* `\u003cincludeRegex\u003e`: includes only commits with messages that match the given regular expression\n* `\u003cincludeRegexFlags\u003e`: flags for `\u003cincludeRegex\u003e`. Supported values can be found [here](https://www.w3.org/TR/xpath-functions-30/#flags)\n* `\u003cexcludeRegex\u003e`: excludes commits with messages that match the given regular expression. **Note:** the default value is set to `.*` because we assume that this will never be used as a value in production use. If we need to exclude all commits, we just set `\u003cmaxEntries\u003e` to `0`. We use `.*` to determine whether or not a value was provided for `\u003cexcludeRegex\u003e`.\n* `\u003cexcludeRegexFlags\u003e`: flags for `\u003cexcludeRegex\u003e`. Supported values can be found [here](https://www.w3.org/TR/xpath-functions-30/#flags)\n* `\u003cstartCommit\u003e`: if specified, will include commits until the given ID is found (inclusive)\n\n## How it works\n\n*Loggit* is powered by [jGit](https://www.eclipse.org/jgit/), [XSLT 3.0](https://www.w3.org/TR/xslt-30/), [jcabi-xml](https://github.com/jcabi/jcabi-xml), and [saxon-HE](http://saxon.sourceforge.net/)). After reading the gitlog and creating an XML in compliance with [this schema](src/main/resources/xsd/schema.xsd), everything else is done using XSLT. **XSLT is an extremely powerful tool that lets you - the user - transform the git log into any textual format imaginable.**\n\nIn three stages:\n\n1. The git log is read and the XML is built (relevant configs: `\u003crepo\u003e`, `\u003cbranch\u003e`)\n2. The XML is pre-processed for common use cases (relevant configs: `\u003cmaxEntries\u003e`, `\u003cstartTag\u003e`, `\u003cendTag\u003e`, `\u003cincludeRegex\u003e`, `\u003cincludeRegexFlags\u003e`, `\u003cexcludeRegex\u003e`, `\u003cexcludeRegexFlags\u003e`, `\u003cstartCommit\u003e`)\n3. The XML is post-processed using XSLT and the result is written to file (relevant configs: `\u003cformat\u003e`, `\u003ccustomFormatFile\u003e`, `\u003coutputFile\u003e`)\n\n## Examples\n\n### Default markdown format\n\nThe markdown transformation [bundled](src/main/resources/xsl/post/markdown.xsl) with *loggit* is very primitive and basic.\nIt is not really intended for much use outside of demonstration purposes. Assuming you want to use it:\n\n```xml\n      \u003cplugin\u003e\n        \u003cgroupId\u003eorg.llorllale\u003c/groupId\u003e\n        \u003cartifactId\u003eloggit-maven-plugin\u003c/artifactId\u003e\n        \u003cversion\u003e${pluginVersion}\u003c/version\u003e\n        \u003cconfiguration\u003e\n          \u003cformat\u003emarkdown\u003c/format\u003e\n        \u003c/configuration\u003e\n      \u003c/plugin\u003e\n```\n\nThen the output will look similar to this:\n\n```\n# CHANGELOG\n\n* id: 9d45cab (by John Doe)\n      Short message\n* id: 177357d (by Smith Jones)\n      Fixed typo.\n* id: 3e64aa1 (by Alicia Banks)\n      Initial commit.\n```\n\n### Using a custom format\n\nUse the following plugin configuration:\n\n```xml\n      \u003cplugin\u003e\n        \u003cgroupId\u003eorg.llorllale\u003c/groupId\u003e\n        \u003cartifactId\u003eloggit-maven-plugin\u003c/artifactId\u003e\n        \u003cversion\u003e${pluginVersion}\u003c/version\u003e\n        \u003cconfiguration\u003e\n          \u003cformat\u003ecustom\u003c/format\u003e\n          \u003ccustomFormatFile\u003epath/to/custom/xslt/file.xsl\u003c/customFormatFile\u003e\n        \u003c/configuration\u003e\n      \u003c/plugin\u003e\n```\n\n`path/to/custom/xslt/file.xsl` is the file where you'll have your custom XSLT 3.0 transformation that can output to any format you want.\n\n## Feedback\nPlease direct any questions, feature requests or bugs to the [issue tracker](https://github.com/llorllale/loggit-maven-plugin/issues/).\n\n## How to contribute?\nSee [CONTRIBUTING](./CONTRIBUTING.md).\n\n## License\n`loggit-maven-plugin` is licensed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0). A copy of the license has been included in [LICENSE](./LICENSE).\n\n\u003cbr/\u003e\n\n\u003cdiv\u003eIcon made by \u003ca href=\"http://www.freepik.com\" title=\"Freepik\"\u003eFreepik\u003c/a\u003e from \u003ca href=\"https://www.flaticon.com/\" title=\"Flaticon\"\u003ewww.flaticon.com\u003c/a\u003e is licensed by \u003ca href=\"http://creativecommons.org/licenses/by/3.0/\" title=\"Creative Commons BY 3.0\" target=\"_blank\"\u003eCC BY 3.0\u003c/a\u003e\u003c/div\u003e\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fllorllale%2Floggit-maven-plugin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fllorllale%2Floggit-maven-plugin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fllorllale%2Floggit-maven-plugin/lists"}