Dist::Zilla::PluginBundle::Git::VersionManager - A plugin bundle that manages your version in git


version 0.007


In your dist.ini:

    [@Author::You], or other config entries...


Or, in your plugin bundle's configure method:

    $self->add_bundle('@Git::VersionManager' => \%options)


This is a Dist::Zilla plugin bundle that manages the version of your distribution, and the $VERSION of the modules within it. The current version (of the release in question) is determined from our $VERSION = ... declarations in the code (or from the V environment variable), the Changes file is updated and committed as a release commit to git, which is then tagged, and then the $VERSION in code is then incremented and then that change is committed. The default options used for the plugins are carefully curated to work together, but all can be customized or overridden (see below).

Modules without $VERSION declarations will have them added for the release, with that change also committed back to the local repository.

When no custom options are passed, it is equivalent to the following configuration directly in a dist.ini:

    [Prereqs / pluginbundle version]
    -phase = develop
    -relationship = recommends
    Dist::Zilla::PluginBundle::Git::NextVersion = <current installed version>

    :version = 0.004

    ; ... and whatever plugin and configs were specified in <fallback_version_provider>


    [CopyFilesFromRelease / copy Changes]
    filename = Changes

    [Git::Commit / release snapshot]
    :version = 2.020
    allow_dirty = Changes
    allow_dirty = ... anything else passed in 'commit_files_after_release'


    :version = 0.004

    :version = 5.033
    time_zone = UTC
    format = %-8v  %{yyyy-MM-dd HH:mm:ss'Z'}d%{ (TRIAL RELEASE)}T

    [Git::Commit / post-release commit]
    :version = 2.020
    allow_dirty = Changes
    allow_dirty_match = ^lib/.*\.pm$
    commit_msg = increment $VERSION after %v release

    [Prereqs / prereqs for @Git::VersionManager]
    -phase = .. if plugin_prereq_phase specified ..
    -relationship = .. if plugin_prereq_relationship specified ..
    ...all the plugins this bundle uses...



If your distribution has many module files, and not all of them have a $VERSION declaration that matches the main module (and distribution) version, set this option to true. This has two effects that differ from the default case:

  • while preparing the build and release, no module $VERSION declarations will be altered to match the distribution version (therefore they must be set to the desired values in advance).

  • after the release, only module $VERSION declarations that match the release version will see their values incremented. All $VERSIONs that do not match will be left alone: you must manage them manually. Likewise, no missing $VERSIONs will be added.

Defaults to false (meaning all modules will have their $VERSION declarations synchronized before release and incremented after release).

First available in version 0.003.


File(s), which are expected to exist in the repository directory, to be committed to git as part of the release commit. Can be used more than once. When specified, the default is appended to, rather than overwritten. Defaults to Changes.

Note that you are responsible for ensuring these files are in the repository (perhaps by using [CopyFilesFromRelease]. Additionally, the file(s) will not be committed if they do not already have git history; for new files, you should add the add_files_in = . configuration (and use [Git::Check] to ensure that only these files exist in the repository, not any other files that should not be added.)


An integer that specifies how many columns (right-padded with whitespace) are allocated in Changes entries to the version string. Defaults to 10. Unused if NextRelease.format = anything is passed into the configuration.

plugin_prereq_phase, plugin_prereq_relationship

If these are set, then plugins used by the bundle (with minimum version requirements) are injected into the distribution's prerequisites at the specified phase and relationship. By default these options are disabled. If set, the recommended values are develop and suggests.

First available in version 0.004.

other customizations

This bundle makes use of Dist::Zilla::Role::PluginBundle::PluginRemover and Dist::Zilla::Role::PluginBundle::Config::Slicer to allow further customization. (Note that even though some overridden values are inspected in this class, they are still overlaid on top of whatever this bundle eventually decides to pass -- so what is in the dist.ini or in the add_bundle arguments always trumps everything else.)

Plugins are not loaded until they are actually needed, so it is possible to --force-install this plugin bundle and -remove some plugins that do not install or are otherwise problematic (although release functionality will likely be broken, you should still be able to build the distribution, more or less).


Bugs may be submitted through the RT bug tracker (or

There is also a mailing list available for users of this distribution, at

There is also an irc channel available for users of this distribution, at #distzilla on

I am also usually active on irc, as 'ether' at


Karen Etheridge <>


This software is copyright (c) 2017 by Karen Etheridge.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.