This is a command line tool for generating a changelog, or releasenotes, from a GIT repository. It uses the Git Changelog Lib.
This is a Java application (runnable jar
) packaged into an NPM
package for convenience.
jar
can be found in Maven Central and used like java -jar git-changelog-command-line-*.jar ....
.npm
package can be found in NPM.Docker
image can be found in Dockerhub and used like docker run --mount src="$(pwd)",target=/usr/src/git-changelog-command-line,type=bind tomasbjerre/git-changelog-command-line:X --help
.A changelog can be created like this.
npx git-changelog-command-line -std
Or, you can specify a template:
npx git-changelog-command-line -std -tec " # Changelog Changelog. {{#tags}} ## {{name}} {{#issues}} {{#hasIssue}} {{#hasLink}} ### {{name}} [{{issue}}]({{link}}) {{title}} {{#hasIssueType}} *{{issueType}}* {{/hasIssueType}} {{#hasLabels}} {{#labels}} *{{.}}* {{/labels}} {{/hasLabels}} {{/hasLink}} {{^hasLink}} ### {{name}} {{issue}} {{title}} {{#hasIssueType}} *{{issueType}}* {{/hasIssueType}} {{#hasLabels}} {{#labels}} *{{.}}* {{/labels}} {{/hasLabels}} {{/hasLink}} {{/hasIssue}} {{^hasIssue}} ### {{name}} {{/hasIssue}} {{#commits}} **{{{messageTitle}}}** {{#messageBodyItems}} * {{.}} {{/messageBodyItems}} [{{hash}}](https://github.com/{{ownerName}}/{{repoName}}/commit/{{hash}}) {{authorName}} *{{commitTime}}* {{/commits}} {{/issues}} {{/tags}} "Example - Semantic versioning from conventional commits
If you are using conventional commits:
<type>[optional scope]: <description> [optional body] [optional footer(s)]
The highest version can be determined with:
highestTag=$(npx git-changelog-command-line \ --print-highest-version-tag) echo Last release detected as $highestTag
You can also get the tag with --print-highest-version-tag
. Highest version may be 1.2.3
and highest tag may be v1.2.3
.
Next version to release can be determined with:
nextVersion=$(npx git-changelog-command-line \ --print-next-version) echo Next release based on commits is: $nextVersion
There are default patterns, but you can specify the patterns with:
--major-version-pattern REGEXP
--minor-version-pattern REGEXP
--patch-version-pattern REGEXP
By default it will match anything as patch, like chore: whatever
and not only fix: whatever
. You can change that with:
highestVersion=$(npx git-changelog-command-line \ --print-highest-version) highestVersionTag=$(npx git-changelog-command-line \ --print-highest-version-tag) currentVersion=$(npx git-changelog-command-line \ --patch-version-pattern "^fix.*" \ --print-current-version) if [ -z "$highestVersionTag" ]; then echo "This is the first version in the repo, using 0.0.1 as version" currentVersion=0.0.1 else if [ "$currentVersion" == "$highestVersion" ]; then echo "No changes made that can be released" else echo "Changes detected and a new $currentVersion release can be made" fi
A changelog can be rendered (using Helpers) like this:
npx git-changelog-command-line \ --to-ref HEAD \ --stdout \ --template-content " # Changelog {{#tags}} {{#ifReleaseTag .}} ## [{{name}}](https://github.com/tomasbjerre/someproject/compare/{{name}}) ({{tagDate .}}) {{#ifContainsType commits type='feat'}} ### Features {{#commits}} {{#ifCommitType . type='feat'}} - {{#eachCommitScope .}} **{{.}}** {{/eachCommitScope}} {{{commitDescription .}}} ([{{hash}}](https://github.com/tomasbjerre/someproject/commit/{{hashFull}})) {{/ifCommitType}} {{/commits}} {{/ifContainsType}} {{#ifContainsType commits type='fix'}} ### Bug Fixes {{#commits}} {{#ifCommitType . type='fix'}} - {{#eachCommitScope .}} **{{.}}** {{/eachCommitScope}} {{{commitDescription .}}} ([{{hash}}](https://github.com/tomasbjerre/someproject/commit/{{hashFull}})) {{/ifCommitType}} {{/commits}} {{/ifContainsType}} {{/ifReleaseTag}} {{/tags}} "
Or you can prepend to the current changelog. You may get $nextVersion
from --print-next-version
and $highestTag
from --print-highest-version-tag
. Somehting like this:
npx git-changelog-command-line \ --from-ref $highestTag \ --to-ref HEAD \ --prepend-to-file CHANGELOG.md \ --template-content " ## $nextVersion {{#ifContainsType commits type='feat'}} ## Features {{#commits}} {{#ifCommitType . type='feat'}} {{#eachCommitScope .}} **{{.}}** {{/eachCommitScope}} {{{commitDescription .}}} ([{{hash}}](https://github.com/tomasbjerre/someproject/commit/{{hashFull}})) {{/ifCommitType}} {{/commits}} {{/ifContainsType}} {{#ifContainsType commits type='fix'}} ## Bug Fixes {{#commits}} {{#ifCommitType . type='fix'}} {{#eachCommitScope .}} **{{.}}** {{/eachCommitScope}} {{{commitDescription .}}} ([{{hash}}](https://github.com/tomasbjerre/someproject/commit/{{hashFull}})) {{/ifCommitType}} {{/commits}} {{/ifContainsType}} "Example NPM and
package.json
If you are using NPM, you may want to add this to your package.json
:
{ "scripts": { "build": "echo build it...", "release": "npm run set-version; npm run build && npm publish && npm run changelog", "set-version": "npm version $(npx git-changelog-command-line --print-next-version)", "changelog": "npx git-changelog-command-line -of CHANGELOG.md && git commit -a -m 'chore: changelog' && git push --follow-tags" } }
And if you do npm run release
it will:
package.json
You can supply your own helpers and use them in the template.
npx git-changelog-command-line \ --to-ref HEAD \ --stdout \ --template-content " {{#commits}} {{#startsWith messageTitle s='feat'}} Starts with feat: "{{messageTitle}}" first 10 letters of hash is: {{firstLetters hash number='10'}} {{/startsWith}} {{/commits}} " \ --register-handlebars-helper " Handlebars.registerHelper('firstLetters', function(input, options) { const number = parseInt(options.hash['number'] || "0") return input.substring(0,number); }); Handlebars.registerHelper('startsWith', function(from, options) { const s = options.hash['s'] if (new RegExp('^' + s + '.*').test(from)) { return options.fn(this); } else { return options.inverse(this); } }); "
Or from command line:
-cl, --custom-issue-link <string> Custom issue link. Supports variables like ${PATTERN_GROUP_1} to inject variables from pattern. <string>: any string Default: null -cn, --custom-issue-name <string> Custom issue name. <string>: any string Default: null -cp, --custom-issue-pattern <string> Custom issue pattern. <string>: any string Default: null -ct, --custom-issue-title <string> Custom issue title. Supports variables like ${PATTERN_GROUP_1} to inject variables from pattern. <string>: any string Default: null -df, --date-format <string> Format to use when printing dates. <string>: any string Default: YYYY-MM-dd HH:mm:ss -eh, --extended-headers <string> Extended headers that will send when access JIRA. e.g. -eh CF-Access- Client-ID:abcde12345xyz.access [Supports Multiple occurrences] <string>: any string Default: Empty list -en, --encoding <string> Encoding to use when writing content. <string>: any string Default: UTF-8 -ex, --extended-variables <string> Extended variables that will be available as {{extended.*}}. -ex "{\"var1\": \" val1\"}" will print out "val1" for a template like "{{extended.var1}}" <string>: any string Default: -fre, --from-revision <string> From revision. <string>: any string Default: 0000000000000000000000000000000000000000 -frei, --from-revision-inclusiveness Include, or exclude, <InclusivenessStrategy> specified revision. <InclusivenessStrategy>: {INCLUSIVE | EXCLUSIVE | DEFAULT} Default: DEFAULT -gapi, --github-api <string> GitHub API. Like: https://api.github. com/repos/tomasbjerre/git-changelog-command-line/ <string>: any string Default: -ge, --github-enabled Enable parsing for GitHub issues. Default: disabled -gl, --gitlab-enabled Enable parsing for GitLab issues. Default: disabled -glp, --gitlab-issue-pattern <string> GitLab issue pattern. <string>: any string Default: -glpn, --gitlab-project-name <string> GitLab project name. <string>: any string Default: -gls, --gitlab-server <string> GitLab server, like https://gitlab.com/. <string>: any string Default: -glt, --gitlab-token <string> GitLab API token. <string>: any string Default: -gtok, --github-token <string> GitHub API OAuth2 token. You can get it from: curl -u 'yourgithubuser' -d '{"note":"Git Changelog Lib"}' https://api.github. com/authorizations <string>: any string Default: -h, --help <argument-to-print-help-for> <argument-to-print-help-for>: an argument to print help for Default: If no specific parameter is given the whole usage text is given -handlebars-helper-file, -hhf <path> Can be used to add extra helpers. <path>: a file path Default: /home/bjerre/workspace/git-changelog/git-changelog-command-line/. -ini, --ignore-commits-without-issue Ignore commits that is not included in any issue. Default: disabled -iot, --ignore-older-than <string> Ignore commits older than yyyy-MM-dd HH:mm:ss. <string>: any string Default: -ip, --ignore-pattern <string> Ignore commits where pattern matches message. <string>: any string Default: ^Merge.* -itp, --ignore-tag-pattern <string> Ignore tags that matches regular expression. Can be used to ignore release candidates and only include actual releases. <string>: any string Default: null -jaf, --jira-additional-field <string> Adds an additional field for Jira. When configured, we will return from Jira the result of this field, if it exists. [Supports Multiple occurrences] <string>: any string Default: Empty list -jba, --jira-basic-auth <string> Optional token to authenticate with Jira. <string>: any string Default: \\b[a-zA-Z]([a-zA-Z]+)-([0-9]+)\\b -jbt, --jira-bearer <string> Optional token to authenticate with Jira. <string>: any string Default: \\b[a-zA-Z]([a-zA-Z]+)-([0-9]+)\\b -je, --jira-enabled Enable parsing for Jira issues. Default: disabled -jp, --jira-pattern <string> Jira issue pattern. <string>: any string Default: \\b[a-zA-Z]([a-zA-Z]+)-([0-9]+)\\b -jpw, --jira-password <string> Optional password to authenticate with Jira. <string>: any string Default: \\b[a-zA-Z]([a-zA-Z]+)-([0-9]+)\\b -js, --jiraServer, --jira-server <string> Jira server. When a Jira server is given, the title of the Jira issues can be used in the changelog. <string>: any string Default: null -ju, --jira-username <string> Optional username to authenticate with Jira. <string>: any string Default: \\b[a-zA-Z]([a-zA-Z]+)-([0-9]+)\\b -mavp, --major-version-pattern <string> Commit messages matching this, optional, regular expression will trigger new major version. <string>: any string Default: null -mivp, --minor-version-pattern <string> Commit messages matching this, optional, regular expression will trigger new minor version. <string>: any string Default: ^[Ff]eat.* -ni, --no-issue-name <string> Name of virtual issue that contains commits that has no issue associated. <string>: any string Default: No issue -of, --output-file <string> Write output to file. <string>: any string Default: -pavp, --patch-version-pattern <string> Commit messages matching this, optional, regular expression will trigger new patch version. <string>: any string Default: null -pcv, --print-current-version Like --print-next- version unless the current commit is tagged with a version, if so it will print that version. Default: disabled -pf, --path-filters <string> Paths on the filesystem to filter on. [Supports Multiple occurrences] <string>: any string Default: Empty list -phv, --print-highest-version Print the highest version, determined by tags in repo, and exit. Default: disabled -phvt, --print-highest-version-tag Print the tag corresponding to highest version, and exit. Default: disabled -pnv, --print-next-version Print the next version, determined by commits since highest version, and exit. Default: disabled -pt, --prepend-template <string> Template to use when prepending. A default template will be used if not specified. <string>: any string Default: changelog-prepend.mustache -ptf, --prepend-to-file <string> Add the changelog to top of given file. <string>: any string Default: null -r, --repo <string> Repository. <string>: any string Default: . -re, --redmine-enabled Enable parsing for Redmine issues. Default: disabled -rhh, --register-handlebars-helper <string> Handlebar helpers, https://handlebarsjs. com/guide/block-helpers.html, to register and use in given template. <string>: any string Default: -ri, --remove-issue-from-message Dont print any issues in the messages of commits. Default: disabled -rmp, --redmine-pattern <string> Redmine issue pattern. <string>: any string Default: #([0-9]+) -rmpw, --redmine-password <string> Optional password to authenticate with Redmine. <string>: any string Default: -rms, --redmine-server <string> Redmine server. When a Redmine server is given, the title of the Redmine issues can be used in the changelog. <string>: any string Default: null -rmt, --redmine-token <string> Optional token/api-key to authenticate with Redmine. <string>: any string Default: -rmu, --redmine-username <string> Optional username to authenticate with Redmine. <string>: any string Default: -rt, --readable-tag-name <string> Pattern to extract readable part of tag. <string>: any string Default: /([^/]+?)$ -sf, --settings-file <string> Use settings from file. <string>: any string Default: null --show-debug-info Please run your command with this parameter and supply output when reporting bugs. Default: disabled -std, --stdout Print builder to <STDOUT>. Default: disabled -t, --template <string> Template to use. A default template will be used if not specified. <string>: any string Default: changelog.mustache -tbd, --template-base-dir <string> Base dir of templates. <string>: any string Default: null -tec, --template-content <string> String to use as template. <string>: any string Default: -tps, --template-partial-suffix <string> File ending for partials. <string>: any string Default: .hbs -tre, --to-revision <string> To revision. <string>: any string Default: refs/heads/master -trei, --to-revision-inclusiveness Include, or exclude, <InclusivenessStrategy> specified revision. <InclusivenessStrategy>: {INCLUSIVE | EXCLUSIVE | DEFAULT} Default: DEFAULT -tz, --time-zone <string> TimeZone to use when printing dates. <string>: any string Default: UTC -ui, --use-integrations Use integrations to get more details on commits. Default: disabled -ut, --untagged-name <string> When listing commits per tag, this will by the name of a virtual tag that contains commits not available in any git tag. <string>: any string Default: No tagUsage - template base dir
You can use partials in your templates.
/dir/changelog.hbs
{{#commits}} {{> commit}} {{/commits}}
/dir/base/commit.partial
## {{authorName}} - {{commitTime}} [{{hashFull}}](https://server/{{hash}}) {{{message}}}
This is configured like:
npx git-changelog-command-line -std \ --template-base-dir /dir/base \ --template /dir/changelog.hbs
If partials have a different ending, you can specify that with --template-partial-suffix
.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4