Stacked Git 2.0.0
This major release of StGit brings improved performance, several new features, and many refinements compared to StGit 1.x. It is recommended that all StGit users upgrade to 2.0.0.
Many thanks to all the StGit users who took the time and effort to try out the many alpha, beta, and release candidate releases leading up to this final 2.0.0 release. Lots of issues, big and small, were worked out from this effort to make this a high-confidence release.
Removed
stg clone
is removed. Usegit clone
andstg init
instead.stg mail
is replaced withstg email format
andstg email send
.stg refresh --spill
is replaced with dedicatedstg spill
command.stg edit
no longer accepts-O/--diff-opts
. Custom diff options is in conflict with editable diffs since many (most?) diff options cause the diff to no long be applicable.stg files
no longer accepts-O/--diff-opts
. This option was of marginal value since it only had a possible side effect when--stat
was being used.
Added
stg id
now accepts the-b/--branch
option.stg completion
command provides runtime support for shell completions.stg completion bash
generates bash shell completion script.stg completion fish
generates fish shell completion script.stg completion zsh
outputs zsh shell completion script.stg completion list
shows StGit commands and aliases and is used at completion-time by shell completion scripts.stg completion man
generates man pages in asciidoc format.stg email format
wrapsgit format-patch
and provides a mechanism to generate patch emails and optional cover letter in mbox format.stg email send
wrapsgit send-email
and allows sending patch emails, either from files generated bystg email format
or by specifying patches directly.stg new --refresh
allows a new patch to be refreshed with changes in one step. The-i/--index
,-F/--force
,-s/--submodules
, and--no-submodules
options fromstg refresh
are also available tostg new
when using-r/--refresh
.stg series
gains the-i/--commit-id
option to display patches' commit ids.stg show
diff output can now be limited to certain paths by specifying path limits on the command line.stg spill
replacesstg refresh --spill
.stg version
gains-s/--short
flag to show shortened version info.- Added documentation for patch range syntax to stg(1) man page.
- Added
install-all
target to top-level Makefile that installs the executable, man pages, html pages, and shell completions.
Changed
- StGit is now implemented entirely in Rust instead of Python.
- StGit is generally much faster; many commands are up to 4x faster. There was an emphasis on making informational commands such as
stg id
,stg series
, andstg top
as fast as possible to make their use in interactive contexts (shell prompts, IDE extensions) more comfortable. - StGit error messages have been updated; many have different, and hopefully better, wording. Error messages are also use color (when color is enabled). Scripts relying on exact error messages from StGit will need to be updated.
- StGit output to stdout is generally more terse. Commands that change the stack such as
push
,pop
, andcommit
, use sigils to denote the changes made to the stack. E.g.stg commit p0..p3
will output$ p0..p3
where the "$" sigil means that a patch, or patch range, has been committed. These are all the currently used stack change sigils:+
patch was pushed-
patch was popped>
patch became the current topmost patch&
patch was updated$
patch was committed#
patch was deleted@
patch was rolled-back!
patch was hidden
- StGit aliases are now more like Git aliases. Normal aliases refer to StGit subcommands, but aliases prefixed with '!' are shell aliases that may run arbitrary commands. An example normal alias would be
git config stgit.alias.list 'series --description --empty'
. An example shell alias would begit config stgit.alias.st '!git status --short'
. - Commands such as
stg goto
,stg push
, andstg pop
now require full/correct patch names on the command line and no longer accept unambiguous patch name prefixes. When an inexact patch name is provided on the command line, the error message will now suggest similar valid patch names. - Additional template search paths were added. In addition to looking for template files in .git/, also look in
$XDG_CONFIG_HOME/stgit/templates/
and$HOME/.stgit/templates
. This search strategy is consistent with how git looks for the global config file. - The new
--signoff
patch edit option supercedes the deprecated--sign
and--sign-by
options.--signoff
without its optional value does the same thing as--sign
, while--signoff=<value>
does the same thing as--sign-by=<value>
. - The
--ack
and--review
patch edit options now optionally take a value. The--ack-by
and--review-by
options are deprecated. stg branch
output is now generally less verbose.stg branch --describe
replacesstg branch --description
. The--description
subcommand remains supported as a hidden alias to--describe
, but the description string must now be provided as its own argument; i.e.--description="description string"
is no longer supported.stg branch --list
now produces colorized output. The--color
option orNO_COLOR
environment variable may be used to affect this behavior.stg branch --rename
now supports renaming regular git branches in addition to StGit-enabled branches.stg clean
now uses-A
and-U
short options for--applied
and--unapplied
instead of-a
and-u
. This is done for consistency withstg series
andstg show
.stg import
now only recognizes compressed patches by their file extension (.bz2
or.gz
) and no longer proactively attempts to decompress using all known decompressors.stg import
support for compressed input files is selectable at compile time using theimport-compressed
feature.stg import
support for importing from a URL is selectable at compile time using theimport-url
feature. N.B. there is a measurable runtime performance impact of building withimport-url
due to the unconditional, pre-main initialization ofcurl
which affects allstg
commands.stg log
now colorizes output by default. The--color
option orNO_COLOR
environment variable may be used to affect this behavior.stgit.new.verbose
changed tostgit.edit.verbose
and now also affects edit behavior foredit
,refresh
, andsquash
along withnew
.stg new
now accepts-e/--edit
and-d/--diff
instead of-v/--verbose
stg pick
now allows a mix of commits and patches to be picked whereas previously only a single commit xor multiple patches could be picked.stg pick
now performs a single stack transaction for all the picked patches/commits instead of one transaction per pick.stg push
now attempts to perform three-way merges, which may improve conflict resolution in some cases. This feature is enabled by default when git >= 2.32.0 is detected.stg rebase --interactive
the "squash" and "fixup" instructions may no longer be applied to the first patch in the instruction list. The stated semantics of both "squash" and "fixup" is that they squash the labeled patch with the preceding patch, which is not possible/valid when there is no preceding patch.stg refresh
no longer has a--spill
flag. Usestg spill
instead.stg series
has updated colorized output.stg series
now requires patch range arguments to be both in-order and contiguous. Constraining patch ranges in this manner ensures that the output fromstg series
is always a valid/correct view of a subset of the series.stg show
diff output respects the--color
option.stg squash
now allows the full suite of patch edit options, including-d/--diff
. Previously only a few message-related options were available.stg version
now displays copyright and license statements.
Fixed
stg branch --create
inherits the current branch's remote branch configuration, if available. The Python implementation had an apparent bug that prevented inheriting the remote branch configuration when creating from the current branch.- Avoid case insensitive patch name collisions. On operating systems with case-insensitive paths, patch names that only differ by case lead to patch reference collisions. StGit now ensures that patch names are distinct under case insensitive comparisions.
stg pull
andstg rebase
record updated stack state instead of deferring until the next stack-modifying command to do so.
Changed since 2.0.0-rc.2
Changed
- chore: Update Cargo.lock
Fixed
- fix(zsh): Repair broken completion of --git-opt
- fix(zsh): Add missing
stg email send --branch
- fix(email): Send using --branch option
- fix: Avoid duplicate signoff with stgit.autosign
- fix: Do not use 3way for merged checks