|  | Git v2.1 Release Notes | 
|  | ====================== | 
|  |  | 
|  | Backward compatibility notes | 
|  | ---------------------------- | 
|  |  | 
|  | * The default value we give to the environment variable LESS has been | 
|  | changed from "FRSX" to "FRX", losing "S" (chop long lines instead | 
|  | of wrapping).  Existing users who prefer not to see line-wrapped | 
|  | output may want to set | 
|  |  | 
|  | $ git config core.pager "less -S" | 
|  |  | 
|  | to restore the traditional behaviour.  It is expected that people | 
|  | find output from most subcommands easier to read with the new | 
|  | default, except for "blame" which tends to produce really long | 
|  | lines.  To override the new default only for "git blame", you can | 
|  | do this: | 
|  |  | 
|  | $ git config pager.blame "less -S" | 
|  |  | 
|  | * A few disused directories in contrib/ have been retired. | 
|  |  | 
|  |  | 
|  | Updates since v2.0 | 
|  | ------------------ | 
|  |  | 
|  | UI, Workflows & Features | 
|  |  | 
|  | * Since the very beginning of Git, we gave the LESS environment a | 
|  | default value "FRSX" when we spawn "less" as the pager.  "S" (chop | 
|  | long lines instead of wrapping) has been removed from this default | 
|  | set of options, because it is more or less a personal taste thing, | 
|  | as opposed to the others that have good justifications (i.e. "R" is | 
|  | very much justified because many kinds of output we produce are | 
|  | colored and "FX" is justified because output we produce is often | 
|  | shorter than a page). | 
|  |  | 
|  | * The logic and data used to compute the display width needed for | 
|  | UTF-8 strings have been updated to match Unicode 7.0 better. | 
|  |  | 
|  | * HTTP-based transports learned to better propagate the error messages from | 
|  | the webserver to the client coming over the HTTP transport. | 
|  |  | 
|  | * The completion script for bash (in contrib/) has been updated to | 
|  | better handle aliases that define a complex sequence of commands. | 
|  |  | 
|  | * The "core.preloadindex" configuration variable is enabled by default, | 
|  | allowing modern platforms to take advantage of their | 
|  | multiple cores. | 
|  |  | 
|  | * "git clone" applies the "if cloning from a local disk, physically | 
|  | copy the repository using hardlinks, unless otherwise told not to with | 
|  | --no-local" optimization when the url.*.insteadOf mechanism rewrites a | 
|  | remote-repository "git clone $URL" into a | 
|  | clone from a local disk. | 
|  |  | 
|  | * "git commit --date=<date>" option learned more | 
|  | timestamp formats, including "--date=now". | 
|  |  | 
|  | * The `core.commentChar` configuration variable is used to specify a | 
|  | custom comment character (other than the default "#") for | 
|  | the commit message editor.  This can be set to `auto` to attempt to | 
|  | choose a different character that does not conflict with any that | 
|  | already starts a line in the message being edited, for cases like | 
|  | "git commit --amend". | 
|  |  | 
|  | * "git format-patch" learned --signature-file=<file> to add the contents | 
|  | of a file as a signature to the mail message it produces. | 
|  |  | 
|  | * "git grep" learned the grep.fullname configuration variable to force | 
|  | "--full-name" to be the default.  This may cause regressions for | 
|  | scripted users who do not expect this new behaviour. | 
|  |  | 
|  | * "git imap-send" learned to ask the credential helper for auth | 
|  | material. | 
|  |  | 
|  | * "git log" and friends now understand the value "auto" for the | 
|  | "log.decorate" configuration variable to enable the "--decorate" | 
|  | option automatically when the output is sent to tty. | 
|  |  | 
|  | * "git merge" without an argument, even when there is an upstream | 
|  | defined for the current branch, refused to run until | 
|  | merge.defaultToUpstream is set to true.  Flip the default of that | 
|  | configuration variable to true. | 
|  |  | 
|  | * "git mergetool" learned to drive the vimdiff3 backend. | 
|  |  | 
|  | * mergetool.prompt used to default to 'true', always asking "do you | 
|  | really want to run the tool on this path?".  The default has been | 
|  | changed to 'false'.  However, the prompt will still appear if | 
|  | mergetool used its autodetection system to guess which tool to use. | 
|  | Users who explicitly specify or configure a tool will no longer see | 
|  | the prompt by default. | 
|  |  | 
|  | Strictly speaking, this is a backward incompatible change and | 
|  | users need to explicitly set the variable to 'true' if they want | 
|  | to be prompted to confirm running the tool on each path. | 
|  |  | 
|  | * "git replace" learned the "--edit" subcommand to create a | 
|  | replacement by editing an existing object. | 
|  |  | 
|  | * "git replace" learned a "--graft" option to rewrite the parents of a | 
|  | commit. | 
|  |  | 
|  | * "git send-email" learned "--to-cover" and "--cc-cover" options, to | 
|  | tell it to copy To: and Cc: headers found in the first input file | 
|  | when emitting later input files. | 
|  |  | 
|  | * "git svn" learned to cope with malformed timestamps with only one | 
|  | digit in the hour part, e.g. 2014-01-07T5:01:02.048176Z, emitted | 
|  | by some broken subversion server implementations. | 
|  |  | 
|  | * "git tag" when editing the tag message shows the name of the tag | 
|  | being edited as a comment in the editor. | 
|  |  | 
|  | * "git tag" learned to pay attention to "tag.sort" configuration, to | 
|  | be used as the default sort order when no --sort=<value> option | 
|  | is given. | 
|  |  | 
|  | * A new "git verify-commit" command, to check GPG signatures in signed | 
|  | commits, in a way similar to "git verify-tag" is used to check | 
|  | signed tags, was added. | 
|  |  | 
|  |  | 
|  | Performance, Internal Implementation, etc. | 
|  |  | 
|  | * Build procedure for 'subtree' (in contrib/) has been cleaned up. | 
|  |  | 
|  | * Support for the profile-feedback build, which has | 
|  | bit-rotted for quite a while, has been updated. | 
|  |  | 
|  | * An experimental format to use two files (the base file and | 
|  | incremental changes relative to it) to represent the index has been | 
|  | introduced; this may reduce I/O cost of rewriting a large index | 
|  | when only small part of the working tree changes. | 
|  |  | 
|  | * Effort to shrink the size of patches Windows folks maintain on top | 
|  | by upstreaming them continues.  More tests that are not applicable | 
|  | to the Windows environment are identified and either skipped or | 
|  | made more portable. | 
|  |  | 
|  | * Eradication of "test $condition -a $condition" from our scripts | 
|  | continues. | 
|  |  | 
|  | * The `core.deltabasecachelimit` used to default to 16 MiB , but this | 
|  | proved to be too small, and has been bumped to 96 MiB. | 
|  |  | 
|  | * "git blame" has been optimized greatly by reorganising the data | 
|  | structure that is used to keep track of the work to be done. | 
|  |  | 
|  | * "git diff" that compares 3-or-more trees (e.g. parents and the | 
|  | result of a merge) has been optimized. | 
|  |  | 
|  | * The API to update/delete references are being converted to handle | 
|  | updates to multiple references in a transactional way.  As an | 
|  | example, "update-ref --stdin [-z]" has been updated to use this | 
|  | API. | 
|  |  | 
|  | * skip_prefix() and strip_suffix() API functions are used a lot more | 
|  | widely throughout the codebase now. | 
|  |  | 
|  | * Parts of the test scripts can be skipped by using a range notation, | 
|  | e.g. "sh t1234-test.sh --run='1-4 6 8-'" to omit test piece 5 and 7 | 
|  | and run everything else. | 
|  |  | 
|  |  | 
|  | Also contains various documentation updates and code clean-ups. | 
|  |  | 
|  |  | 
|  | Fixes since v2.0 | 
|  | ---------------- | 
|  |  | 
|  | Unless otherwise noted, all the fixes since v2.0 in the maintenance | 
|  | track are contained in this release (see the maintenance releases' | 
|  | notes for details). | 
|  |  | 
|  | * We used to unconditionally disable the pager in the pager process | 
|  | we spawn to feed out output, but that prevented people who want to | 
|  | run "less" within "less" from doing so. | 
|  | (merge c0459ca je/pager-do-not-recurse later to maint). | 
|  |  | 
|  | * Tools that read diagnostic output in our standard error stream do | 
|  | not want to see terminal control sequence (e.g. erase-to-eol). | 
|  | Detect them by checking if the standard error stream is connected | 
|  | to a tty. | 
|  | (merge 38de156 mn/sideband-no-ansi later to maint). | 
|  |  | 
|  | * Mishandling of patterns in .gitignore that have trailing SPs quoted | 
|  | with backslashes (e.g. ones that end with "\ ") has been | 
|  | corrected. | 
|  | (merge 97c1364be6b pb/trim-trailing-spaces later to maint). | 
|  |  | 
|  | * Reworded the error message given upon a failure to open an existing | 
|  | loose object file due to e.g. permission issues; it was reported as | 
|  | the object being corrupt, but that is not quite true. | 
|  | (merge d6c8a05 jk/report-fail-to-read-objects-better later to maint). | 
|  |  | 
|  | * "git log -2master" is a common typo that shows two commits starting | 
|  | from whichever random branch that is not 'master' that happens to | 
|  | be checked out currently. | 
|  | (merge e3fa568 jc/revision-dash-count-parsing later to maint). | 
|  |  | 
|  | * Code to avoid adding the same alternate object store twice was | 
|  | subtly broken for a long time, but nobody seems to have noticed. | 
|  | (merge 80b4785 rs/fix-alt-odb-path-comparison later to maint). | 
|  | (merge 539e750 ek/alt-odb-entry-fix later to maint). | 
|  |  | 
|  | * The "%<(10,trunc)%s" pretty format specifier in the log family of | 
|  | commands is used to truncate the string to a given length (e.g. 10 | 
|  | in the example) with padding to column-align the output, but did | 
|  | not take into account that number of bytes and number of display | 
|  | columns are different. | 
|  | (merge 7d50987 as/pretty-truncate later to maint). | 
|  |  | 
|  | * "%G" (nothing after G) is an invalid pretty format specifier, but | 
|  | the parser did not notice it as garbage. | 
|  | (merge 958b2eb jk/pretty-G-format-fixes later to maint). | 
|  |  | 
|  | * A handful of code paths had to read the commit object more than | 
|  | once when showing header fields that are usually not parsed.  The | 
|  | internal data structure to keep track of the contents of the commit | 
|  | object has been updated to reduce the need for this double-reading, | 
|  | and to allow the caller find the length of the object. | 
|  | (merge 218aa3a jk/commit-buffer-length later to maint). | 
|  |  | 
|  | * The "mailmap.file" configuration option did not support tilde | 
|  | expansion (i.e. ~user/path and ~/path). | 
|  | (merge 9352fd5 ow/config-mailmap-pathname later to maint). | 
|  |  | 
|  | * The completion scripts (in contrib/) did not know about quite a few | 
|  | options that are common between "git merge" and "git pull", and a | 
|  | couple of options unique to "git merge". | 
|  | (merge 8fee872 jk/complete-merge-pull later to maint). | 
|  |  | 
|  | * The unix-domain socket used by the sample credential cache daemon | 
|  | tried to unlink an existing stale one at a wrong path, if the path | 
|  | to the socket was given as an overlong path that does not fit in | 
|  | the sun_path member of the sockaddr_un structure. | 
|  | (merge 2869b3e rs/fix-unlink-unix-socket later to maint). | 
|  |  | 
|  | * An ancient rewrite passed a wrong pointer to a curl library | 
|  | function in a rarely used code path. | 
|  | (merge 479eaa8 ah/fix-http-push later to maint). | 
|  |  | 
|  | * "--ignore-space-change" option of "git apply" ignored the spaces | 
|  | at the beginning of lines too aggressively, which is inconsistent | 
|  | with the option of the same name that "diff" and "git diff" have. | 
|  | (merge 14d3bb4 jc/apply-ignore-whitespace later to maint). | 
|  |  | 
|  | * "git blame" miscounted the number of columns needed to show localized | 
|  | timestamps, resulting in a jaggy left-side-edge for the source code | 
|  | lines in its output. | 
|  | (merge dd75553 jx/blame-align-relative-time later to maint). | 
|  |  | 
|  | * "git blame" assigned the blame to the copy in the working-tree if | 
|  | the repository is set to core.autocrlf=input and the file used CRLF | 
|  | line endings. | 
|  | (merge 4d4813a bc/blame-crlf-test later to maint). | 
|  |  | 
|  | * "git clone -b brefs/tags/bar" would have mistakenly thought we were | 
|  | following a single tag, even though it was a name of the branch, | 
|  | because it incorrectly used strstr(). | 
|  | (merge 60a5f5f jc/fix-clone-single-starting-at-a-tag later to maint). | 
|  |  | 
|  | * "git commit --allow-empty-message -C $commit" did not work when the | 
|  | commit did not have any log message. | 
|  | (merge 076cbd6 jk/commit-C-pick-empty later to maint). | 
|  |  | 
|  | * "git diff --find-copies-harder" sometimes pretended as if the mode | 
|  | bits have changed for paths that are marked with the assume-unchanged | 
|  | bit. | 
|  | (merge 5304810 jk/diff-files-assume-unchanged later to maint). | 
|  |  | 
|  | * "filter-branch" left an empty single-parent commit that results when | 
|  | all parents of a merge commit get mapped to the same commit, even | 
|  | under "--prune-empty". | 
|  | (merge 79bc4ef cb/filter-branch-prune-empty-degenerate-merges later to maint). | 
|  |  | 
|  | * "git format-patch" did not enforce the rule that the "--follow" | 
|  | option from the log/diff family of commands must be used with | 
|  | exactly one pathspec. | 
|  | (merge dd63f16 jk/diff-follow-must-take-one-pathspec later to maint). | 
|  |  | 
|  | * "git gc --auto" was recently changed to run in the background to | 
|  | give control back early to the end-user sitting in front of the | 
|  | terminal, but it forgot that housekeeping involving reflogs should | 
|  | be done without other processes competing for accesses to the refs. | 
|  | (merge 62aad18 nd/daemonize-gc later to maint). | 
|  |  | 
|  | * "git grep -O" to show the lines that hit in the pager did not work | 
|  | well with case insensitive search.  We now spawn "less" with its | 
|  | "-I" option when it is used as the pager (which is the default). | 
|  | (merge f7febbe sk/spawn-less-case-insensitively-from-grep-O-i later to maint). | 
|  |  | 
|  | * We used to disable threaded "git index-pack" on platforms without | 
|  | thread-safe pread(); use a different workaround for such | 
|  | platforms to allow threaded "git index-pack". | 
|  | (merge 3953949 nd/index-pack-one-fd-per-thread later to maint). | 
|  |  | 
|  | * The error reporting from "git index-pack" has been improved to | 
|  | distinguish missing objects from type errors. | 
|  | (merge 77583e7 jk/index-pack-report-missing later to maint). | 
|  |  | 
|  | * "log --show-signature" incorrectly decided the color to paint a | 
|  | mergetag that was and was not correctly validated. | 
|  | (merge 42c55ce mg/fix-log-mergetag-color later to maint). | 
|  |  | 
|  | * "log --show-signature" did not pay attention to the "--graph" option. | 
|  | (merge cf3983d zk/log-graph-showsig later to maint). | 
|  |  | 
|  | * "git mailinfo" used to read beyond the ends of header strings while | 
|  | parsing an incoming e-mail message to extract the patch. | 
|  | (merge b1a013d rs/mailinfo-header-cmp later to maint). | 
|  |  | 
|  | * On a case insensitive filesystem, merge-recursive incorrectly | 
|  | deleted the file that is to be renamed to a name that is the same | 
|  | except for case differences. | 
|  | (merge baa37bf dt/merge-recursive-case-insensitive later to maint). | 
|  |  | 
|  | * Merging changes into a file that ends in an incomplete line made the | 
|  | last line into a complete one, even when the other branch did not | 
|  | change anything around the end of file. | 
|  | (merge ba31180 mk/merge-incomplete-files later to maint). | 
|  |  | 
|  | * "git pack-objects" unnecessarily copied the previous contents when | 
|  | extending the hashtable, even though it will populate the table | 
|  | from scratch anyway. | 
|  | (merge fb79947 rs/pack-objects-no-unnecessary-realloc later to maint). | 
|  |  | 
|  | * Recent updates to "git repack" started to duplicate objects that | 
|  | are in packfiles marked with the .keep flag into the new packfile by | 
|  | mistake. | 
|  | (merge d078d85 jk/repack-pack-keep-objects later to maint). | 
|  |  | 
|  | * "git rerere forget" did not work well when merge.conflictstyle | 
|  | was set to a non-default value. | 
|  | (merge de3d8bb fc/rerere-conflict-style later to maint). | 
|  |  | 
|  | * "git remote rm" and "git remote prune" can involve removing many | 
|  | refs at once, which is not a very efficient thing to do when very | 
|  | many refs exist in the packed-refs file. | 
|  | (merge e6bea66 jl/remote-rm-prune later to maint). | 
|  |  | 
|  | * "git log --exclude=<glob> --all | git shortlog" worked as expected, | 
|  | but "git shortlog --exclude=<glob> --all", which is supposed to be | 
|  | identical to the above pipeline, was not accepted at the command | 
|  | line argument parser level. | 
|  | (merge eb07774 jc/shortlog-ref-exclude later to maint). | 
|  |  | 
|  | * The autostash mode of "git rebase -i" did not restore the dirty | 
|  | working tree state if the user aborted the interactive rebase by | 
|  | emptying the insn sheet. | 
|  | (merge ddb5432 rr/rebase-autostash-fix later to maint). | 
|  |  | 
|  | * "git rebase --fork-point" did not filter out patch-identical | 
|  | commits correctly. | 
|  |  | 
|  | * During "git rebase --merge", a conflicted patch could not be | 
|  | skipped with "--skip" if the next one also conflicted. | 
|  | (merge 95104c7 bc/fix-rebase-merge-skip later to maint). | 
|  |  | 
|  | * "git show -s" (i.e. show log message only) used to incorrectly emit | 
|  | an extra blank line after a merge commit. | 
|  | (merge ad2f725 mk/show-s-no-extra-blank-line-for-merges later to maint). | 
|  |  | 
|  | * "git status", even though it is a read-only operation, tries to | 
|  | update the index with refreshed lstat(2) info to optimize future | 
|  | accesses to the working tree opportunistically, but this could | 
|  | race with a "read-write" operation that modifies the index while it | 
|  | is running.  Detect such a race and avoid overwriting the index. | 
|  | (merge 426ddee ym/fix-opportunistic-index-update-race later to maint). | 
|  |  | 
|  | * "git status" (and "git commit") behaved as if changes in a modified | 
|  | submodule are not there if submodule.*.ignore configuration is set, | 
|  | which was misleading.  The configuration is only to unclutter diff | 
|  | output during the course of development, and not to hide | 
|  | changes in the "status" output to cause the users forget to commit | 
|  | them. | 
|  | (merge c215d3d jl/status-added-submodule-is-never-ignored later to maint). | 
|  |  | 
|  | * Documentation for "git submodule sync" forgot to say that the subcommand | 
|  | can take the "--recursive" option. | 
|  | (merge 9393ae7 mc/doc-submodule-sync-recurse later to maint). | 
|  |  | 
|  | * "git update-index --cacheinfo" in 2.0 release crashed on a | 
|  | malformed command line. | 
|  | (merge c8e1ee4 jc/rev-parse-argh-dashed-multi-words later to maint). | 
|  |  | 
|  | * The mode to run tests with HTTP server tests disabled was broken. | 
|  | (merge afa53fe na/no-http-test-in-the-middle later to maint). |