GIT Changelog

New in version 2.4.5

June 26th, 2015
  • The setup code used to die when core.bare and core.worktree are set inconsistently, even for commands that do not need working tree.
  • There was a dead code that used to handle "git pull --tags" and show special-cased error message, which was made irrelevant when the semantics of the option changed back in Git 1.9 days.
  • "color.diff.plain" was a misnomer; give it 'color.diff.context' as a more logical synonym.
  • The configuration reader/writer uses mmap(2) interface to access the files; when we find a directory, it barfed with "Out of memory?".
  • Recent "git prune" traverses young unreachable objects to safekeep old objects in the reachability chain from them, which sometimes showed unnecessary error messages that are alarming.
  • "git rebase -i" fired post-rewrite hook when it shouldn't (namely, when it was told to stop sequencing with 'exec' insn).

New in version 2.4.4 (June 17th, 2015)

  • l10n updates for German.
  • An earlier leakfix to bitmap testing code was incomplete.
  • "git clean pathspec..." tried to lstat(2) and complain even for paths outside the given pathspec.
  • Communication between the HTTP server and http_backend process can lead to a dead-lock when relaying a large ref negotiation request. Diagnose the situation better, and mitigate it by reading such a request first into core (to a reasonable limit).
  • The clean/smudge interface did not work well when filtering an empty contents (failed and then passed the empty input through). It can be argued that a filter that produces anything but empty for an empty input is nonsense, but if the user wants to do strange things, then why not?
  • Make "git stash something --help" error out, so that users can safely say "git stash drop --help".
  • Clarify that "log --raw" and "log --format=raw" are unrelated concepts.
  • Catch a programmer mistake to feed a pointer not an array to ARRAY_SIZE() macro, by using a couple of GCC extensions.

New in version 2.4.3 (June 6th, 2015)

  • Error messages from "git branch" called remote-tracking branches as "remote branches".
  • "git rerere forget" in a repository without rerere enabled gave a cryptic error message; it should be a silent no-op instead.
  • "git pull --log" and "git pull --no-log" worked as expected, but "git pull --log=20" did not.
  • The pull.ff configuration was supposed to override the merge.ff configuration, but it didn't.
  • The code to read pack-bitmap wanted to allocate a few hundred pointers to a structure, but by mistake allocated and leaked memory enough to hold that many actual structures. Correct the allocation size and also have it on stack, as it is small enough.
  • Various documentation mark-up fixes to make the output more consistent in general and also make AsciiDoctor (an alternative formatter) happier.
  • "git bundle verify" did not diagnose extra parameters on the command line.
  • Multi-ref transaction support we merged a few releases ago unnecessarily kept many file descriptors open, risking to fail with resource exhaustion.
  • The ref API did not handle cases where 'refs/heads/xyzzy/frotz' is removed at the same time as 'refs/heads/xyzzy' is added (or vice versa) very well.
  • The "log --decorate" enhancement in Git 2.4 that shows the commit at the tip of the current branch e.g. "HEAD -> master", did not work with --decorate=full.
  • There was a commented-out (instead of being marked to expect failure) test that documented a breakage that was fixed since the test was written; turn it into a proper test.
  • core.excludesfile (defaulting to $XDG_HOME/git/ignore) is supposed to be overridden by repository-specific .git/info/exclude file, but the order was swapped from the beginning. This belatedly fixes it.
  • The connection initiation code for "ssh" transport tried to absorb differences between the stock "ssh" and Putty-supplied "plink" and its derivatives, but the logic to tell that we are using "plink" variants were too loose and falsely triggered when "plink" appeared anywhere in the path (e.g. "/home/me/bin/uplink/ssh").
  • "git rebase -i" moved the "current" command from "todo" to "done" a bit too prematurely, losing a step when a "pick" did not even start.
  • "git add -e" did not allow the user to abort the operation by killing the editor.
  • Git 2.4 broke setting verbosity and progress levels on "git clone" with native transports.
  • Some time ago, "git blame" (incorrectly) lost the convert_to_git() call when synthesizing a fake "tip" commit that represents the state in the working tree, which broke folks who record the history with LF line ending to make their project portabile across platforms while terminating lines in their working tree files with CRLF for their platform.
  • Code clean-up for xdg configuration path support.

New in version 2.4.2 (May 27th, 2015)

  • "git rev-list --objects $old --not --all" to see if everything that is reachable from $old is already connected to the existing refs was very inefficient.
  • "hash-object --literally" introduced in v2.2 was not prepared to take a really long object type name.
  • "git rebase --quiet" was not quite quiet when there is nothing to do.
  • The completion for "log --decorate=" parameter value was incorrect.
  • "filter-branch" corrupted commit log message that ends with an incomplete line on platforms with some "sed" implementations that munge such a line. Work it around by avoiding to use "sed".
  • "git daemon" fails to build from the source under NO_IPV6 configuration (regression in 2.4).
  • "git stash pop/apply" forgot to make sure that not just the working tree is clean but also the index is clean. The latter is important as a stash application can conflict and the index will be used for conflict resolution.
  • We have prepended $GIT_EXEC_PATH and the path "git" is installed in (typically "/usr/bin") to $PATH when invoking subprograms and hooks for almost eternity, but the original use case the latter tried to support was semi-bogus (i.e. install git to /opt/foo/git and run it without having /opt/foo on $PATH), and more importantly it has become less and less relevant as Git grew more mainstream (i.e. the users would _want_ to have it on their $PATH). Stop prepending the path in which "git" is installed to users' $PATH, as that would interfere the command search order people depend on (e.g. they may not like versions of programs that are unrelated to Git in /usr/bin and want to override them by having different ones in /usr/local/bin and have the latter directory earlier in their $PATH).
  • Also contains typofixes, documentation updates and trivial code clean-ups.

New in version 2.4.1 (May 14th, 2015)

  • The usual "git diff" when seeing a file turning into a directory showed a patchset to remove the file and create all files in the directory, but "git diff --no-index" simply refused to work. Also, when asked to compare a file and a directory, imitate POSIX "diff" and compare the file with the file with the same name in the directory, instead of refusing to run.
  • The default $HOME/.gitconfig file created upon "git config --global" that edits it had incorrectly spelled user.name and user.email entries in it.
  • "git commit --date=now" or anything that relies on approxidate lost the daylight-saving-time offset.
  • "git cat-file bl $blob" failed to barf even though there is no object type that is "bl".
  • Teach the codepaths that read .gitignore and .gitattributes files that these files encoded in UTF-8 may have UTF-8 BOM marker at the beginning; this makes it in line with what we do for configuration files already.
  • Access to objects in repositories that borrow from another one on a slow NFS server unnecessarily got more expensive due to recent code becoming more cautious in a naive way not to lose objects to pruning.
  • We avoid setting core.worktree when the repository location is the ".git" directory directly at the top level of the working tree, but the code misdetected the case in which the working tree is at the root level of the filesystem (which arguably is a silly thing to do, but still valid).

New in version 2.4.0 (May 4th, 2015)

  • Fixes since v2.3:
  • Unless otherwise noted, all the fixes since v2.3 in the maintenance track are contained in this release (see the maintenance releases' notes for details). * "git blame HEAD -- missing" failed to correctly say "HEAD" when it tried to say "No such path 'missing' in HEAD". (merge a46442f jk/blame-commit-label later to maint). * "git rerere" (invoked internally from many mergy operations) did not correctly signal errors when it attempted to update the working tree files but failed for whatever reason. (merge 89ea903 jn/rerere-fail-on-auto-update-failure later to maint). * Setting diff.submodule to 'log' made "git format-patch" produce broken patches. (merge 339de50 dk/format-patch-ignore-diff-submodule later to maint). * After attempting and failing a password-less authentication (e.g., Kerberos), libcURL refuses to fall back to password-based Basic authentication without a bit of help/encouragement. (merge 4dbe664 bc/http-fallback-to-password-after-krb-fails later to maint). * The "git push" documentation for the "--repo=" option was easily misunderstood. (merge 57b92a7 mg/push-repo-option-doc later to maint). * Code to read a branch name from various files in the .git/ directory would have overrun array limits if asked to read an empty file. (merge 66ec904 jk/status-read-branch-name-fix later to maint). * Remove a superfluous conditional that is always true. (merge 94ee8e2 jk/remote-curl-an-array-in-struct-cannot-be-null later to maint). * The "git diff --raw" documentation incorrectly implied that C(opy) and R(ename) are the only statuses that can be followed by a score number. (merge ac1c2d9 jc/diff-format-doc later to maint). * A broken pack .idx file in the receiving repository prevented the dumb http transport from fetching a good copy of it from the other side. (merge 8b9c2dd jk/dumb-http-idx-fetch-fix later to maint). * The error message from "git commit", when a non-existing author name was given as value to the "--author=" parameter, has been reworded to avoid misunderstanding. (merge 1044b1f mg/commit-author-no-match-malformed-message later to maint). * "git log --help" used to show rev-list options that are irrelevant to the "log" command. (merge 3cab02d jc/doc-log-rev-list-options later to maint). * "git apply --whitespace=fix" used to under-allocate memory when the fix resulted in a longer text than the original patch. (merge 407a792 jc/apply-ws-fix-expands later to maint). * The interactive "show a list and let the user choose from it" interface used by "git add -i" unnecessarily prompted the user even when the candidate list was empty, against which the only "choice" the user could have made was to choose nothing. (merge a9c4641 ak/add-i-empty-candidates later to maint). * The todo list created by "git rebase -i" did not fully honor core.abbrev settings. (merge edb72d5 ks/rebase-i-abbrev later to maint). * "git fetch" over a remote-helper that cannot respond to the "list" command could not fetch from a symbolic reference (e.g., HEAD). (merge 33cae54 mh/deref-symref-over-helper-transport later to maint). * "git push --signed" gave an incorrectly worded error message when the other side did not support the capability. * The "git push --signed" protocol extension did not limit what the "nonce" (a server-chosen string) could contain nor how long it could be, which was unnecessarily lax. Limit both the length and the alphabet to a reasonably small space that can still have enough entropy. (merge afcb6ee jc/push-cert later to maint). * The completion script (in contrib/) clobbered the shell variable $x in the global shell namespace. (merge 852ff1c ma/bash-completion-leaking-x later to maint). * We incorrectly formatted a "uintmax_t" integer that doesn't fit in "int". (merge d306f3d jk/decimal-width-for-uintmax later to maint). * The configuration parser used to be confused when reading configuration from a blob object that ends with a lone CR. (merge 1d0655c jk/config-no-ungetc-eof later to maint). * The pack bitmap support did not build with older versions of GCC. (merge bd4e882 jk/pack-bitmap later to maint). * The documentation wasn't clear that "remote..pushURL" and "remote..URL" are there to name the same repository accessed via different transports, not two separate repositories. (merge 697f652 jc/remote-set-url-doc later to maint). * Older GnuPG implementations may not correctly import the keyring material we prepare for the tests to use. (merge 1f985d6 ch/new-gpg-drops-rfc-1991 later to maint). * The credential helper for Windows (in contrib/) used to mishandle user names that contain an at-sign. (merge 13d261e av/wincred-with-at-in-username-fix later to maint). * "diff-highlight" (in contrib/) used to show byte-by-byte differences, which could cause multi-byte characters to be chopped in the middle. It learned to pay attention to character boundaries (assuming UTF-8). (merge 8d00662 jk/colors later to maint). * Document longstanding configuration variable naming rules in CodingGuidelines. (merge 35840a3 jc/conf-var-doc later to maint). * An earlier workaround to squelch unhelpful deprecation warnings from the compiler on OS X unnecessarily set a minimum required version of the OS, which the user might want to raise (or lower) for other reasons. (merge 88c03eb es/squelch-openssl-warnings-on-macosx later to maint). * Certain older vintages of cURL give irregular output from "curl-config --vernum", which confused our build system. (merge 3af6792 tc/curl-vernum-output-broken-in-7.11 later to maint). * In v2.2.0, we broke "git prune" that runs in a repository that borrows from an alternate object store. (merge b0a4264 jk/prune-mtime later to maint). * "git submodule add" failed to squash "path/to/././submodule" to "path/to/submodule". (merge 8196e72 ps/submodule-sanitize-path-upon-add later to maint). * "git merge-file" did not work correctly when invoked in a subdirectory. (merge 204a8ff ab/merge-file-prefix later to maint). * "git blame" could die trying to free an uninitialized piece of memory. (merge e600592 es/blame-commit-info-fix later to maint). * "git fast-import" used to crash when it could not close and finalize the resulting packfile cleanly. (merge 5e915f3 jk/fast-import-die-nicely-fix later to maint). * "update-index --refresh" used to leak memory when an entry could not be refreshed for whatever reason. (merge bc1c2ca sb/plug-leak-in-make-cache-entry later to maint). * The "interpolated-path" option of "git daemon" inserted any string the client declared on the "host=" capability request without checking. Sanitize and limit %H and %CH to a saner and a valid DNS name. (merge b485373 jk/daemon-interpolate later to maint). * "git daemon" unnecessarily looked up the hostname even when "%CH" and "%IP" interpolations were not requested. (merge dc8edc8 rs/daemon-interpolate later to maint). * We relied on "--no-" prefix handling in Perl's Getopt::Long package, even though that support didn't exist in Perl 5.8 (which we still support). Manually add support to help people with older Getopt::Long packages. (merge f471494 km/send-email-getopt-long-workarounds later to maint). * "git apply" was not very careful about reading from, removing, updating and creating paths outside the working tree (under --index/--cached) or the current directory (when used as a replacement for GNU patch). (merge e0d201b jc/apply-beyond-symlink later to maint). * Correct a breakage in git-svn, introduced around the v2.2 era, that can cause FileHandles to be closed prematurely. (merge e426311 ew/svn-maint-fixes later to maint). * We did not parse usernames followed by literal IPv6 addresses correctly in SSH transport URLs; e.g., ssh://user@[2001:db8::1]:22/repo.git. (merge 6b6c5f7 tb/connect-ipv6-parse-fix later to maint). * The configuration variable 'mailinfo.scissors' was hard to discover in the documentation. (merge afb5de7 mm/am-c-doc later to maint). * The interaction between "git submodule update" and the submodule.*.update configuration was not clearly documented. (merge 5c31acf ms/submodule-update-config-doc later to maint). * "git diff --shortstat" used together with "--dirstat=changes" or "--dirstat=files" incorrectly output dirstat information twice. (merge ab27389 mk/diff-shortstat-dirstat-fix later to maint). * The manpage for "git remote add" mentioned "--tags" and "--no-tags" but did not explain what happens if neither option is provided. (merge aaba0ab mg/doc-remote-tags-or-not later to maint). * The description of "--exclude-standard option" in the output of "git grep -h" was phrased poorly. (merge 77fdb8a nd/grep-exclude-standard-help-fix later to maint). * "git rebase -i" recently started to include the number of commits in the todo list, but that output included extraneous whitespace on a platform that prepends leading whitespaces to its "wc -l" output. (merge 2185d3b es/rebase-i-count-todo later to maint). * The borrowed code in the kwset API did not follow our usual convention to use "unsigned char" to store values that range from 0-255. (merge 189c860 bw/kwset-use-unsigned later to maint). * A corrupt input to "git diff -M" used to cause it to segfault. (merge 4d6be03 jk/diffcore-rename-duplicate later to maint). * Certain builds of GPG triggered false breakages in a test. (merge 3f88c1b mg/verify-commit later to maint). * "git imap-send" learned to optionally talk with an IMAP server via libcURL. Because there is no other option when Git is built with the NO_OPENSSL option, use libcURL by default in that case. (merge dcd01ea km/imap-send-libcurl-options later to maint). * "git log --decorate" did not reset colors correctly around the branch names. (merge 5ee8758 jc/decorate-leaky-separator-color later to maint). * The code that reads from the ctags file in the completion script (in contrib/) did not spell ${param/pattern/string} substitution correctly, which happened to work with bash but not with zsh. (merge db8d750 js/completion-ctags-pattern-substitution-fix later to maint). * The transfer.hiderefs support did not quite work for smart-http transport. (merge 8ddf3ca jk/smart-http-hide-refs later to maint). * In the "git tag -h" output, move the documentation for the "--column" and "--sort" options to the "Tag listing options" section. (merge dd059c6 jk/tag-h-column-is-a-listing-option later to maint). * "git prune" used to largely ignore broken refs when deciding which objects are still being used, which could cause reference corruption to lead to object loss. (merge ea56c4e jk/prune-with-corrupt-refs later to maint). * The split-index mode introduced in v2.3.0-rc0~41 was broken in the codepath to protect us against a broken reimplementation of Git that writes an invalid index with duplicated index entries, etc. (merge 03f15a7 tg/fix-check-order-with-split-index later to maint). * "git fetch", when fetching a commit using the allow-tip-sha1-in-want extension, could have failed to fetch all of the requested refs. (merge 32d0462 jk/fetch-pack later to maint). * An failure early in the "git clone" that started creating the working tree and repository could have resulted in the failure to clean up some directories and files. (merge 16eff6c jk/cleanup-failed-clone later to maint). * Recommend format-patch and send-email for those who want to submit patches to this project. (merge b25c469 jc/submitting-patches-mention-send-email later to maint). * Do not spawn the pager when "git grep" is run with "--quiet". (merge c2048f0 ws/grep-quiet-no-pager later to maint). * The prompt script (in contrib/) did not show the untracked sign when working in a subdirectory without any untracked files. (merge 9bdc517 ct/prompt-untracked-fix later to maint). * An earlier update to the URL parser broke an address that contains a colon but an empty string for the port number, like ssh://example.com:/path/to/repo. (merge 6b6c5f7 tb/connect-ipv6-parse-fix later to maint). * Code cleanups and documentation updates. (merge 2ce63e9 rs/simple-cleanups later to maint). (merge 33baa69 rj/no-xopen-source-for-cygwin later to maint). (merge 817d03e jc/diff-test-updates later to maint). (merge eb32c66 ak/t5516-typofix later to maint). (merge bcd57cb mr/doc-clean-f-f later to maint). (merge 0d6accc mg/doc-status-color-slot later to maint). (merge 53e53c7 sg/completion-remote later to maint). (merge 8fa7975 ak/git-done-help-cleanup later to maint). (merge 9a6f128 rs/deflate-init-cleanup later to maint). (merge 6f75d45 rs/use-isxdigit later to maint). (merge 376e4b3 jk/test-annoyances later to maint). (merge 7032054 nd/doc-git-index-version later to maint). (merge e869c5e tg/test-index-v4 later to maint). (merge 599d223 jk/simplify-csum-file-sha1fd-check later to maint). (merge 260d585 sg/completion-gitcomp-nl-for-refs later to maint). (merge 777c55a jc/report-path-error-to-dir later to maint). (merge fddfaf8 ph/push-doc-cas later to maint). (merge d50d31e ss/pull-rebase-preserve later to maint). (merge c8c3f1d pt/enter-repo-comment-fix later to maint). (merge d7bfb9e jz/gitweb-conf-doc-fix later to maint). (merge f907282 jk/cherry-pick-docfix later to maint). (merge d3c0811 iu/fix-parse-options-h-comment later to maint). (merge 6c3b2af jg/cguide-we-cannot-count later to maint). (merge 2b8bd44 jk/pack-corruption-post-mortem later to maint). (merge 9585cb8 jn/doc-fast-import-no-16-octopus-limit later to maint). (merge 5dcd1b1 ps/grep-help-all-callback-arg later to maint). (merge f1f4c84 va/fix-git-p4-tests later to maint).

New in version 2.3.7 (April 28th, 2015)

  • An earlier update to the parser that disects a URL broke an address, followed by a colon, followed by an empty string (instead of the port number), e.g. ssh://example.com:/path/to/repo.
  • The completion script (in contrib/) contaminated global namespace and clobbered on a shell variable $x.
  • The "git push --signed" protocol extension did not limit what the "nonce" that is a server-chosen string can contain or how long it can be, which was unnecessarily lax. Limit both the length and the alphabet to a reasonably small space that can still have enough entropy.

New in version 2.3.6 (April 22nd, 2015)

  • "diff-highlight" (in contrib/) used to show byte-by-byte differences, which meant that multi-byte characters can be chopped in the middle. It learned to pay attention to character boundaries (assuming the UTF-8 payload).

New in version 2.3.5 (April 2nd, 2015)

  • The prompt script (in contrib/) did not show the untracked sign when working in a subdirectory without any untracked files.
  • Even though "git grep --quiet" is run merely to ask for the exit status, we spawned the pager regardless. Stop doing that.
  • Recommend format-patch and send-email for those who want to submit patches to this project.
  • An failure early in the "git clone" that started creating the working tree and repository could have resulted in some directories and files left without getting cleaned up.
  • "git fetch" that fetches a commit using the allow-tip-sha1-in-want extension could have failed to fetch all the requested refs.
  • The split-index mode introduced at v2.3.0-rc0~41 was broken in the codepath to protect us against a broken reimplementation of Git that writes an invalid index with duplicated index entries, etc.
  • "git prune" used to largely ignore broken refs when deciding which objects are still being used, which could spread an existing small damage and make it a larger one.
  • "git tag -h" used to show the "--column" and "--sort" options that are about listing in a wrong section.
  • The transfer.hiderefs support did not quite work for smart-http transport.
  • The code that reads from the ctags file in the completion script (in contrib/) did not spell ${param/pattern/string} substitution correctly, which happened to work with bash but not with zsh.
  • The explanation on "rebase --preserve-merges", "pull --rebase=preserve", and "push --force-with-lease" in the documentation was unclear.

New in version 2.3.4 (March 24th, 2015)

  • The 'color.status.unmerged' configuration was not described.
  • "git log --decorate" did not reset colors correctly around the branch names.
  • "git -C '' subcmd" refused to work in the current directory, unlike "cd ''" which silently behaves as a no-op.
  • "git imap-send" learned to optionally talk with an IMAP server via libcURL; because there is no other option when Git is built with NO_OPENSSL option, use that codepath by default under such configuration.
  • A workaround for certain build of GPG that triggered false breakage in a test has been added.
  • "git rebase -i" recently started to include the number of commits in the insn sheet to be processed, but on a platform that prepends leading whitespaces to "wc -l" output, the numbers are shown with extra whitespaces that aren't necessary.
  • We did not parse username followed by literal IPv6 address in SSH transport URLs, e.g. ssh://user@[2001:db8::1]:22/repo.git correctly.

New in version 2.3.3 (March 14th, 2015)

  • A corrupt input to "git diff -M" used cause us to segfault.
  • The borrowed code in kwset API did not follow our usual convention to use "unsigned char" to store values that range from 0-255.
  • Description given by "grep -h" for its --exclude-standard option was phrased poorly.
  • Documentaton for "git remote add" mentioned "--tags" and "--no-tags" and it was not clear that fetch from the remote in the future will use the default behaviour when neither is given to override it.
  • "git diff --shortstat --dirstat=changes" showed a dirstat based on lines that was never asked by the end user in addition to the dirstat that the user asked for.
  • The interaction between "git submodule update" and the submodule
  • update configuration was not clearly documented.
  • "git apply" was not very careful about reading from, removing, updating and creating paths outside the working tree (under --index/--cached) or the current directory (when used as a replacement for GNU patch).
  • "git daemon" looked up the hostname even when "%CH" and "%IP" interpolations are not requested, which was unnecessary.
  • The "interpolated-path" option of "git daemon" inserted any string client declared on the "host=" capability request without checking. Sanitize and limit %H and %CH to a saner and a valid DNS name.

New in version 2.3.1 (February 26th, 2015)

  • The interactive "show a list and let the user choose from it" interface "add -i" used showed and prompted to the user even when the candidate list was empty, against which the only "choice" the user could have made was to choose nothing.
  • "git apply --whitespace=fix" used to under-allocate the memory when the fix resulted in a longer text than the original patch.
  • "git log --help" used to show rev-list options that are irrelevant to the "log" command.
  • The error message from "git commit", when a non-existing author name was given as value to the "--author=" parameter, has been reworded to avoid misunderstanding.
  • A broken pack .idx file in the receiving repository prevented the dumb http transport from fetching a good copy of it from the other side.
  • The documentation incorrectly said that C(opy) and R(ename) are the only ones that can be followed by the score number in the output in the --raw format.
  • Fix a misspelled conditional that is always true.
  • Code to read branch name from various files in .git/ directory would have misbehaved if the code to write them left an empty file.
  • The "git push" documentation made the "--repo=" option easily misunderstood.
  • After attempting and failing a password-less authentication (e.g. kerberos), libcURL refuses to fall back to password based Basic authentication without a bit of help/encouragement.
  • Setting diff.submodule to 'log' made "git format-patch" produce broken patches.
  • "git rerere" (invoked internally from many mergy operations) did not correctly signal errors when told to update the working tree files and failed to do so for whatever reason.
  • "git blame HEAD -- missing" failed to correctly say "HEAD" when it tried to say "No such path 'missing' in HEAD".

New in version 2.3.0 (February 6th, 2015)

  • Ports:
  • Recent gcc toolchain on Cygwin started throwing compilation warning, which has been squelched.
  • A few updates to build on platforms that lack tv_nsec, clock_gettime, CLOCK_MONOTONIC and HMAC_CTX_cleanup (e.g. older RHEL) have been added.
  • UI, Workflows & Features:
  • It was cumbersome to use "GIT_SSH" mechanism when the user wanted to pass an extra set of arguments to the underlying ssh. A new environment variable GIT_SSH_COMMAND can be used for this.
  • A request to store an empty note via "git notes" meant to remove note from the object but with --allow-empty we will store a (surprise!) note that is empty.
  • "git interpret-trailers" learned to properly handle the "Conflicts:" block at the end.
  • "git am" learned "--message-id" option to copy the message ID of the incoming e-mail to the log message of resulting commit.
  • "git clone --reference=" learned the "--dissociate" option to go with it; it borrows objects from the reference object store while cloning only to reduce network traffic and then dissociates the resulting clone from the reference by performing local copies of borrowed objects.
  • "git send-email" learned "--transfer-encoding" option to force a non-fault Content-Transfer-Encoding header (e.g. base64).
  • "git send-email" normally identifies itself via X-Mailer: header in the message it sends out. A new command line flag --no-xmailer allows the user to squelch the header.
  • "git push" into a repository with a working tree normally refuses to modify the branch that is checked out. The command learned to optionally do an equivalent of "git reset --hard" only when there is no change to the working tree and the index instead, which would be useful to "deploy" by pushing into a repository.
  • "git new-workdir" (in contrib/) can be used to populate an empty and existing directory now.
  • Credential helpers are asked in turn until one of them give positive response, which is cumbersome to turn off when you need to run Git in an automated setting. The credential helper interface learned to allow a helper to say "stop, don't ask other helpers." Also GIT_TERMINAL_PROMPT environment can be set to false to disable our built-in prompt mechanism for passwords.
  • "git branch -d" (delete) and "git branch -m" (move) learned to honor "-f" (force) flag; unlike many other subcommands, the way to force these have been with separate "-D/-M" options, which was inconsistent.
  • "diff-highlight" filter (in contrib/) allows its color output to be customized via configuration variables.
  • "git imap-send" learned to take "-v" (verbose) and "-q" (quiet) command line options.
  • "git remote add $name $URL" is now allowed when "url.$URL.insteadOf" is already defined.
  • "git imap-send" now can be built to use cURL library to talk to IMAP servers (if the library is recent enough, of course). This allows you to use authenticate method other than CRAM-MD5, among other things.
  • "git imap-send" now allows GIT_CURL_VERBOSE environment variable to control the verbosity when talking via the cURL library.
  • The prompt script (in contrib/) learned to optionally hide prompt when in an ignored directory by setting GIT_PS1_HIDE_IF_PWD_IGNORED shell variable.
  • Performance, Internal Implementation, Development Support etc.:
  • Earlier we made "rev-list --object-edge" more aggressively list the objects at the edge commits, in order to reduce number of objects  fetched into a shallow repository, but the change affected cases other than "fetching into a shallow repository" and made it unusably slow (e.g. fetching into a normal repository should not have to suffer the overhead from extra processing). Limit it to a more specific case by introducing --objects-edge-aggressive, a new option to rev-list.
  • Squelched useless compiler warnings on Mac OS X regarding the crypto API.
  • The procedure to generate unicode table has been simplified.
  • Some filesystems assign filemodes in a strange way, fooling then automatic "filemode trustability" check done during a new repository creation. The initialization codepath has been hardened against this issue.
  • The codepath in "git remote update --prune" to drop many refs has been optimized.
  • The API into get_merge_bases*() family of functions was easy to misuse, which has been corrected to make it harder to do so.
  • Long overdue departure from the assumption that S_IFMT is shared by everybody made in 2005, which was necessary to port to z/OS.
  • "git push" and "git fetch" did not communicate an overlong refname correctly. Now it uses 64kB sideband to accommodate longer ones.
  • Recent GPG changes the keyring format and drops support for RFC1991 formatted signatures, breaking our existing tests.
  • "git-prompt" (in contrib/) used a variable from the global scope, possibly contaminating end-user's namespace.
  • Also contains various documentation updates and code clean-ups.
  • Fixes since v2.2:
  • Unless otherwise noted, all the fixes since v2.2 in the maintenance
  • track are contained in this release (see the maintenance releases'
  • notes for details).
  • "git http-push" over WebDAV (aka dumb http-push) was broken in v2.2.2 when parsing a symbolic ref, resulting in a bogus request that gets rejected by recent versions of cURL library. (merge f6786c8 jk/http-push-symref-fix later to maint).
  • The logic in "git bisect bad HEAD" etc. to avoid forcing the test of the common ancestor of bad and good commits was broken. (merge 07913d5 cc/bisect-rev-parsing later to maint).
  • "git checkout-index --temp=$target $path" did not work correctly for paths outside the current subdirectory in the project. (merge 74c4de5 es/checkout-index-temp later to maint).
  • The report from "git checkout" on a branch that builds on another local branch by setting its branch.*.merge to branch name (not a full refname) incorrectly said that the upstream is gone. (merge 05e7368 jc/checkout-local-track-report later to maint).
  • With The git-prompt support (in contrib/), using the exit status of the last command in the prompt, e.g. PS1='$(__git_ps1) $? ', did not work well, because the helper function stomped on the exit status. (merge 6babe76 tf/prompt-preserve-exit-status later to maint).
  • Recent update to "git commit" broke amending an existing commit with bogus author/committer lines without a valid e-mail address. (merge c83a509 jk/commit-date-approxidate later to maint).
  • The lockfile API used to get confused which file to clean up when the process moved the $cwd after creating a lockfile. (merge fa137f6 nd/lockfile-absolute later to maint).
  • Traditionally we tried to avoid interpreting date strings given by the user as future dates, e.g. GIT_COMMITTER_DATE=2014-12-10 when used early November 2014 was taken as "October 12, 2014" because it is likely that a date in the future, December 10, is a mistake. This heuristics has been loosened to allow people to express future dates (most notably, --until= may want to be far in the future) and we no longer tiebreak by future-ness of the date when
  • (1) ISO-like format is used, and (2) the string can make sense interpreted as both y-m-d and y-d-m.
  • Git may still have to use the heuristics to tiebreak between dd/mm/yy and mm/dd/yy, though. (merge d372395 jk/approxidate-avoid-y-d-m-over-future-dates later to maint).
  • Git did not correctly read an overlong refname from a packed refs file. (merge ea41783 jk/read-packed-refs-without-path-max later to maint).
  • "git apply" was described in the documentation to take --ignore-date option, which it does not. (merge 0cef4e7 rw/apply-does-not-take-ignore-date later to maint).
  • "git add -i" did not notice when the interactive command input stream went away and kept asking the same question. (merge a8bec7a jk/add-i-read-error later to maint).
  • "git send-email" did not handle RFC 2047 encoded headers quite right. (merge ab47e2a rd/send-email-2047-fix later to maint).
  • New tag object format validation added in 2.2 showed garbage after a tagname it reported in its error message. (merge a1e920a js/fsck-tag-validation later to maint).
  • The code that reads the reflog from the newer to the older entries did not handle an entry that crosses a boundary of block it uses to read them correctly. (merge 69216bf jk/for-each-reflog-ent-reverse later to maint).
  • "git diff -B -M" after making a new copy B out of an existing file A and then editing A extensively ought to report that B was created by copying A and A was modified, which is what "git diff -C" reports, but it instead said A was renamed to B and A was edited heavily in place. This was not just incoherent but also failed to apply with "git apply". The report has been corrected to match what "git diff -C" produces for this case. (merge 6936b58 jc/diff-b-m later to maint).
  • In files we pre-populate for the user to edit with commented hints, a line of hint that is indented with a tab used to show as '#' (or any comment char), ' ' (space), and then the hint text that began with the tab, which some editors flag as an indentation error (tab following space). We now omit the space after the comment char in such a case. (merge d55aeb7 jc/strbuf-add-lines-avoid-sp-ht-sequence later to maint).
  • "git ls-tree" does not support path selection based on negative pathspecs, but did not error out when negative pathspecs are given. (merge f1f6224 nd/ls-tree-pathspec later to maint).
  • The function sometimes returned a non-freeable memory and some other times returned a piece of memory that must be freed, leading to inevitable leaks. (merge 59362e5 jc/exec-cmd-system-path-leak-fix later to maint).
  • The code to abbreviate an object name to its short unique prefix has been optimized when no abbreviation was requested. (merge 61e704e mh/find-uniq-abbrev later to maint).
  • "git add --ignore-errors ..." did not ignore an error to give a file that did not exist. (merge 1d31e5a mg/add-ignore-errors later to maint).
  • "git checkout $treeish $path", when $path in the index and the working tree already matched what is in $treeish at the $path, still overwrote the $path unnecessarily. (merge c5326bd jk/checkout-from-tree later to maint).
  • "git config --get-color" did not parse its command line arguments carefully. (merge cb35722 jk/colors-fix later to maint).
  • open() emulated on Windows platforms did not give EISDIR upon an attempt to open a directory for writing. (merge ba6fad0 js/windows-open-eisdir-error later to maint).
  • A few code paths used abs() when they should have used labs() on long integers. (merge 83915ba rs/maint-config-use-labs later to maint). (merge 31a8aa1 rs/receive-pack-use-labs later to maint).
  • "gitweb" used to depend on a behaviour recent CGI.pm deprecated. (merge 13dbf46 jk/gitweb-with-newer-cgi-multi-param later to maint).
  • "git init" (hence "git clone") initialized the per-repository configuration file .git/config with x-bit by mistake. (merge 1f32ecf mh/config-flip-xbit-back-after-checking later to maint).
  • Recent update in Git 2.2 started creating objects/info/packs and info/refs files with permission bits tighter than user's umask. (merge d91175b jk/prune-packed-server-info later to maint).
  • Git 2.0 was supposed to make the "simple" mode for the default of "git push", but it didn't. (merge 00a6fa0 jk/push-simple later to maint).
  • "Everyday" document had a broken link. (merge 366c8d4 po/everyday-doc later to maint).
  • A few test fixes. (merge 880ef58 jk/no-perl-tests later to maint).
  • The build procedure did not bother fixing perl and python scripts when NO_PERL and NO_PYTHON build-time configuration changed. (merge ca2051d jk/rebuild-perl-scripts-with-no-perl-seting-change later to maint).
  • The usage string of "git log" command was marked incorrectly for l10n. (merge e66dc0c km/log-usage-string-i18n later to maint).
  • "git for-each-ref" mishandled --format="%(upstream:track)" when a branch is marked to have forked from a non-existing branch. (merge b6160d9 rc/for-each-ref-tracking later to maint).

New in version 2.2.2 (January 13th, 2015)

  • "git checkout $treeish $path", when $path in the index and the working tree already matched what is in $treeish at the $path, still overwrote the $path unnecessarily.
  • "git config --get-color" did not parse its command line arguments carefully.
  • open() emulated on Windows platforms did not give EISDIR upon an attempt to open a directory for writing.
  • A few code paths used abs() when they should have used labs() on long integers.
  • "gitweb" used to depend on a behaviour recent CGI.pm deprecated.
  • "git init" (hence "git clone") initialized the per-repository configuration file .git/config with x-bit by mistake.
  • Git 2.0 was supposed to make the "simple" mode for the default of "git push", but it didn't.
  • "Everyday" document had a broken link.
  • The build procedure did not bother fixing perl and python scripts when NO_PERL and NO_PYTHON build-time configuration changed.
  • The code that reads the reflog from the newer to the older entries did not handle an entry that crosses a boundary of block it uses to read them correctly.
  • "git apply" was described in the documentation to take --ignore-date option, which it does not.
  • Traditionally we tried to avoid interpreting date strings given by the user as future dates, e.g. GIT_COMMITTER_DATE=2014-12-10 when used early November 2014 was taken as "October 12, 2014" because it is likely that a date in the future, December 10, is a mistake. This heuristics has been loosened to allow people to express future dates (most notably, --until= may want to be far in the future) and we no longer tiebreak by future-ness of the date when
  • (1) ISO-like format is used, and (2) the string can make sense interpreted as both y-m-d and y-d-m.
  • Git may still have to use the heuristics to tiebreak between dd/mm/yy and mm/dd/yy, though.
  • The code to abbreviate an object name to its short unique prefix has been optimized when no abbreviation was requested.
  • "git add --ignore-errors ..." did not ignore an error to give a file that did not exist.
  • Git did not correctly read an overlong refname from a packed refs file.

New in version 2.2.1 (December 18th, 2014)

  • Ports:
  • Building on older MacOS X systems automatically sets the necessary NO_APPLE_COMMON_CRYPTO build-time option.
  • Building with NO_PTHREADS has been resurrected.
  • Compilation options have been updated a bit to better support the z/OS port.
  • UI, Workflows & Features:
  • "git archive" learned to filter what gets archived with a pathspec.
  • "git config --edit --global" starts from a skeletal per-user configuration file contents, instead of a total blank, when the user does not already have any global config. This immediately reduces the need to later ask "Have you forgotten to set core.user?", and we can add more to the template as we gain more experience.
  • "git stash list -p" used to be almost always a no-op because each stash entry is represented as a merge commit. It learned to show the difference between the base commit version and the working tree version, which is in line with what "git stash show" gives.
  • Sometimes users want to report a bug they experience on their repository, but they are not at liberty to share the contents of the repository. "fast-export" was taught an "--anonymize" option to replace blob contents, names of people, paths and log messages with bland and simple strings to help them.
  • "git difftool" learned an option to stop feeding paths to the diff backend when it exits with a non-zero status.
  • "git grep" learned to paint (or not paint) partial matches on context lines when showing "grep -C" output in color.
  • "log --date=iso" uses a slight variant of the ISO 8601 format that is more human readable. A new "--date=iso-strict" option gives datetime output that conforms more strictly.
  • The logic "git prune" uses is more resilient against various corner cases.
  • A broken reimplementation of Git could write an invalid index that records both stage #0 and higher-stage entries for the same path. We now notice and reject such an index, as there is no sensible fallback (we do not know if the broken tool wanted to resolve and forgot to remove the higher-stage entries, or if it wanted to unresolve and forgot to remove the stage #0 entry).
  • The temporary files "git mergetool" uses are renamed to avoid too many dots in them (e.g. a temporary file for "hello.c" used to be named e.g. "hello.BASE.4321.c" but now uses underscore instead, e.g. "hello_BASE_4321.c", to allow us to have multiple variants).
  • The temporary files "git mergetool" uses can be placed in a newly created temporary directory, instead of the current directory, by setting the mergetool.writeToTemp configuration variable.
  • "git mergetool" understands "--tool bc" now, as version 4 of BeyondCompare can be driven the same way as its version 3 and it feels awkward to say "--tool bc3" to run version 4.
  • The "pre-receive" and "post-receive" hooks are no longer required to consume their input fully (not following this requirement used to result in intermittent errors in "git push").
  • The pretty-format specifier "%d", which expands to " (tagname)" for a tagged commit, gained a cousin "%D" that just gives the "tagname" without frills.
  • "git push" learned "--signed" push, that allows a push (i.e. request to update the refs on the other side to point at a new history, together with the transmission of necessary objects) to be signed, so that it can be verified and audited, using the GPG signature of the person who pushed, that the tips of branches at a public repository really point the commits the pusher wanted to, without having to "trust" the server.
  • "git interpret-trailers" is a new filter to programmatically edit the tail end of the commit log messages, e.g. "Signed-off-by:".
  • "git help everyday" shows the "Everyday Git in 20 commands or so" document, whose contents have been updated to match more modern Git practice.
  • On the "git svn" front, work progresses to reduce memory consumption and to improve handling of mergeinfo.
  • Performance, Internal Implementation, Development Support etc.:
  • The API to manipulate the "refs" has been restructured to make it more transactional, with the eventual goal to allow all-or-none atomic updates and migrating the storage to something other than the traditional filesystem based one (e.g. databases).
  • The lockfile API and its users have been cleaned up.
  • We no longer attempt to keep track of individual dependencies to the header files in the build procedure, relying instead on automated dependency generation support from modern compilers.
  • In tests, we have been using NOT_{MINGW,CYGWIN} test prerequisites long before negated prerequisites e.g. !MINGW were invented. The former has been converted to the latter to avoid confusion.
  • Optimized looking up a remote's configuration in a repository with very many remotes defined.
  • There are cases where you lock and open to write a file, close it to show the updated contents to an external processes, and then have to update the file again while still holding the lock; now the lockfile API has support for such an access pattern.
  • The API to allocate the structure to keep track of commit decoration has been updated to make it less cumbersome to use.
  • An in-core caching layer to let us avoid reading the same configuration files several times has been added. A few commands have been converted to use this subsystem.
  • Various code paths have been cleaned up and simplified by using the "strbuf", "starts_with()", and "skip_prefix()" APIs more.
  • A few codepaths that died when large blobs that would not fit in core are involved in their operation have been taught to punt instead, by e.g. marking a too-large blob as not to be diffed.
  • A few more code paths in "commit" and "checkout" have been taught to repopulate the cache-tree in the index, to help speed up later "write-tree" (used in "commit") and "diff-index --cached" (used in "status").
  • A common programming mistake to assign the same short option name to two separate options is detected by the parse_options() API to help developers.
  • The code path to write out the packed-refs file has been optimized, which especially matters in a repository with a large number of refs.
  • The check to see if a ref $F can be created by making sure no existing ref has $F/ as its prefix has been optimized, which especially matters in a repository with a large number of existing refs.
  • "git fsck" was taught to check the contents of tag objects a bit more.
  • "git hash-object" was taught a "--literally" option to help debugging.
  • When running a required clean filter, we do not have to mmap the original before feeding the filter. Instead, stream the file contents directly to the filter and process its output.
  • The scripts in the test suite can be run with the "-x" option to show a shell-trace of each command they run.
  • The "run-command" API learned to manage the argv and environment arrays for child process, alleviating the need for the callers to allocate and deallocate them.
  • Some people use AsciiDoctor, instead of AsciiDoc, to format our documentation set; the documentation has been adjusted to be usable by both, as AsciiDoctor is pickier than AsciiDoc about its input mark-up.
  • Also contains various documentation updates and code clean-ups.
  • Fixes since v2.1:
  • Unless otherwise noted, all the fixes since v2.1 in the maintenance
  • track are contained in this release (see the maintenance releases'
  • notes for details).
  • "git log --pretty/format=" with an empty format string did not mean the more obvious "No output whatsoever" but "Use default format", which was counterintuitive.
  • "git -c section.var command" and "git -c section.var= command" should pass the configuration value differently (the former should be a boolean true, the latter should be an empty string).
  • Applying a patch not generated by Git in a subdirectory used to check for whitespace breakage using the attributes of incorrect paths. Also whitespace checks were performed even for paths excluded via the "git apply --exclude=" mechanism.
  • "git bundle create" with a date-range specification was meant to exclude tags outside the range, but it didn't.
  • "git add x" where x used to be a directory and is now a symbolic link to a directory misbehaved.
  • The prompt script checked the $GIT_DIR/ref/stash file to see if there is a stash, which was a no-no.
  • Pack-protocol documentation had a minor typo.
  • "git checkout -m" did not switch to another branch while carrying the local changes forward when a path was deleted from the index.
  • "git daemon" (with NO_IPV6 build configuration) used to incorrectly use the hostname even when gethostbyname() reported that the given hostname is not found. (merge 107efbe rs/daemon-fixes later to maint).
  • With sufficiently long refnames, "git fast-import" could have overflowed an on-stack buffer.
  • After "pack-refs --prune" packed refs at the top-level, it failed to prune them.
  • Progress output from "git gc --auto" was visible in "git fetch -q".
  • We used to pass -1000 to poll(2), expecting it to also mean "no timeout", which should be spelled as -1.
  • "git rebase" documentation was unclear that it is required to specify on what the rebase is to be done when telling it to first check out . (merge 95c6826 so/rebase-doc later to maint).
  • "git push" over HTTP transport had an artificial limit on the number of refs that can be pushed, imposed by the command line length. (merge 26be19b jk/send-pack-many-refspecs later to maint).
  • When receiving an invalid pack stream that records the same object twice, multiple threads got confused due to a race. (merge ab791dd jk/index-pack-threading-races later to maint).
  • An attempt to remove the entire tree in the "git fast-import" input stream caused it to misbehave. (merge 2668d69 mb/fast-import-delete-root later to maint).
  • Reachability check (used in "git prune" and friends) did not add a detached HEAD as a starting point to traverse objects still in use. (merge c40fdd0 mk/reachable-protect-detached-head later to maint).
  • "git config --add section.var val" when section.var already has an empty-string value used to lose the empty-string value. (merge c1063be ta/config-add-to-empty-or-true-fix later to maint).
  • "git fsck" failed to report that it found corrupt objects via its exit status in some cases. (merge 30d1038 jk/fsck-exit-code-fix later to maint).
  • Use of the "--verbose" option used to break "git branch --merged". (merge 12994dd jk/maint-branch-verbose-merged later to maint).
  • Some MUAs mangle a line in a message that begins with "From " to ">From " when writing to a mailbox file, and feeding such an input to "git am" used to lose such a line. (merge 85de86a jk/mbox-from-line later to maint).
  • "rev-parse --verify --quiet $name" is meant to quietly exit with a non-zero status when $name is not a valid object name, but still gave error messages in some cases.
  • A handful of C source files have been updated to include "git-compat-util.h" as the first thing, to conform better to our coding guidelines. (merge 1c4b660 da/include-compat-util-first-in-c later to maint).
  • The t7004 test, which tried to run Git with small stack space, has been updated to use a bit larger stack to avoid false breakage on some platforms. (merge b9a1907 sk/tag-contains-wo-recursion later to maint).
  • A few documentation pages had example sections marked up not quite correctly, which passed AsciiDoc but failed with AsciiDoctor. (merge c30c43c bc/asciidoc-pretty-formats-fix later to maint). (merge f8a48af bc/asciidoc later to maint).
  • "gitweb" used deprecated CGI::startfrom, which was removed from CGI.pm as of 4.04; use CGI::start_from instead. (merge 4750f4b rm/gitweb-start-form later to maint).
  • Newer versions of 'meld' break the auto-detection we use to see if they are new enough to support the `--output` option. (merge b12d045 da/mergetool-meld later to maint).
  • "git pack-objects" forgot to disable the codepath to generate the object reachability bitmap when it needs to split the resulting pack. (merge 2113471 jk/pack-objects-no-bitmap-when-splitting later to maint).
  • The code to use cache-tree trusted the on-disk data too much and fell into an infinite loop upon seeing an incorrectly recorded index file. (merge 729dbbd jk/cache-tree-protect-from-broken-libgit2 later to maint).
  • "git fetch" into a repository where branch B was deleted earlier, back when it had reflog enabled, and then branch B/C is fetched into it without reflog enabled, which is arguably an unlikely corner case, unnecessarily failed. (merge aae828b jk/fetch-reflog-df-conflict later to maint).
  • "git log --first-parent -L..." used to crash. (merge a8787c5 tm/line-log-first-parent later to maint).

New in version 2.2.0 (November 27th, 2014)

  • Updates since v2.1:
  • Ports:
  • Building on older MacOS X systems automatically sets the necessary NO_APPLE_COMMON_CRYPTO build-time option.
  • Building with NO_PTHREADS has been resurrected.
  • Compilation options have been updated a bit to better support the z/OS port.
  • UI, Workflows & Features:
  • "git archive" learned to filter what gets archived with a pathspec.
  • "git config --edit --global" starts from a skeletal per-user configuration file contents, instead of a total blank, when the user does not already have any global config. This immediately reduces the need to later ask "Have you forgotten to set core.user?", and we can add more to the template as we gain more experience.
  • "git stash list -p" used to be almost always a no-op because each stash entry is represented as a merge commit. It learned to show the difference between the base commit version and the working tree version, which is in line with what "git stash show" gives.
  • Sometimes users want to report a bug they experience on their repository, but they are not at liberty to share the contents of the repository. "fast-export" was taught an "--anonymize" option to replace blob contents, names of people, paths and log messages with bland and simple strings to help them.
  • "git difftool" learned an option to stop feeding paths to the diff backend when it exits with a non-zero status.
  • "git grep" learned to paint (or not paint) partial matches on context lines when showing "grep -C" output in color.
  • "log --date=iso" uses a slight variant of the ISO 8601 format that is more human readable. A new "--date=iso-strict" option gives datetime output that conforms more strictly.
  • The logic "git prune" uses is more resilient against various corner cases.
  • A broken reimplementation of Git could write an invalid index that records both stage #0 and higher-stage entries for the same path. We now notice and reject such an index, as there is no sensible fallback (we do not know if the broken tool wanted to resolve and forgot to remove the higher-stage entries, or if it wanted to unresolve and forgot to remove the stage #0 entry).
  • The temporary files "git mergetool" uses are renamed to avoid too many dots in them (e.g. a temporary file for "hello.c" used to be named e.g. "hello.BASE.4321.c" but now uses underscore instead, e.g. "hello_BASE_4321.c", to allow us to have multiple variants).
  • The temporary files "git mergetool" uses can be placed in a newly created temporary directory, instead of the current directory, by setting the mergetool.writeToTemp configuration variable.
  • "git mergetool" understands "--tool bc" now, as version 4 of BeyondCompare can be driven the same way as its version 3 and it feels awkward to say "--tool bc3" to run version 4.
  • The "pre-receive" and "post-receive" hooks are no longer required to consume their input fully (not following this requirement used to result in intermittent errors in "git push").
  • The pretty-format specifier "%d", which expands to " (tagname)" for a tagged commit, gained a cousin "%D" that just gives the "tagname" without frills.
  • "git push" learned "--signed" push, that allows a push (i.e. request to update the refs on the other side to point at a new history, together with the transmission of necessary objects) to be signed, so that it can be verified and audited, using the GPG signature of the person who pushed, that the tips of branches at a public repository really point the commits the pusher wanted to, without having to "trust" the server.
  • "git interpret-trailers" is a new filter to programmatically edit the tail end of the commit log messages, e.g. "Signed-off-by:".
  • "git help everyday" shows the "Everyday Git in 20 commands or so" document, whose contents have been updated to match more modern Git practice.
  • On the "git svn" front, work progresses to reduce memory consumption and to improve handling of mergeinfo.
  • Performance, Internal Implementation, Development Support etc.:
  • The API to manipulate the "refs" has been restructured to make it more transactional, with the eventual goal to allow all-or-none atomic updates and migrating the storage to something other than the traditional filesystem based one (e.g. databases).
  • The lockfile API and its users have been cleaned up.
  • We no longer attempt to keep track of individual dependencies to the header files in the build procedure, relying instead on automated dependency generation support from modern compilers.
  • In tests, we have been using NOT_{MINGW,CYGWIN} test prerequisites long before negated prerequisites e.g. !MINGW were invented. The former has been converted to the latter to avoid confusion.
  • Optimized looking up a remote's configuration in a repository with very many remotes defined.
  • There are cases where you lock and open to write a file, close it to show the updated contents to an external processes, and then have to update the file again while still holding the lock; now the lockfile API has support for such an access pattern.
  • The API to allocate the structure to keep track of commit decoration has been updated to make it less cumbersome to use.
  • An in-core caching layer to let us avoid reading the same configuration files several times has been added. A few commands have been converted to use this subsystem.
  • Various code paths have been cleaned up and simplified by using the "strbuf", "starts_with()", and "skip_prefix()" APIs more.
  • A few codepaths that died when large blobs that would not fit in core are involved in their operation have been taught to punt instead, by e.g. marking a too-large blob as not to be diffed.
  • A few more code paths in "commit" and "checkout" have been taught to repopulate the cache-tree in the index, to help speed up later "write-tree" (used in "commit") and "diff-index --cached" (used in "status").
  • A common programming mistake to assign the same short option name to two separate options is detected by the parse_options() API to help developers.
  • The code path to write out the packed-refs file has been optimized, which especially matters in a repository with a large number of refs.
  • The check to see if a ref $F can be created by making sure no existing ref has $F/ as its prefix has been optimized, which especially matters in a repository with a large number of existing refs.
  • "git fsck" was taught to check the contents of tag objects a bit more.
  • "git hash-object" was taught a "--literally" option to help debugging.
  • When running a required clean filter, we do not have to mmap the original before feeding the filter. Instead, stream the file contents directly to the filter and process its output.
  • The scripts in the test suite can be run with the "-x" option to show a shell-trace of each command they run.
  • The "run-command" API learned to manage the argv and environment arrays for child process, alleviating the need for the callers to allocate and deallocate them.
  • Some people use AsciiDoctor, instead of AsciiDoc, to format our documentation set; the documentation has been adjusted to be usable by both, as AsciiDoctor is pickier than AsciiDoc about its input mark-up.
  • Also contains various documentation updates and code clean-ups.
  • Fixes since v2.1:
  • Unless otherwise noted, all the fixes since v2.1 in the maintenance track are contained in this release (see the maintenance releases' notes for details).
  • "git log --pretty/format=" with an empty format string did not mean the more obvious "No output whatsoever" but "Use default format", which was counterintuitive.
  • "git -c section.var command" and "git -c section.var= command" should pass the configuration value differently (the former should be a boolean true, the latter should be an empty string).
  • Applying a patch not generated by Git in a subdirectory used to check for whitespace breakage using the attributes of incorrect paths. Also whitespace checks were performed even for paths excluded via the "git apply --exclude=" mechanism.
  • "git bundle create" with a date-range specification was meant to exclude tags outside the range, but it didn't.
  • "git add x" where x used to be a directory and is now a symbolic link to a directory misbehaved.
  • The prompt script checked the $GIT_DIR/ref/stash file to see if there is a stash, which was a no-no.
  • Pack-protocol documentation had a minor typo.
  • "git checkout -m" did not switch to another branch while carrying the local changes forward when a path was deleted from the index.
  • "git daemon" (with NO_IPV6 build configuration) used to incorrectly use the hostname even when gethostbyname() reported that the given hostname is not found. (merge 107efbe rs/daemon-fixes later to maint).
  • With sufficiently long refnames, "git fast-import" could have overflowed an on-stack buffer.
  • After "pack-refs --prune" packed refs at the top-level, it failed to prune them.
  • Progress output from "git gc --auto" was visible in "git fetch -q".
  • We used to pass -1000 to poll(2), expecting it to also mean "no timeout", which should be spelled as -1.
  • "git rebase" documentation was unclear that it is required to specify on what the rebase is to be done when telling it to first check out . (merge 95c6826 so/rebase-doc later to maint).
  • "git push" over HTTP transport had an artificial limit on the number of refs that can be pushed, imposed by the command line length. (merge 26be19b jk/send-pack-many-refspecs later to maint).
  • When receiving an invalid pack stream that records the same object twice, multiple threads got confused due to a race. (merge ab791dd jk/index-pack-threading-races later to maint).
  • An attempt to remove the entire tree in the "git fast-import" input stream caused it to misbehave. (merge 2668d69 mb/fast-import-delete-root later to maint).
  • Reachability check (used in "git prune" and friends) did not add a detached HEAD as a starting point to traverse objects still in use. (merge c40fdd0 mk/reachable-protect-detached-head later to maint).
  • "git config --add section.var val" when section.var already has an empty-string value used to lose the empty-string value. (merge c1063be ta/config-add-to-empty-or-true-fix later to maint).
  • "git fsck" failed to report that it found corrupt objects via its exit status in some cases. (merge 30d1038 jk/fsck-exit-code-fix later to maint).
  • Use of the "--verbose" option used to break "git branch --merged". (merge 12994dd jk/maint-branch-verbose-merged later to maint).
  • Some MUAs mangle a line in a message that begins with "From " to ">From " when writing to a mailbox file, and feeding such an input to "git am" used to lose such a line. (merge 85de86a jk/mbox-from-line later to maint).
  • "rev-parse --verify --quiet $name" is meant to quietly exit with a non-zero status when $name is not a valid object name, but still gave error messages in some cases.
  • A handful of C source files have been updated to include "git-compat-util.h" as the first thing, to conform better to our coding guidelines. (merge 1c4b660 da/include-compat-util-first-in-c later to maint).
  • The t7004 test, which tried to run Git with small stack space, has been updated to use a bit larger stack to avoid false breakage on some platforms. (merge b9a1907 sk/tag-contains-wo-recursion later to maint).
  • A few documentation pages had example sections marked up not quite correctly, which passed AsciiDoc but failed with AsciiDoctor. (merge c30c43c bc/asciidoc-pretty-formats-fix later to maint). (merge f8a48af bc/asciidoc later to maint).
  • "gitweb" used deprecated CGI::startfrom, which was removed from CGI.pm as of 4.04; use CGI::start_from instead. (merge 4750f4b rm/gitweb-start-form later to maint).
  • Newer versions of 'meld' break the auto-detection we use to see if they are new enough to support the `--output` option. (merge b12d045 da/mergetool-meld later to maint).
  • "git pack-objects" forgot to disable the codepath to generate the object reachability bitmap when it needs to split the resulting pack. (merge 2113471 jk/pack-objects-no-bitmap-when-splitting later to maint).
  • The code to use cache-tree trusted the on-disk data too much and fell into an infinite loop upon seeing an incorrectly recorded index file. (merge 729dbbd jk/cache-tree-protect-from-broken-libgit2 later to maint).
  • "git fetch" into a repository where branch B was deleted earlier, back when it had reflog enabled, and then branch B/C is fetched into it without reflog enabled, which is arguably an unlikely corner case, unnecessarily failed. (merge aae828b jk/fetch-reflog-df-conflict later to maint).
  • "git log --first-parent -L..." used to crash. (merge a8787c5 tm/line-log-first-parent later to maint).

New in version 2.2.0 RC1 (November 8th, 2014)

  • Updates since v2.1:
  • Ports:
  • Building on older MacOS X systems automatically sets the necessary NO_APPLE_COMMON_CRYPTO build-time option.
  • The support to build with NO_PTHREADS has been resurrected.
  • Compilation options has been updated a bit to support z/OS port better.
  • UI, Workflows & Features:
  • "git archive" learned to filter what gets archived with pathspec.
  • "git config --edit --global" starts from a skeletal per-user configuration file contents, instead of a total blank, when the user does not already have any. This immediately reduces the need for a later "Have you forgotten setting core.user?" and we can add more to the template as we gain more experience.
  • "git stash list -p" used to be almost always a no-op because each stash entry is represented as a merge commit. It learned to show the difference between the base commit version and the working tree version, which is in line with what "git show" gives.
  • Sometimes users want to report a bug they experience on their repository, but they are not at liberty to share the contents of the repository. "fast-export" was taught an "--anonymize" option to replace blob contents, names of people and paths and log messages with bland and simple strings to help them.
  • "git difftool" learned an option to stop feeding paths to the diff backend when it exits with a non-zero status.
  • "git grep" allows to paint (or not paint) partial matches on context lines when showing "grep -C" output in color.
  • "log --date=iso" uses a slight variant of ISO 8601 format that is made more human readable. A new "--date=iso-strict" option gives datetime output that is more strictly conformant.
  • The logic "git prune" uses is more resilient against various corner cases.
  • A broken reimplementation of Git could write an invalid index that records both stage #0 and higher stage entries for the same path. We now notice and reject such an index, as there is no sensible fallback (we do not know if the broken tool wanted to resolve and forgot to remove higher stage entries, or if it wanted to unresolve and forgot to remove the stage#0 entry).
  • The temporary files "git mergetool" uses are named to avoid too many dots in them (e.g. a temporary file for "hello.c" used to be named e.g. "hello.BASE.4321.c" but now uses underscore instead, e.g. "hello_BASE_4321.c").
  • The temporary files "git mergetools" uses can be placed in a newly created temporary directory, instead of the current directory, by setting the mergetool.writeToTemp configuration variable.
  • "git mergetool" understands "--tool bc" now, as version 4 of BeyondCompare can be driven the same way as its version 3 and it feels awkward to say "--tool bc3".
  • The "pre-receive" and "post-receive" hooks are no longer required to consume their input fully (not following this requirement used to result in intermittent errors in "git push").
  • The pretty-format specifier "%d", which expanded to " (tagname)" for a tagged commit, gained a cousin "%D" that just gives the "tagname" without frills.
  • "git push" learned "--signed" push, that allows a push (i.e. request to update the refs on the other side to point at a new history, together with the transmission of necessary objects) to be signed, so that it can be verified and audited, using the GPG signature of the person who pushed, that the tips of branches at a public repository really point the commits the pusher wanted to, without having to "trust" the server.
  • "git interpret-trailers" is a new filter to programmatically edit the tail end of the commit log messages.
  • "git help everyday" shows the "Everyday Git in 20 commands or so" document, whose contents have been updated to more modern Git practice.
  • On the "git svn" front, work to reduce memory consumption and to improve handling of mergeinfo progresses.
  • Performance, Internal Implementation, etc.:
  • The API to manipulate the "refs" has been restructured to make it more transactional, with the eventual goal to allow all-or-none atomic updates and migrating the storage to something other than the traditional filesystem based one (e.g. databases).
  • The lockfile API and its users have been cleaned up.
  • We no longer attempt to keep track of individual dependencies to the header files in the build procedure, relying on automated dependency generation support from modern compilers.
  • In tests, we have been using NOT_{MINGW,CYGWIN} test prerequisites long before negated prerequisites e.g. !MINGW were invented. The former has been converted to the latter to avoid confusion.
  • Looking up remotes configuration in a repository with very many remotes defined has been optimized.
  • There are cases where you lock and open to write a file, close it to show the updated contents to external processes, and then have to update the file again while still holding the lock, but the lockfile API lacked support for such an access pattern.
  • The API to allocate the structure to keep track of commit decoration has been updated to make it less cumbersome to use.
  • An in-core caching layer to let us avoid reading the same configuration files number of times has been added. A few commands have been converted to use this subsystem.
  • Various code paths have been cleaned up and simplified by using "strbuf", "starts_with()", and "skip_prefix()" APIs more.
  • A few codepaths that died when large blobs that would not fit in core are involved in their operation have been taught to punt instead, by e.g. marking too large a blob as not to be diffed.
  • A few more code paths in "commit" and "checkout" have been taught to repopulate the cache-tree in the index, to help speed up later "write-tree" (used in "commit") and "diff-index --cached" (used in "status").
  • A common programming mistake to assign the same short option name to two separate options is detected by parse_options() API to help developers.
  • The code path to write out the packed-refs file has been optimized, which especially matters in a repository with a large number of refs.
  • The check to see if a ref $F can be created by making sure no existing ref has $F/ as its prefix has been optimized, which especially matters in a repository with a large number of existing refs.
  • "git fsck" was taught to check contents of tag objects a bit more.
  • "git hash-object" was taught a "--literally" option to help debugging.
  • When running a required clean filter, we do not have to mmap the original before feeding the filter. Instead, stream the file contents directly to the filter and process its output.
  • The scripts in the test suite can be run with "-x" option to show a shell-trace of each command run in them.
  • The "run-command" API learned to manage the argv and environment array for child process, alleviating the need for the callers to allocate and deallocate them.
  • Some people use AsciiDoctor, instead of AsciiDoc, to format our documentation set; the documentation has been adjusted, as AsciiDoctor is pickier than AsciiDoc in its input mark-up.
  • Also contains various documentation updates and code clean-ups.
  • Fixes since v2.1:
  • Unless otherwise noted, all the fixes since v2.1 in the maintenance track are contained in this release (see the maintenance releases' notes for details).
  • "git log --pretty/format=" with an empty format string did not mean the more obvious "No output whatsoever" but "Use default format", which was counterintuitive.
  • "git -c section.var command" and "git -c section.var= command" should pass the configuration differently (the former should be a boolean true, the latter should be an empty string).
  • Applying a patch not generated by Git in a subdirectory used to check the whitespace breakage using the attributes for incorrect paths. Also whitespace checks were performed even for paths excluded via "git apply --exclude=" mechanism.
  • "git bundle create" with date-range specification were meant to exclude tags outside the range, but it didn't.
  • "git add x" where x that used to be a directory has become a symbolic link to a directory misbehaved.
  • The prompt script checked $GIT_DIR/ref/stash file to see if there is a stash, which was a no-no.
  • Pack-protocol documentation had a minor typo.
  • "git checkout -m" did not switch to another branch while carrying the local changes forward when a path was deleted from the index.
  • "git daemon" (with NO_IPV6 build configuration) used to incorrectly use the hostname even when gethostbyname() reported that the given hostname is not found. (merge 107efbe rs/daemon-fixes later to maint).
  • With sufficiently long refnames, "git fast-import" could have overflown an on-stack buffer.
  • After "pack-refs --prune" packed refs at the top-level, it failed to prune them.
  • Progress output from "git gc --auto" was visible in "git fetch -q".
  • We used to pass -1000 to poll(2), expecting it to also mean "no timeout", which should be spelled as -1.
  • "git rebase" documentation was unclear that it is required to specify on what the rebase is to be done when telling it to first check out . (merge 95c6826 so/rebase-doc later to maint).
  • "git push" over HTTP transport had an artificial limit on number of refs that can be pushed imposed by the command line length. (merge 26be19b jk/send-pack-many-refspecs later to maint).
  • When receiving an invalid pack stream that records the same object twice, multiple threads got confused due to a race. (merge ab791dd jk/index-pack-threading-races later to maint).
  • An attempt to remove the entire tree in the "git fast-import" input stream caused it to misbehave. (merge 2668d69 mb/fast-import-delete-root later to maint).
  • Reachability check (used in "git prune" and friends) did not add a detached HEAD as a starting point to traverse objects still in use. (merge c40fdd0 mk/reachable-protect-detached-head later to maint).
  • "git config --add section.var val" used to lose existing section.var whose value was an empty string. (merge c1063be ta/config-add-to-empty-or-true-fix later to maint).
  • "git fsck" failed to report that it found corrupt objects via its exit status in some cases. (merge 30d1038 jk/fsck-exit-code-fix later to maint).
  • Use of "--verbose" option used to break "git branch --merged". (merge 12994dd jk/maint-branch-verbose-merged later to maint).
  • Some MUAs mangled a line in a message that begins with "From " to ">From " when writing to a mailbox file and feeding such an input to "git am" used to lose such a line. (merge 85de86a jk/mbox-from-line later to maint).
  • "rev-parse --verify --quiet $name" is meant to quietly exit with a non-zero status when $name is not a valid object name, but still gave error messages in some cases.
  • A handful of C source files have been updated to include "git-compat-util.h" as the first thing, to conform better to our coding guidelines. (merge 1c4b660 da/include-compat-util-first-in-c later to maint).
  • t7004 test, which tried to run Git with small stack space, has been updated to give a bit larger stack to avoid false breakage on some platforms. (merge b9a1907 sk/tag-contains-wo-recursion later to maint).
  • A few documentation pages had example sections marked up not quite correctly, which passed AsciiDoc but failed with AsciiDoctor. (merge c30c43c bc/asciidoc-pretty-formats-fix later to maint). (merge f8a48af bc/asciidoc later to maint).
  • "gitweb" used deprecated CGI::startfrom, which was removed from CGI.pm as of 4.04; use CGI::start_from instead. (merge 4750f4b rm/gitweb-start-form later to maint).
  • Newer versions of 'meld' breaks the auto-detection we use to see if they are new enough to support the `--output` option. (merge b12d045 da/mergetool-meld later to maint).
  • "git pack-objects" forgot to disable the codepath to generate object reachability bitmap when it needs to split the resulting pack. (merge 2113471 jk/pack-objects-no-bitmap-when-splitting later to maint).

New in version 2.1.3 (October 30th, 2014)

  • Some MUAs mangled a line in a message that begins with "From " to ">From " when writing to a mailbox file and feeding such an input to "git am" used to lose such a line.
  • "git daemon" (with NO_IPV6 build configuration) used to incorrectly use the hostname even when gethostbyname() reported that the given hostname is not found.
  • Newer versions of 'meld' breaks the auto-detection we use to see if they are new enough to support the `--output` option.
  • "git pack-objects" forgot to disable the codepath to generate object recheability bitmap when it needs to split the resulting pack.
  • "gitweb" used deprecated CGI::startfrom, which was removed from CGI.pm as of 4.04; use CGI::start_from instead.
  • "git log" documentation had an example section marked up not quite correctly, which passed AsciiDoc but failed with AsciiDoctor.
  • Also contains some documentation updates.

New in version 2.1.2 (October 1st, 2014)

  • "git push" over HTTP transport had an artificial limit on number of refs that can be pushed imposed by the command line length.
  • When receiving an invalid pack stream that records the same object twice, multiple threads got confused due to a race.
  • An attempt to remove the entire tree in the "git fast-import" input stream caused it to misbehave.
  • Reachability check (used in "git prune" and friends) did not add a detached HEAD as a starting point to traverse objects still in use.
  • "git config --add section.var val" used to lose existing section.var whose value was an empty string.
  • "git fsck" failed to report that it found corrupt objects via its exit status in some cases.

New in version 2.1.1 (September 20th, 2014)

  • Git 2.0 had a regression where "git fetch" into a shallowly cloned repository from a repository with bitmap object index enabled did not work correctly. This has been corrected.
  • Git 2.0 had a regression which broke (rarely used) "git diff-tree -t". This has been corrected.
  • "git log --pretty/format=" with an empty format string did not mean the more obvious "No output whatsoever" but "Use default format", which was counterintuitive. Now it means "nothing shown for the log message part".
  • "git -c section.var command" and "git -c section.var= command" should pass the configuration differently (the former should be a boolean true, the latter should be an empty string), but they didn't work that way. Now it does.
  • Applying a patch not generated by Git in a subdirectory used to check the whitespace breakage using the attributes for incorrect paths. Also whitespace checks were performed even for paths excluded via "git apply --exclude=" mechanism.
  • "git bundle create" with date-range specification were meant to exclude tags outside the range, but it did not work correctly.
  • "git add x" where x that used to be a directory has become a symbolic link to a directory misbehaved.
  • The prompt script checked $GIT_DIR/ref/stash file to see if there is a stash, which was a no-no.
  • "git checkout -m" did not switch to another branch while carrying the local changes forward when a path was deleted from the index.
  • With sufficiently long refnames, fast-import could have overflown an on-stack buffer. * After "pack-refs --prune" packed refs at the top-level, it failed to prune them.
  • "git gc --auto" triggered from "git fetch --quiet" was not quiet.

New in version 2.1.0 (August 16th, 2014)

  • 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=" 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= 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= 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:
  • 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 "%

New in version 2.0.4 (August 1st, 2014)

  • An earlier update to v2.0.2 broken output from "git diff-tree", which is fixed in this release.

New in version 2.0.2 (July 17th, 2014)

  • Documentation for "git submodule sync" forgot to say that the subcommand can take the "--recursive" option.
  • Mishandling of patterns in .gitignore that has trailing SPs quoted with backslashes (e.g. ones that end with "\ ") have been corrected.
  • Recent updates to "git repack" started to duplicate objects that are in packfiles marked with .keep flag into the new packfile by mistake.
  • "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().
  • "%G" (nothing after G) is an invalid pretty format specifier, but the parser did not notice it as garbage.
  • Code to avoid adding the same alternate object store twice was subtly broken for a long time, but nobody seems to have noticed.
  • 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.
  • During "git rebase --merge", a conflicted patch could not be skipped with "--skip" if the next one also conflicted.

New in version 2.0.1 (June 26th, 2014)

  • 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.
  • 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.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.
  • "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.
  • The "%

New in version 2.0.0 (May 29th, 2014)

  • Backward compatibility notes:
  • When "git push [$there]" does not say what to push, we have used the traditional "matching" semantics so far (all your branches were sent to the remote as long as there already are branches of the same name over there). In Git 2.0, the default is now the "simple" semantics, which pushes: - only the current branch to the branch with the same name, and only when the current branch is set to integrate with that remote branch, if you are pushing to the same remote as you fetch from; or - only the current branch to the branch with the same name, if you are pushing to a remote that is not where you usually fetch from. You can use the configuration variable "push.default" to change this. If you are an old-timer who wants to keep using the "matching" semantics, you can set the variable to "matching", for example. Read the documentation for other possibilities. When "git add -u" and "git add -A" are run inside a subdirectory without specifying which paths to add on the command line, they operate on the entire tree for consistency with "git commit -a" and other commands (these commands used to operate only on the current subdirectory). Say "git add -u ." or "git add -A ." if you want to limit the operation to the current directory. "git add " is the same as "git add -A " now, so that "git add dir/" will notice paths you removed from the directory and record the removal. In older versions of Git, "git add " used to ignore removals. You can say "git add --ignore-removal " to add only added or modified paths in , if you really want to. The "-q" option to "git diff-files", which does *NOT* mean "quiet", has been removed (it told Git to ignore deletion, which you can do with "git diff-files --diff-filter=d"). "git request-pull" lost a few "heuristics" that often led to mistakes. The default prefix for "git svn" has changed in Git 2.0. For a long time, "git svn" created its remote-tracking branches directly under refs/remotes, but it now places them under refs/remotes/origin/ unless it is told otherwise with its "--prefix" option.
  • Updates since v1.9 series:
  • UI, Workflows & Features
  • The "multi-mail" post-receive hook (in contrib/) has been updated to a more recent version from upstream.
  • The "remote-hg/bzr" remote-helper interfaces (used to be in contrib/) are no more. They are now maintained separately as third-party plug-ins in their own repositories.
  • "git gc --aggressive" learned "--depth" option and "gc.aggressiveDepth" configuration variable to allow use of a less insane depth than the built-in default value of 250.
  • "git log" learned the "--show-linear-break" option to show where a single strand-of-pearls is broken in its output.
  • The "rev-parse --parseopt" mechanism used by scripted Porcelains to parse command-line options and to give help text learned to take the argv-help (the placeholder string for an option parameter, e.g. "key-id" in "--gpg-sign=").
  • The pattern to find where the function begins in C/C++ used in "diff" and "grep -p" has been updated to improve viewing C++ sources.
  • "git rebase" learned to interpret a lone "-" as "@{-1}", the branch that we were previously on.
  • "git commit --cleanup=" learned a new mode, scissors.
  • "git tag --list" output can be sorted using "version sort" with "--sort=version:refname".
  • Discard the accumulated "heuristics" to guess from which branch the result wants to be pulled from and make sure that what the end user specified is not second-guessed by "git request-pull", to avoid mistakes. When you pushed out your 'master' branch to your public repository as 'for-linus', use the new "master:for-linus" syntax to denote the branch to be pulled.
  • "git grep" learned to behave in a way similar to native grep when "-h" (no header) and "-c" (count) options are given.
  • "git push" via transport-helper interface has been updated to allow forced ref updates in a way similar to the natively supported transports.
  • The "simple" mode is the default for "git push".
  • "git add -u" and "git add -A", when run without any pathspec, is a tree-wide operation even when run inside a subdirectory of a working tree.
  • "git add " is the same as "git add -A " now.
  • "core.statinfo" configuration variable, which is a never-advertised synonym to "core.checkstat", has been removed.
  • The "-q" option to "git diff-files", which does *NOT* mean "quiet", has been removed (it told Git to ignore deletion, which you can do with "git diff-files --diff-filter=d").
  • Server operators can loosen the "tips of refs only" restriction for the remote archive service with the uploadarchive.allowUnreachable configuration option.
  • The progress indicators from various time-consuming commands have been marked for i18n/l10n.
  • "git notes -C " diagnoses as an error an attempt to use an object that is not a blob.
  • "git config" learned to read from the standard input when "-" is given as the value to its "--file" parameter (attempting an operation to update the configuration in the standard input is rejected, of course).
  • Trailing whitespaces in .gitignore files, unless they are quoted for fnmatch(3), e.g. "path\ ", are warned and ignored. Strictly speaking, this is a backward-incompatible change, but very unlikely to bite any sane user and adjusting should be obvious and easy.
  • Many commands that create commits, e.g. "pull" and "rebase", learned to take the "--gpg-sign" option on the command line.
  • "git commit" can be told to always GPG sign the resulting commit by setting the "commit.gpgsign" configuration variable to "true" (the command-line option "--no-gpg-sign" should override it).
  • "git pull" can be told to only accept fast-forward by setting the new "pull.ff" configuration variable.
  • "git reset" learned the "-N" option, which does not reset the index fully for paths the index knows about but the tree-ish the command resets to does not (these paths are kept as intend-to-add entries). Performance, Internal Implementation, etc.
  • The compilation options to port to AIX and to MSVC have been updated.
  • We started using wildmatch() in place of fnmatch(3) a few releases ago; complete the process and stop using fnmatch(3).
  • Uses of curl's "multi" interface and "easy" interface do not mix well when we attempt to reuse outgoing connections. Teach the RPC over HTTP code, used in the smart HTTP transport, not to use the "easy" interface.
  • The bitmap-index feature from JGit has been ported, which should significantly improve performance when serving objects from a repository that uses it.
  • The way "git log --cc" shows a combined diff against multiple parents has been optimized.
  • The prefixcmp() and suffixcmp() functions are gone. Use starts_with() and ends_with(), and also consider if skip_prefix() suits your needs better when using the former. Also contains various documentation updates and code clean-ups. Many of them came from flurry of activities as GSoC candidate microproject exercises.
  • Fixes since v1.9 series:
  • Unless otherwise noted, all the fixes since v1.9 in the maintenance track are contained in this release (see the maintenance releases' notes for details).
  • "git p4" was broken in 1.9 release to deal with changes in binary files. (merge 749b668 cl/p4-use-diff-tree later to maint).
  • The shell prompt script (in contrib/), when using the PROMPT_COMMAND interface, used an unsafe construct when showing the branch name in $PS1. (merge 1e4119c8 rh/prompt-pcmode-avoid-eval-on-refname later to maint).
  • "git rebase" used a POSIX shell construct FreeBSD's /bin/sh does not work well with. (merge 8cd6596 km/avoid-non-function-return-in-rebase later to maint).
  • zsh prompt (in contrib/) leaked unnecessary error messages.
  • Bash completion (in contrib/) did not complete the refs and remotes correctly given "git pu" when "pu" is aliased to "push".
  • Some more Unicode code points, defined in Unicode 6.3 as having zero width, have been taught to our display column counting logic. (merge d813ab9 tb/unicode-6.3-zero-width later to maint).
  • Some tests used shell constructs that did not work well on FreeBSD (merge ff7a1c6 km/avoid-bs-in-shell-glob later to maint). (merge 00764ca km/avoid-cp-a later to maint).
  • "git update-ref --stdin" did not fail a request to create a ref when the ref already existed. (merge b9d56b5 mh/update-ref-batch-create-fix later to maint).
  • "git diff --no-index -Mq a b" fell into an infinite loop. (merge ad1c3fb jc/fix-diff-no-index-diff-opt-parse later to maint).
  • "git fetch --prune", when the right-hand side of multiple fetch refspecs overlap (e.g. storing "refs/heads/*" to "refs/remotes/origin/*", while storing "refs/frotz/*" to "refs/remotes/origin/fr/*"), aggressively thought that lack of "refs/heads/fr/otz" on the origin site meant we should remove "refs/remotes/origin/fr/otz" from us, without checking their "refs/frotz/otz" first. Note that such a configuration is inherently unsafe (think what should happen when "refs/heads/fr/otz" does appear on the origin site), but that is not a reason not to be extra careful. (merge e6f6371 cn/fetch-prune-overlapping-destination later to maint).
  • "git status --porcelain --branch" showed its output with labels "ahead/behind/gone" translated to the user's locale. (merge 7a76c28 mm/status-porcelain-format-i18n-fix later to maint).
  • A stray environment variable $prefix could have leaked into and affected the behaviour of the "subtree" script (in contrib/).
  • When it is not necessary to edit a commit log message (e.g. "git commit -m" is given a message without specifying "-e"), we used to disable the spawning of the editor by overriding GIT_EDITOR, but this means all the uses of the editor, other than to edit the commit log message, are also affected. (merge b549be0 bp/commit-p-editor later to maint).
  • "git mv" that moves a submodule forgot to adjust the array that uses to keep track of which submodules were to be moved to update its configuration. (merge fb8a4e8 jk/mv-submodules-fix later to maint).
  • Length limit for the pathname used when removing a path in a deep subdirectory has been removed to avoid buffer overflows. (merge 2f29e0c mh/remove-subtree-long-pathname-fix later to maint).
  • The test helper lib-terminal always run an actual test_expect_* when included, which screwed up with the use of skil-all that may have to be done later. (merge 7e27173 jk/lib-terminal-lazy later to maint).
  • "git index-pack" used a wrong variable to name the keep-file in an error message when the file cannot be written or closed. (merge de983a0 nd/index-pack-error-message later to maint).
  • "rebase -i" produced a broken insn sheet when the title of a commit happened to contain '\n' (or ended with '\c') due to a careless use of 'echo'. (merge cb1aefd us/printf-not-echo later to maint).
  • There were a few instances of 'git-foo' remaining in the documentation that should have been spelled 'git foo'. (merge 3c3e6f5 rr/doc-merge-strategies later to maint).
  • Serving objects from a shallow repository needs to write a new file to hold the temporary shallow boundaries, but it was not cleaned when we exit due to die() or a signal. (merge 7839632 jk/shallow-update-fix later to maint).
  • When "git stash pop" stops after failing to apply the stash (e.g. due to conflicting changes), the stash is not dropped. State that explicitly in the output to let the users know. (merge 2d4c993 jc/stash-pop-not-popped later to maint).
  • The labels in "git status" output that describe the nature of conflicts (e.g. "both deleted") were limited to 20 bytes, which was too short for some l10n (e.g. fr). (merge c7cb333 jn/wt-status later to maint).
  • "git clean -d pathspec" did not use the given pathspec correctly and ended up cleaning too much. (merge 1f2e108 jk/clean-d-pathspec later to maint).
  • "git difftool" misbehaved when the repository is bound to the working tree with the ".git file" mechanism, where a textual file ".git" tells us where it is. (merge fcfec8b da/difftool-git-files later to maint).
  • "git push" did not pay attention to "branch.*.pushremote" if it is defined earlier than "remote.pushdefault"; the order of these two variables in the configuration file should not matter, but it did by mistake. (merge 98b406f jk/remote-pushremote-config-reading later to maint).
  • Code paths that parse timestamps in commit objects have been tightened. (merge f80d1f9 jk/commit-dates-parsing-fix later to maint).
  • "git diff --external-diff" incorrectly fed the submodule directory in the working tree to the external diff driver when it knew that it is the same as one of the versions being compared. (merge aba4727 tr/diff-submodule-no-reuse-worktree later to maint).
  • "git reset" needs to refresh the index when working in a working tree (it can also be used to match the index to the HEAD in an otherwise bare repository), but it failed to set up the working tree properly, causing GIT_WORK_TREE to be ignored. (merge b7756d4 nd/reset-setup-worktree later to maint).
  • "git check-attr" when working on a repository with a working tree did not work well when the working tree was specified via the "--work-tree" (and obviously with "--git-dir") option. (merge cdbf623 jc/check-attr-honor-working-tree later to maint).
  • "merge-recursive" was broken in 1.7.7 era and stopped working in an empty (temporary) working tree, when there are renames involved. This has been corrected. (merge 6e2068a bk/refresh-missing-ok-in-merge-recursive later to maint.)
  • "git rev-parse" was loose in rejecting command-line arguments that do not make sense, e.g. "--default" without the required value for that option. (merge a43219f ds/rev-parse-required-args later to maint.)
  • "include.path" variable (or any variable that expects a path that can use ~username expansion) in the configuration file is not a boolean, but the code failed to check it. (merge 67beb60 jk/config-path-include-fix later to maint.)
  • Commands that take pathspecs on the command line misbehaved when the pathspec is given as an absolute pathname (which is a practice not particularly encouraged) that points at a symbolic link in the working tree. (merge 6127ff6 mw/symlinks later to maint.)
  • "git diff --quiet -- pathspec1 pathspec2" sometimes did not return the correct status value. (merge f34b205 nd/diff-quiet-stat-dirty later to maint.)
  • Attempting to deepen a shallow repository by fetching over smart HTTP transport failed in the protocol exchange, when the no-done extension was used. The fetching side waited for the list of shallow boundary commits after the sending side stopped talking to it. (merge 0232852 nd/http-fetch-shallow-fix later to maint.)
  • Allow "git cmd path/", when the 'path' is where a submodule is bound to the top-level working tree, to match 'path', despite the extra and unnecessary trailing slash (such a slash is often given by command-line completion). (merge 2e70c01 nd/submodule-pathspec-ending-with-slash later to maint.)
  • Documentation and in-code comments had many instances of mistaken use of "nor", which have been corrected. (merge 235e8d5 jl/nor-or-nand-and later to maint).

New in version 1.9.3 (May 10th, 2014)

  • "git p4" dealing with changes in binary files were broken by a change in 1.9 release.
  • The shell prompt script (in contrib/), when using the PROMPT_COMMAND interface, used an unsafe construct when showing the branch name in $PS1.
  • "git rebase" used a POSIX shell construct FreeBSD /bin/sh does not work well with.
  • Some more Unicode codepoints defined in Unicode 6.3 as having zero width have been taught to our display column counting logic.
  • Some tests used shell constructs that did not work well on FreeBSD.

New in version 1.9.2 (April 10th, 2014)

  • Documentation and in-code comments had many instances of mistaken use of "nor", which have been corrected.
  • "git fetch --prune", when the right-hand-side of multiple fetch refspecs overlap (e.g. storing "refs/heads/*" to "refs/remotes/origin/*", while storing "refs/frotz/*" to "refs/remotes/origin/fr/*"), aggressively thought that lack of "refs/heads/fr/otz" on the origin site meant we should remove "refs/remotes/origin/fr/otz" from us, without checking their "refs/frotz/otz" first.
  • Note that such a configuration is inherently unsafe (think what should happen when "refs/heads/fr/otz" does appear on the origin site), but that is not a reason not to be extra careful.
  • "it update-ref --stdin" did not fail a request to create a ref when the ref already existed.
  • "git diff --no-index -Mq a b" fell into an infinite loop.
  • When it is not necessary to edit a commit log message (e.g. "git commit -m" is given a message without specifying "-e"), we used to disable the spawning of the editor by overriding GIT_EDITOR, but this means all the uses of the editor, other than to edit the commit log message, are also affected.
  • "git status --porcelain --branch" showed its output with labels "ahead/behind/gone" translated to the user's locale.
  • "git mv" that moves a submodule forgot to adjust the array that uses to keep track of which submodules were to be moved to update its configuration.
  • Length limit for the pathname used when removing a path in a deep subdirectory has been removed to avoid buffer overflows.
  • The test helper lib-terminal always run an actual test_expect_* when included, which screwed up with the use of skil-all that may have to be done later.
  • "git index-pack" used a wrong variable to name the keep-file in an error message when the file cannot be written or closed.
  • "rebase -i" produced a broken insn sheet when the title of a commit happened to contain '\n' (or ended with '\c') due to a careless use of 'echo'.
  • There were a few instances of 'git-foo' remaining in the documentation that should have been spelled 'git foo'.
  • Serving objects from a shallow repository needs to write a new file to hold the temporary shallow boundaries but it was not cleaned when we exit due to die() or a signal.
  • When "git stash pop" stops after failing to apply the stash (e.g. due to conflicting changes), the stash is not dropped. State that explicitly in the output to let the users know.
  • The labels in "git status" output that describe the nature of conflicts (e.g. "both deleted") were limited to 20 bytes, which was too short for some l10n (e.g. fr).

New in version 1.9.1 (March 19th, 2014)

  • "git clean -d pathspec" did not use the given pathspec correctly and ended up cleaning too much.
  • "git difftool" misbehaved when the repository is bound to the working tree with the ".git file" mechanism, where a textual file ".git" tells us where it is.
  • "git push" did not pay attention to branch.*.pushremote if it is defined earlier than remote.pushdefault; the order of these two variables in the configuration file should not matter, but it did by mistake.
  • Codepaths that parse timestamps in commit objects have been tightened.
  • "git diff --external-diff" incorrectly fed the submodule directory in the working tree to the external diff driver when it knew it is the same as one of the versions being compared.
  • "git reset" needs to refresh the index when working in a working tree (it can also be used to match the index to the HEAD in an otherwise bare repository), but it failed to set up the working tree properly, causing GIT_WORK_TREE to be ignored.
  • "git check-attr" when working on a repository with a working tree did not work well when the working tree was specified via the --work-tree (and obviously with --git-dir) option.
  • "merge-recursive" was broken in 1.7.7 era and stopped working in an empty (temporary) working tree, when there are renames involved. This has been corrected.
  • "git rev-parse" was loose in rejecting command line arguments that do not make sense, e.g. "--default" without the required value for that option.
  • include.path variable (or any variable that expects a path that can use ~username expansion) in the configuration file is not a boolean, but the code failed to check it.
  • "git diff --quiet -- pathspec1 pathspec2" sometimes did not return correct status value.
  • Attempting to deepen a shallow repository by fetching over smart HTTP transport failed in the protocol exchange, when no-done extension was used. The fetching side waited for the list of shallow boundary commits after the sending end stopped talking to it.
  • Allow "git cmd path/", when the 'path' is where a submodule is bound to the top-level working tree, to match 'path', despite the extra and unnecessary trailing slash (such a slash is often given by command line completion).

New in version 1.9.0 (February 15th, 2014)

  • Foreign interfaces, subsystems and ports:
  • The HTTP transport, when talking GSS-Negotiate, uses "100 Continue" response to avoid having to rewind and resend a large payload, which may not be always doable.
  • Various bugfixes to remote-bzr and remote-hg (in contrib/).
  • The build procedure is aware of MirBSD now.
  • Various "git p4", "git svn" and "gitk" updates.
  • UI, Workflows & Features:
  • Fetching from a shallowly-cloned repository used to be forbidden, primarily because the codepaths involved were not carefully vetted and we did not bother supporting such usage. This release attempts to allow object transfer out of a shallowly-cloned repository in a more controlled way (i.e. the receiver becomes a shallow repository with a truncated history).
  • Just like we give a reasonable default for "less" via the LESS environment variable, we now specify a reasonable default for "lv" via the "LV" environment variable when spawning the pager.
  • Two-level configuration variable names in "branch.*" and "remote.*" hierarchies, whose variables are predominantly three-level, were not completed by hitting a in bash and zsh completions.
  • Fetching a 'frotz' branch with "git fetch", while a 'frotz/nitfol' remote-tracking branch from an earlier fetch was still there, would error out, primarily because the command was not told that it is allowed to lose any information on our side. "git fetch --prune" now can be used to remove 'frotz/nitfol' to make room for fetching and storing the 'frotz' remote-tracking branch.
  • "diff.orderfile=" configuration variable can be used to pretend as if the "-O" option were given from the command line of "git diff", etc.
  • The negative pathspec syntax allows "git log -- . ':!dir'" to tell us "I am interested in everything but 'dir' directory".
  • "git difftool" shows how many different paths there are in total, and how many of them have been shown so far, to indicate progress.
  • "git push origin master" used to push our 'master' branch to update the 'master' branch at the 'origin' repository. This has been enhanced to use the same ref mapping "git push origin" would use to determine what ref at the 'origin' to be updated with our 'master'. For example, with this configuration [remote "origin"] push = refs/heads/*:refs/review/* that would cause "git push origin" to push out our local branches to corresponding refs under refs/review/ hierarchy at 'origin', "git push origin master" would update 'refs/review/master' over there. Alternatively, if push.default is set to 'upstream' and our 'master' is set to integrate with 'topic' from the 'origin' branch, running "git push origin" while on our 'master' would update their 'topic' branch, and running "git push origin master" while on any of our branches does the same.
  • "gitweb" learned to treat ref hierarchies other than refs/heads as if they are additional branch namespaces (e.g. refs/changes/ in Gerrit).
  • "git for-each-ref --format=..." learned a few formatting directives; e.g. "%(color:red)%(HEAD)%(color:reset) %(refname:short) %(subject)".
  • The command string given to "git submodule foreach" is passed directly to the shell, without being eval'ed. This is a backward incompatible change that may break existing users.
  • "git log" and friends learned the "--exclude=" option, to allow people to say "list history of all branches except those that match this pattern" with "git log --exclude='*/*' --branches".
  • "git rev-parse --parseopt" learned a new "--stuck-long" option to help scripts parse options with an optional parameter.
  • The "--tags" option to "git fetch" no longer tells the command to fetch _only_ the tags. It instead fetches tags _in addition to_ what are fetched by the same command line without the option.
  • Performance, Internal Implementation, etc.:
  • When parsing a 40-hex string into the object name, the string is checked to see if it can be interpreted as a ref so that a warning can be given for ambiguity. The code kicked in even when the core.warnambiguousrefs is set to false to squelch this warning, in which case the cycles spent to look at the ref namespace were an expensive no-op, as the result was discarded without being used.
  • The naming convention of the packfiles has been updated; it used to be based on the enumeration of names of the objects that are contained in the pack, but now it also depends on how the packed result is represented---packing the same set of objects using different settings (or delta order) would produce a pack with different name.
  • "git diff --no-index" mode used to unnecessarily attempt to read the index when there is one.
  • The deprecated parse-options macro OPT_BOOLEAN has been removed; use OPT_BOOL or OPT_COUNTUP in new code.
  • A few duplicate implementations of prefix/suffix string comparison functions have been unified to starts_with() and ends_with().
  • The new PERLLIB_EXTRA makefile variable can be used to specify additional directories Perl modules (e.g. the ones necessary to run git-svn) are installed on the platform when building.
  • "git merge-base" learned the "--fork-point" mode, that implements the same logic used in "git pull --rebase" to find a suitable fork point out of the reflog entries for the remote-tracking branch the work has been based on. "git rebase" has the same logic that can be triggered with the "--fork-point" option.
  • A third-party "receive-pack" (the responder to "git push") can advertise the "no-thin" capability to tell "git push" not to use the thin-pack optimization. Our receive-pack has always been capable of accepting and fattening a thin-pack, and will continue not to ask "git push" to use a non-thin pack.
  • Also contains various documentation updates and code clean-ups.

New in version 1.8.5.5 (February 14th, 2014)

  • The pathspec matching code, while comparing two trees (e.g. "git diff A B -- path1 path2") was too aggressive and failed to match some paths when multiple pathspecs were involved.
  • "git repack --max-pack-size=8g" stopped being parsed correctly when the command was reimplemented in C.
  • A recent update to "git send-email" broke platforms where /etc/ssl/certs/ directory exists but cannot be used as SSL_ca_path (e.g. Fedora rawhide).
  • A handful of bugs around interpreting $branch@{upstream} notation and its lookalike, when $branch part has interesting characters, e.g. "@", and ":", have been fixed.
  • "git clone" would fail to clone from a repository that has a ref directly under "refs/", e.g. "refs/stash", because different validation paths do different things on such a refname. Loosen the client side's validation to allow such a ref.
  • "git log --left-right A...B" lost the "leftness" of commits reachable from A when A is a tag as a side effect of a recent bugfix. This is a regression in 1.8.4.x series.
  • "git merge-base --octopus" used to leave cleaning up suboptimal result to the caller, but now it does the clean-up itself.
  • "git mv A B/", when B does not exist as a directory, should error out, but it didn't.

New in version 1.8.5.4 (February 6th, 2014)

  • "git fetch --depth=0" was a no-op, and was silently ignored. Diagnose it as an error.
  • Remote repository URL expressed in scp-style host:path notation are parsed more carefully (e.g. "foo/bar:baz" is local, "[::1]:/~user" asks to connect to user's home directory on host at address ::1.
  • SSL-related options were not passed correctly to underlying socket layer in "git send-email".
  • "git commit -v" appends the patch to the log message before editing, and then removes the patch when the editor returned control. However, the patch was not stripped correctly when the first modified path was a submodule.
  • "git mv A B/", when B does not exist as a directory, should error out, but it didn't.
  • When we figure out how many file descriptors to allocate for keeping packfiles open, a system with non-working getrlimit() could cause us to die(), but because we make this call only to get a rough estimate of how many is available and we do not even attempt to use up all file descriptors available ourselves, it is nicer to fall back to a reasonable low value rather than dying.
  • "git log --decorate" did not handle a tag pointed by another tag nicely.
  • "git add -A" (no other arguments) in a totally empty working tree used to emit an error.
  • There is no reason to have a hardcoded upper limit of the number of parents for an octopus merge, created via the graft mechanism, but there was.
  • The implementation of 'git stash $cmd "stash@{...}"' did not quote the stash argument properly and left it split at IFS whitespace.
  • The documentation to "git pull" hinted there is an "-m" option because it incorrectly shared the documentation with "git merge".

New in version 1.9 RC1 (January 28th, 2014)

  • git-gui i18n: Initial glossary in Bulgarian
  • git-gui l10n: Add 29 more terms to glossary
  • git-gui i18n: Added Bulgarian translation
  • gitk: Add Bulgarian translation (304t)
  • tree_entry_interesting: match against all pathspecs
  • subtree: fix argument validation in add/pull/push
  • gitk: Comply with XDG base directory specification
  • prefer xwrite instead of write
  • mingw: remove mingw_write
  • fetch-pack: do not filter out one-level refs
  • interpret_branch_name: factor out upstream handling
  • interpret_branch_name: rename "cp" variable to "at"
  • interpret_branch_name: always respect "namelen" parameter
  • interpret_branch_name: avoid @{upstream} past colon
  • interpret_branch_name: find all possible @-marks
  • diff_filespec: reorder dirty_submodule macro definitions
  • diff_filespec: drop funcname_pattern_ident field
  • diff_filespec: drop xfrm_flags field
  • diff_filespec: reorder is_binary field
  • diff_filespec: use only 2 bits for is_binary flag
  • t/perf: time rev-list with UNINTERESTING commits
  • list-objects: only look at cmdline trees with edge_hint
  • repack: fix typo in max-pack-size option
  • repack: make parsed string options const-correct
  • repack: propagate pack-objects options as strings
  • t7501: fix "empty commit" test with NO_PERL
  • t7700: do not use "touch" unnecessarily
  • Makefile: Fix compilation of Windows resource file
  • completion: complete merge-base options
  • completion: handle --[no-]fork-point options to git-rebase
  • Makefile: remove redundant object in git-http{fetch,push}
  • Jonathan Nieder (3):
  • gitignore doc: add global gitignore to synopsis
  • git-gui: chmod +x po2msg, windows/git-gui.sh
  • gitk: chmod +x po2msg.sh
  • Documentation: exclude irrelevant options from "git pull"
  • Documentation: "git pull" does not have the "-m" option
  • revision: mark contents of an uninteresting tree uninteresting
  • revision: propagate flag bits from tags to pointees
  • Documentation: make it easier to maintain enumerated documents
  • gitk: Replace "next" and "prev" buttons with down and up arrows
  • git-gui: fallback right pane to packed widgets with Tk 8.4
  • gitk: Fix mistype
  • safe_create_leading_directories(): fix format of "if" chaining
  • safe_create_leading_directories(): reduce scope of local variable
  • safe_create_leading_directories(): add explicit "slash" pointer
  • safe_create_leading_directories(): rename local variable
  • safe_create_leading_directories(): split on first of multiple slashes
  • safe_create_leading_directories(): always restore slash at end of loop
  • safe_create_leading_directories(): introduce enum for return values
  • cmd_init_db(): when creating directories, handle errors conservatively
  • safe_create_leading_directories(): add new error value SCLD_VANISHED
  • gitattributes: document more clearly where macros are allowed
  • refname_match(): always use the rules in ref_rev_parse_rules
  • lock_ref_sha1_basic(): on SCLD_VANISHED, retry
  • lock_ref_sha1_basic(): if locking fails with ENOENT, retry
  • remove_dir_recurse(): tighten condition for removing unreadable dir
  • remove_dir_recurse(): handle disappearing files and directories
  • rename_ref(): extract function rename_tmp_log()
  • rename_tmp_log(): handle a possible mkdir/rmdir race
  • rename_tmp_log(): limit the number of remote_empty_directories() attempts
  • rename_tmp_log(): on SCLD_VANISHED, retry
  • safe_create_leading_directories(): on Windows, \ can separate path components
  • Add cross-references between docs for for-each-ref and show-ref
  • doc: remote author/documentation sections from more pages
  • tree-walk.c: ignore trailing slash on submodule in tree_entry_interesting()
  • git-gui 0.19
  • gitk: Update copyright dates
  • gitk: Indent word-wrapped lines in commit display header
  • git p4 test: wildcards are supported
  • git p4 test: ensure p4 symlink parsing works
  • git p4: work around p4 bug that causes empty symlinks
  • git p4 test: explicitly check p4 wildcard delete
  • git p4 test: is_cli_file_writeable succeeds
  • git p4 test: run as user "author"
  • git p4 test: do not pollute /tmp
  • git p4: handle files with wildcards when doing RCS scrubbing
  • git p4: fix an error message when "p4 where" fails
  • git p4 test: examine behavior with locked (+l) files
  • git p4 doc: use two-line style for options with multiple spellings
  • send-email: /etc/ssl/certs/ directory may not be usable as ca_path
  • create HTML for http-protocol.txt
  • http-protocol.txt: don't use uppercase for variable names in "The Negotiation Algorithm"
  • Documentation/gitk: document -L option
  • Documentation: @{-N} can refer to a commit
  • git-svn: memoize _rev_list and rebuild

New in version 1.9 RC (January 20th, 2014)

  • UPDATES SINCE V1.8.5:
  • Foreign interfaces, subsystems and ports.
  • The HTTP transport, when talking GSS-Negotiate, uses "100 Continue" response to avoid having to rewind and resend a large payload, which may not be always doable.
  • Various bugfixes to remote-bzr and remote-hg (in contrib/).
  • The build procedure is aware of MirBSD now.
  • UI, Workflows & Features:
  • Fetching from a shallowly-cloned repository used to be forbidden, primarily because the codepaths involved were not carefully vetted and we did not bother supporting such usage. This release attempts to allow object transfer out of a shallowly-cloned repository in a more controlled way (i.e. the receiver become a shallow repository with a truncated history).
  • Just like we give a reasonable default for "less" via the LESS environment variable, we now specify a reasonable default for "lv" via the "LV" environment variable when spawning the pager.
  • Two-level configuration variable names in "branch.*" and "remote.*" hierarchies, whose variables are predominantly three-level, were not completed by hitting a in bash and zsh completions.
  • Fetching 'frotz' branch with "git fetch", while 'frotz/nitfol' remote-tracking branch from an earlier fetch was still there, would error out, primarily because the command was not told that it is allowed to lose any information on our side. "git fetch --prune" now can be used to remove 'frotz/nitfol' to make room to fetch and store 'frotz' remote-tracking branch.
  • "diff.orderfile=" configuration variable can be used to pretend as if the "-O" option were given from the command line of "git diff", etc.
  • The negative pathspec syntax allows "git log -- . ':!dir'" to tell us "I am interested in everything but 'dir' directory".
  • "git difftool" shows how many different paths there are in total, and how many of them have been shown so far, to indicate progress.
  • "git push origin master" used to push our 'master' branch to update the 'master' branch at the 'origin' repository. This has been enhanced to use the same ref mapping "git push origin" would use to determine what ref at the 'origin' to be updated with our 'master'. For example, with this configuration
  • [remote "origin"] push = refs/heads/*:refs/review/*
  • that would cause "git push origin" to push out our local branches to corresponding refs under refs/review/ hierarchy at 'origin', "git push origin master" would update 'refs/review/master' over there. Alternatively, if push.default is set to 'upstream' and our 'master' is set to integrate with 'topic' from the 'origin' branch, running "git push origin" while on our 'master' would update their 'topic' branch, and running "git push origin master" while on any of our branches does the same.
  • "gitweb" learned to treat ref hierarchies other than refs/heads as if they are additional branch namespaces (e.g. refs/changes/ in Gerrit).
  • "git for-each-ref --format=..." learned a few formatting directives; e.g. "%(color:red)%(HEAD)%(color:reset) %(refname:short) %(subject)".
  • The command string given to "git submodule foreach" is passed directly to the shell, without being eval'ed. This is a backward incompatible change that may break existing users.
  • "git log" and friends learned the "--exclude=" option, to allow people to say "list history of all branches except those that match this pattern" with "git log --exclude='*/*' --branches".
  • "git rev-parse --parseopt" learned a new "--stuck-long" option to help scripts parse options with an optional parameter.
  • The "--tags" option to "git fetch" no longer tells the command to fetch _only_ the tags. It instead fetches tags _in addition to_ what are fetched by the same command line without the option.
  • Performance, Internal Implementation, etc.:
  • When parsing a 40-hex string into the object name, the string is checked to see if it can be interpreted as a ref so that a warning can be given for ambiguity. The code kicked in even when the core.warnambiguousrefs is set to false to squelch this warning, in which case the cycles spent to look at the ref namespace were an expensive no-op, as the result was discarded without being used.
  • The naming convention of the packfiles has been updated; it used to be based on the enumeration of names of the objects that are contained in the pack, but now it also depends on how the packed result is represented---packing the same set of objects using different settings (or delta order) would produce a pack with different name.
  • "git diff --no-index" mode used to unnecessarily attempt to read the index when there is one.
  • The deprecated parse-options macro OPT_BOOLEAN has been removed; use OPT_BOOL or OPT_COUNTUP in new code.
  • A few duplicate implementations of prefix/suffix string comparison functions have been unified to starts_with() and ends_with().
  • The new PERLLIB_EXTRA makefile variable can be used to specify additional directories Perl modules (e.g. the ones necessary to run git-svn) are installed on the platform when building.
  • "git merge-base" learned the "--fork-point" mode, that implements the same logic used in "git pull --rebase" to find a suitable fork point out of the reflog entries for the remote-tracking branch the work has been based on. "git rebase" has the same logic that can be triggered with the "--fork-point" option.
  • A third-party "receive-pack" (the responder to "git push") can advertise the "no-thin" capability to tell "git push" not to use the thin-pack optimization. Our receive-pack has always been capable of accepting and fattening a thin-pack, and will continue not to ask "git push" to use a non-thin pack.
  • Also contains various documentation updates and code clean-ups.

New in version 1.8.5.3 (January 14th, 2014)

  • The "--[no-]informative-errors" options to "git daemon" were parsed a bit too loosely, allowing any other string after these option names.
  • A "gc" process running as a different user should be able to stop a new "gc" process from starting.
  • An earlier "clean-up" introduced an unnecessary memory leak to the credential subsystem.
  • "git mv A B/", when B does not exist as a directory, should error out, but it didn't.
  • "git rev-parse -- " did not implement the usual disambiguation rules the commands in the "git log" family used in the same way.
  • "git cat-file --batch=", an admittedly useless command, did not behave very well.
  • Also contains typofixes, documentation updates and trivial code clean-ups.

New in version 1.8.5.2 (December 18th, 2013)

  • "git diff -- ':(icase)makefile'" was unnecessarily rejected at the command line parser.
  • "git cat-file --batch-check=ok" did not check the existence of the named object.
  • "git am --abort" sometimes complained about not being able to write a tree with an 0{40} object in it.
  • Two processes creating loose objects at the same time could have failed unnecessarily when the name of their new objects started with the same byte value, due to a race condition.
  • Also contains typofixes, documentation updates and trivial code clean-ups.

New in version 1.8.5.1 (December 4th, 2013)

  • "git submodule init" copied "submodule.$name.update" settings from .gitmodules to .git/config without making sure if the suggested value was sensible.

New in version 1.8.5 (November 29th, 2013)

  • Foreign interfaces, subsystems and ports:
  • "git-svn" has been taught to use the serf library, which is the only option SVN 1.8.0 offers us when talking the HTTP protocol.
  • "git-svn" talking over an https:// connection using the serf library dumped core due to a bug in the serf library that SVN uses. Work around it on our side, even though the SVN side is being fixed.
  • On MacOS X, we detected if the filesystem needs the "pre-composed unicode strings" workaround, but did not automatically enable it. Now we do.
  • remote-hg remote helper misbehaved when interacting with a local Hg repository relative to the home directory, e.g. "clone hg::~/there".
  • imap-send ported to OS X uses Apple's security framework instead of OpenSSL's.
  • "git fast-import" treats an empty path given to "ls" as the root of the tree.
  • UI, Workflows & Features:
  • xdg-open can be used as a browser backend for "git web-browse" (hence to show "git help -w" output), when available.
  • "git grep" and "git show" pay attention to the "--textconv" option when these commands are told to operate on blob objects (e.g. "git grep -e pattern --textconv HEAD:Makefile").
  • "git replace" helper no longer allows an object to be replaced with another object of a different type to avoid confusion (you can still manually craft such a replacement using "git update-ref", as an escape hatch).
  • "git status" no longer prints the dirty status information of submodules for which submodule.$name.ignore is set to "all".
  • "git rebase -i" honours core.abbrev when preparing the insn sheet for editing.
  • "git status" during a cherry-pick shows which original commit is being picked.
  • Instead of typing four capital letters "HEAD", you can say "@" now, e.g. "git log @".
  • "git check-ignore" follows the same rule as "git add" and "git status" in that the ignore/exclude mechanism does not take effect on paths that are already tracked. With the "--no-index" option, it can be used to diagnose which paths that should have been ignored have been mistakenly added to the index.
  • Some irrelevant "advice" messages that are shared with "git status" output have been removed from the commit log template.
  • "update-refs" learned a "--stdin" option to read multiple update requests and perform them in an all-or-none fashion.
  • Just like "make -C ", "git -C ..." tells Git to go there before doing anything else.
  • Just like "git checkout -" knows to check out, and "git merge -" knows to merge, the branch you were previously on, "git cherry-pick" now understands "git cherry-pick -" to pick from the previous branch.
  • "git status" now omits the prefix to make its output a comment in a commit log editor, which is not necessary for human consumption. Scripts that parse the output of "git status" are advised to use "git status --porcelain" instead, as its format is stable and easier to parse.
  • The ref syntax "foo^{tag}" (with the literal string "{tag}") peels a tag ref to itself, i.e. it's a no-op., and fails if "foo" is not a tag. "git rev-parse --verify v1.0^{tag}" is a more convenient way than "test $(git cat-file -t v1.0) = tag" to check if v1.0 is a tag.
  • "git branch -v -v" (and "git status") did not distinguish among a branch that is not based on any other branch, a branch that is in sync with its upstream branch, and a branch that is configured with an upstream branch that no longer exists.
  • Earlier we started rejecting any attempt to add the 0{40} object name to the index and to tree objects, but it sometimes is necessary to allow this to be able to use tools like filter-branch to correct such broken tree objects. "filter-branch" can again be used to do this.
  • "git config" did not provide a way to set or access numbers larger than a native "int" on the platform; it now provides 64-bit signed integers on all platforms.
  • "git pull --rebase" always chose to do the bog-standard flattening rebase. You can tell it to run "rebase --preserve-merges" with "git pull --rebase=preserve" or by setting "pull.rebase" configuration to "preserve".
  • "git push --no-thin" actually disables the "thin pack transfer" optimization.
  • Magic pathspecs like ":(icase)makefile" (matches both Makefile and makefile) and ":(glob)foo/**/bar" (matches "bar" in "foo" and any subdirectory of "foo") can be used in more places.
  • The "http.*" variables can now be specified for individual URLs. For example,
  • [http] sslVerify = true [http "https://weak.example.com/"] sslVerify = false
  • would flip http.sslVerify off only when talking to that specific site.
  • "git mv A B" when moving a submodule has been taught to relocate the submodule's working tree and to adjust the paths in the .gitmodules file.
  • "git blame" can now take more than one -L option to discover the origin of multiple blocks of lines.
  • The http transport clients can optionally ask to save cookies with the http.savecookies configuration variable.
  • "git push" learned a more fine grained control over a blunt "--force" when requesting a non-fast-forward update with the "--force-with-lease=:" option.
  • "git diff --diff-filter=" can now take lowercase letters (e.g. "--diff-filter=d") to mean "show everything but these classes". "git diff-files -q" is now a deprecated synonym for "git diff-files --diff-filter=d".
  • "git fetch" (hence "git pull" as well) learned to check "fetch.prune" and "remote.*.prune" configuration variables and to behave as if the "--prune" command line option was given.
  • "git check-ignore -z" applied the NUL termination to both its input (with --stdin) and its output, but "git check-attr -z" ignored the option on the output side. Make both honor -z on the input and output side the same way.
  • "git whatchanged" may still be used by old timers, but mention of it in documents meant for new users will only waste readers' time wondering what the difference is between it and "git log". Make it less prominent in the general part of the documentation and explain that it is merely a "git log" with different default behaviour in its own document.
  • Performance, Internal Implementation, etc:
  • "git for-each-ref" when asking for merely the object name does not have to parse the object pointed at by the refs; the codepath has been optimized.
  • The HTTP transport will try to use TCP keepalive when able.
  • "git repack" is now written in C.
  • Build procedure for MSVC has been updated.
  • If a build-time fallback is set to "cat" instead of "less", we should apply the same "no subprocess or pipe" optimization as we apply to user-supplied GIT_PAGER=cat.
  • Many commands use a --dashed-option as an operation mode selector (e.g. "git tag --delete") that excludes other operation modes (e.g. "git tag --delete --verify" is nonsense) and that cannot be negated (e.g. "git tag --no-delete" is nonsense). The parse-options API learned a new OPT_CMDMODE macro to make it easier to implement such a set of options.
  • OPT_BOOLEAN() in the parse-options API was misdesigned to be "counting up" but many subcommands expect it to behave as "on/off". Update them to use OPT_BOOL() which is a proper boolean.
  • "git gc" exits early without doing any work when it detects that another instance of itself is already running.
  • Under memory pressure and/or file descriptor pressure, we used to close pack windows that are not used and also closed filehandles to open but unused packfiles. These are now controlled separately to better cope with the load.
  • Also contains various documentation updates and code clean-ups.
  • Fixes since v1.8.4:
  • Unless otherwise noted, all the fixes since v1.8.4 in the maintenance track are contained in this release (see the maintenance releases' notes for details).
  • An ancient How-To on serving Git repositories on an HTTP server lacked a warning that it has been mostly superseded with a more modern way. (merge 6d52bc3 sc/doc-howto-dumb-http later to maint).
  • The interaction between the use of Perl in our test suite and NO_PERL has been clarified a bit. (merge f8fc0ee jn/test-prereq-perl-doc later to maint).
  • The synopsis section of the "git unpack-objects" documentation has been clarified a bit. (merge 61e2e22 vd/doc-unpack-objects later to maint).
  • We did not generate the HTML version of the documentation to "git subtree" in contrib/. (merge 95c62fb jk/subtree-install-fix later to maint).
  • A fast-import stream expresses a pathname with funny characters by quoting them in C style; the remote-hg remote helper forgot to unquote such a path. (merge 1136265 ap/remote-hg-unquote-cquote later to maint).
  • "git reset -p HEAD" has a codepath to special-case it to behave differently from resetting to contents of other commits, but a recent change broke it.
  • Coloring around octopus merges in "log --graph" output was screwy. (merge 339c17b hn/log-graph-color-octopus later to maint).
  • "git checkout topic", when there is not yet a local "topic" branch but there is a unique remote-tracking branch for a remote "topic" branch, pretended as if "git checkout -t -b topic remote/$r/topic" (for that unique remote $r) was run. This hack however was not implemented for "git checkout topic --". (merge bca3969 mm/checkout-auto-track-fix later to maint).
  • One long-standing flaw in the pack transfer protocol used by "git clone" was that there was no way to tell the other end which branch "HEAD" points at, and the receiving end needed to guess. A new capability has been defined in the pack protocol to convey this information so that cloning from a repository with more than one branch pointing at the same commit where the HEAD is at now reliably sets the initial branch in the resulting repository. (merge 360a326 jc/upload-pack-send-symref later to maint).
  • We did not handle cases where the http transport gets redirected during the authorization request (e.g. from http:// to https://). (merge 70900ed jk/http-auth-redirects later to maint).
  • Bash prompting code to deal with an SVN remote as an upstream was coded in a way unsupported by older Bash versions (3.x). (merge 52ec889 sg/prompt-svn-remote-fix later to maint).
  • The fall-back parsing of commit objects with broken author or committer lines was less robust than ideal in picking up the timestamps. (merge 03818a4 jk/split-broken-ident later to maint).
  • "git rev-list --objects ^v1.0^ v1.0" gave the v1.0 tag itself in the output, but "git rev-list --objects v1.0^..v1.0" did not. (merge 895c5ba jc/revision-range-unpeel later to maint).
  • "git clone" wrote some progress messages to standard output, not to standard error, and did not suppress them with the --no-progress option. (merge 643f918 jk/clone-progress-to-stderr later to maint).
  • "format-patch --from=" forgot to omit an unnecessary in-body from line, i.e. when is the same as the real author. (merge 662cc30 jk/format-patch-from later to maint).
  • "git shortlog" used to choke and die when there is a malformed commit (e.g. missing authors); it now simply ignores such a commit and keeps going. (merge cd4f09e jk/shortlog-tolerate-broken-commit later to maint).
  • "git merge-recursive" did not parse its "--diff-algorithm=" command line option correctly. (merge 6562928 jk/diff-algo later to maint).
  • When running "fetch -q", a long silence while the sender side computes the set of objects to send can be mistaken by proxies as dropped connection. The server side has been taught to send a small empty messages to keep the connection alive. (merge 115dedd jk/upload-pack-keepalive later to maint).
  • "git rebase" had a portability regression in v1.8.4 that triggered a bug in some BSD shell implementations. (merge 99855dd mm/rebase-continue-freebsd-WB later to maint).
  • "git branch --track" had a minor regression in v1.8.3.2 and later that made it impossible to base your local work on anything but a local branch of the upstream repository you are tracking. (merge b0f49ff jh/checkout-auto-tracking later to maint).
  • When the web server responds with "405 Method Not Allowed", "git http-backend" should tell the client what methods are allowed with the "Allow" header. (merge 9247be0 bc/http-backend-allow-405 later to maint).
  • When there is no sufficient overlap between old and new history during a "git fetch" into a shallow repository, objects that the sending side knows the receiving end has were unnecessarily sent. (merge f21d2a7 nd/fetch-into-shallow later to maint).
  • "git cvsserver" computed the permission mode bits incorrectly for executable files. (merge 1b48d56 jc/cvsserver-perm-bit-fix later to maint).
  • When send-email obtains an error message to die with upon failure to start an SSL session, it tried to read the error string from a wrong place. (merge 6cb0c88 bc/send-email-ssl-die-message-fix later to maint).
  • The implementation of "add -i" has some crippling code to work around an ActiveState Perl limitation but it by mistake also triggered on Git for Windows where MSYS perl is used. (merge df17e77 js/add-i-mingw later to maint).
  • We made sure that we notice when the user-supplied GIT_DIR is actually a gitfile, but did not do the same when the default ".git" is a gitfile. (merge 487a2b7 nd/git-dir-pointing-at-gitfile later to maint).
  • When an object is not found after checking the packfiles and the loose object directory, read_sha1_file() re-checks the packfiles to prevent racing with a concurrent repacker; teach the same logic to has_sha1_file(). (merge 45e8a74 jk/has-sha1-file-retry-packed later to maint).
  • "git commit --author=$name", when $name is not in the canonical "A. U. Thor " format, looks for a matching name from existing history, but did not consult mailmap to grab the preferred author name. (merge ea16794 ap/commit-author-mailmap later to maint).
  • "git ls-files -k" needs to crawl only the part of the working tree that may overlap the paths in the index to find killed files, but shared code with the logic to find all the untracked files, which made it unnecessarily inefficient. (merge 680be04 jc/ls-files-killed-optim later to maint).
  • The shortened commit object names in the insn sheet that is prepared at the beginning of a "rebase -i" session can become ambiguous as the rebasing progresses and the repository gains more commits. Make sure the internal record is kept with full 40-hex object names. (merge 75c6976 es/rebase-i-no-abbrev later to maint).
  • "git rebase --preserve-merges" internally used the merge machinery and as a side effect left the merge summary message in the log, but when rebasing there is no need for the merge summary. (merge a9f739c rt/rebase-p-no-merge-summary later to maint).
  • A call to xread() was used without a loop around it to cope with short reads in the codepath to stream new contents to a pack. (merge e92527c js/xread-in-full later to maint).
  • "git rebase -i" forgot that the comment character is configurable while reading its insn sheet. (merge 7bca7af es/rebase-i-respect-core-commentchar later to maint).
  • The mailmap support code read past the allocated buffer when the mailmap file ended with an incomplete line. (merge f972a16 jk/mailmap-incomplete-line later to maint).
  • We used to send a large request to read(2)/write(2) as a single system call, which was bad from the latency point of view when the operation needs to be killed, and also triggered an error on broken 64-bit systems that refuse to read or write more than 2GB in one go. (merge a487916 sp/clip-read-write-to-8mb later to maint).
  • "git fetch" that auto-followed tags incorrectly reused the connection with Git-aware transport helper (like the sample "ext::" helper shipped with Git). (merge 0f73f8b jc/transport-do-not-use-connect-twice-in-fetch later to maint).
  • "git log --full-diff -- " showed a huge diff for paths outside the given for each commit, instead of showing the change relative to the parent of the commit. "git reflog -p" had a similar problem. (merge 838f9a1 tr/log-full-diff-keep-true-parents later to maint).
  • Setting a submodule.*.path configuration variable to true (without giving "= value") caused Git to segfault. (merge 4b05440 jl/some-submodule-config-are-not-boolean later to maint).
  • "git rebase -i" (there could be others, as the root cause is pretty generic) fed a random, data dependent string to 'echo' and expected it to come out literally, corrupting its error message. (merge 89b0230 mm/no-shell-escape-in-die-message later to maint).
  • Some people still use rather old versions of bash, which cannot grok some constructs like 'printf -v varname' which the prompt and completion code started to use recently. (merge a44aa69 bc/completion-for-bash-3.0 later to maint).
  • Code to read configuration from a blob object did not compile on platforms with fgetc() etc. implemented as macros. (merge 49d6cfa hv/config-from-blob later to maint-1.8.3).
  • The recent "short-cut clone connectivity check" topic broke a shallow repository when a fetch operation tries to auto-follow tags. (merge 6da8bdc nd/fetch-pack-shallow-fix later to maint-1.8.3).

New in version 1.8.4.4 (November 26th, 2013)

  • The fix in v1.8.4.3 to the pack transfer protocol to propagate the target of symbolic refs broke "git clone/git fetch" from a repository with too many symbolic refs. As a hotfix/workaround, we transfer only the information on HEAD.

New in version 1.8.4.3 (November 9th, 2013)

  • The interaction between use of Perl in our test suite and NO_PERL has been clarified a bit.
  • A fast-import stream expresses a pathname with funny characters by quoting them in C style; remote-hg remote helper (in contrib/) forgot to unquote such a path.
  • One long-standing flaw in the pack transfer protocol used by "git clone" was that there was no way to tell the other end which branch "HEAD" points at, and the receiving end needed to guess. A new capability has been defined in the pack protocol to convey this information so that cloning from a repository with more than one branches pointing at the same commit where the HEAD is at now reliably sets the initial branch in the resulting repository.
  • We did not handle cases where http transport gets redirected during the authorization request (e.g. from http:// to https://).
  • "git rev-list --objects ^v1.0^ v1.0" gave v1.0 tag itself in the output, but "git rev-list --objects v1.0^..v1.0" did not.
  • The fall-back parsing of commit objects with broken author or committer lines were less robust than ideal in picking up the timestamps.
  • Bash prompting code to deal with an SVN remote as an upstream were coded in a way not supported by older Bash versions (3.x).
  • "git checkout topic", when there is not yet a local "topic" branch but there is a unique remote-tracking branch for a remote "topic" branch, pretended as if "git checkout -t -b topic remote/$r/topic" (for that unique remote $r) was run. This hack however was not implemented for "git checkout topic --".
  • Coloring around octopus merges in "log --graph" output was screwy.
  • We did not generate HTML version of documentation to "git subtree" in contrib/.
  • The synopsis section of "git unpack-objects" documentation has been clarified a bit.
  • An ancient How-To on serving Git repositories on an HTTP server lacked a warning that it has been mostly superseded with more modern way.
  • Also contains a handful of trivial code clean-ups, documentation
  • updates, updates to the test suite, etc.

New in version 1.8.4.2 (October 29th, 2013)

  • "git clone" gave some progress messages to the standard output, not to the standard error, and did not allow suppressing them with the "--no-progress" option.
  • "format-patch --from=" forgot to omit unnecessary in-body from line, i.e. when is the same as the real author.
  • "git shortlog" used to choke and die when there is a malformed commit (e.g. missing authors); it now simply ignore such a commit and keeps going.
  • "git merge-recursive" did not parse its "--diff-algorithm=" command line option correctly.
  • "git branch --track" had a minor regression in v1.8.3.2 and later that made it impossible to base your local work on anything but a local branch of the upstream repository you are tracking from.
  • "git ls-files -k" needs to crawl only the part of the working tree that may overlap the paths in the index to find killed files, but shared code with the logic to find all the untracked files, which made it unnecessarily inefficient.
  • When there is no sufficient overlap between old and new history during a "git fetch" into a shallow repository, objects that the sending side knows the receiving end has were unnecessarily sent.
  • When running "fetch -q", a long silence while the sender side computes the set of objects to send can be mistaken by proxies as dropped connection. The server side has been taught to send a small empty messages to keep the connection alive.
  • When the webserver responds with "405 Method Not Allowed", "git http-backend" should tell the client what methods are allowed with the "Allow" header.
  • "git cvsserver" computed the permission mode bits incorrectly for executable files.
  • The implementation of "add -i" has a crippling code to work around ActiveState Perl limitation but it by mistake also triggered on Git for Windows where MSYS perl is used.
  • We made sure that we notice the user-supplied GIT_DIR is actually a gitfile, but did not do the same when the default ".git" is a gitfile.
  • When an object is not found after checking the packfiles and then loose object directory, read_sha1_file() re-checks the packfiles to prevent racing with a concurrent repacker; teach the same logic to has_sha1_file().
  • "git commit --author=$name", when $name is not in the canonical "A. U. Thor " format, looks for a matching name from existing history, but did not consult mailmap to grab the preferred author name.
  • The commit object names in the insn sheet that was prepared at the beginning of "rebase -i" session can become ambiguous as the rebasing progresses and the repository gains more commits. Make sure the internal record is kept with full 40-hex object names.
  • "git rebase --preserve-merges" internally used the merge machinery and as a side effect, left merge summary message in the log, but when rebasing, there should not be a need for merge summary.
  • "git rebase -i" forgot that the comment character can be configurable while reading its insn sheet.
  • Also contains a handful of trivial code clean-ups, documentation
  • updates, updates to the test suite, etc.

New in version 1.8.4.1 (October 16th, 2013)

  • Some old versions of bash do not grok some constructs like 'printf -v varname' which the prompt and completion code started to use recently. The completion and prompt scripts have been adjusted to work better with these old versions of bash.
  • In FreeBSD's and NetBSD's "sh", a return in a dot script in a function returns from the function, not only in the dot script, breaking "git rebase" on these platforms (regression introduced in 1.8.4-rc1).
  • "git rebase -i" and other scripted commands were feeding a random, data dependant error message to 'echo' and expecting it to come out literally.
  • Setting the "submodule..path" variable to the empty "true" caused the configuration parser to segfault.
  • Output from "git log --full-diff -- " looked strange because comparison was done with the previous ancestor that touched the specified , causing the patches for paths outside the pathspec to show more than the single commit has changed.
  • The auto-tag-following code in "git fetch" tries to reuse the same transport twice when the serving end does not cooperate and does not give tags that point to commits that are asked for as part of the primary transfer. Unfortunately, Git-aware transport helper interface is not designed to be used more than once, hence this did not work over smart-http transfer. Fixed.
  • Send a large request to read(2)/write(2) as a smaller but still reasonably large chunks, which would improve the latency when the operation needs to be killed and incidentally works around broken 64-bit systems that cannot take a 2GB write or read in one go.
  • A ".mailmap" file that ends with an incomplete line, when read from a blob, was not handled properly.
  • The recent "short-cut clone connectivity check" topic broke a shallow repository when a fetch operation tries to auto-follow tags.
  • When send-email comes up with an error message to die with upon failure to start an SSL session, it tried to read the error string from a wrong place.
  • A call to xread() was used without a loop to cope with short read in the codepath to stream large blobs to a pack.
  • On platforms with fgetc() and friends defined as macros, the configuration parser did not compile.
  • New versions of MediaWiki introduced a new API for returning more than 500 results in response to a query, which would cause the MediaWiki remote helper to go into an infinite loop.
  • Subversion's serf access method (the only one available in Subversion 1.8) for http and https URLs in skelta mode tells its caller to open multiple files at a time, which made "git svn fetch" complain that "Temp file with moniker 'svn_delta' already in use" instead of fetching.
  • Also contains a handful of trivial code clean-ups, documentation updates, updates to the test suite, etc.

New in version 1.8.4 (August 24th, 2013)

  • When "git push [$there]" does not say what to push, we have used the traditional "matching" semantics so far (all your branches were sent to the remote as long as there already are branches of the same name over there). In Git 2.0, the default will change to the "simple" semantics that pushes:
  • - only the current branch to the branch with the same name, and only when the current branch is set to integrate with that remote branch, if you are pushing to the same remote as you fetch from; or
  • - only the current branch to the branch with the same name, if you are pushing to a remote that is not where you usually fetch from.
  • Use the user preference configuration variable "push.default" to change this. If you are an old-timer who is used to the "matching" semantics, you can set the variable to "matching" to keep the traditional behaviour. If you want to live in the future early, you can set it to "simple" today without waiting for Git 2.0.
  • When "git add -u" (and "git add -A") is run inside a subdirectory and does not specify which paths to add on the command line, it will operate on the entire tree in Git 2.0 for consistency with "git commit -a" and other commands. There will be no mechanism to make plain "git add -u" behave like "git add -u .". Current users of "git add -u" (without a pathspec) should start training their fingers to explicitly say "git add -u ." before Git 2.0 comes. A warning is issued when these commands are run without a pathspec and when you have local changes outside the current directory, because the behaviour in Git 2.0 will be different from today's version in such a situation.
  • In Git 2.0, "git add " will behave as "git add -A ", so that "git add dir/" will notice paths you removed from the directory and record the removal. Versions before Git 2.0, including this release, will keep ignoring removals, but the users who rely on this behaviour are encouraged to start using "git add --ignore-removal " now before 2.0 is released.

New in version 1.8.4 RC0 (July 26th, 2013)

  • Updates since v1.8.3:
  • Foreign interfaces, subsystems and ports.
  • Cygwin port has been updated for more recent Cygwin 1.7.
  • "git rebase -i" now honors --strategy and -X options.
  • Git-gui has been updated to its 0.18.0 version.
  • MediaWiki remote helper (in contrib/) has been updated to use the credential helper interface from Git.pm.
  • Update build for Cygwin 1.[57]. Torsten BÃgershausen reports that this is fine with Cygwin 1.7 ($gmane/225824) so let's try moving it ahead.
  • The credential helper to talk to keychain on OS X (in contrib/) has been updated to kick in not just when talking http/https but also imap(s) and smtp.
  • Remote transport helper has been updated to report errors and maintain ref hierarchy used to keep track of its own state better.
  • With "export" remote-helper protocol, (1) a push that tries to update a remote ref whose name is different from the pushing side does not work yet, and (2) the helper may not know how to do --dry-run; these problematic cases are disabled for now.
  • git-remote-hg/bzr (in contrib/) updates.
  • git-remote-mw (in contrib/) hints users to check the certificate, when https:// connection failed.
  • git-remote-mw (in contrib/) adds a command to allow previewing the contents locally before pushing it out, when working with a MediaWiki remote.
  • UI, Workflows & Features:
  • Sample "post-receive-email" hook script got an enhanced replacement "multimail" (in contrib/).
  • Also in contrib/ is a new "contacts" script that runs "git blame" to find out the people who may be interested in a set of changes.
  • "git clean" command learned an interactive mode.
  • The "--head" option to "git show-ref" was only to add "HEAD" to the list of candidate refs to be filtered by the usual rules (e.g. "--heads" that only show refs under refs/heads). The meaning of the option has been changed to always show "HEAD" regardless of
  • what filtering will be applied to any other ref.
  • This is a backward incompatible change and might cause breakages to people's existing scripts.
  • "git show -s" was less discoverable than it should have been. It now has a natural synonym "git show --no-patch".
  • "git check-mailmap" is a new command that lets you map usernames and e-mail addresses through the mailmap mechanism, just like many built-in commands do.
  • "git name-rev" learned to name an annotated tag object back to its tagname; "git name-rev $(git rev-parse v1.0.0)" gives "tags/v1.0.0", for example.
  • "git cat-file --batch-check=" is added, primarily to allow on-disk footprint of objects in packfiles (often they are a lot smaller than their true size, when expressed as deltas) to be reported.
  • "git rebase [-i]" used to leave just "rebase" as its reflog messages for some operations. They have been reworded to be more informative.
  • In addition to the choice from "rebase, merge, or checkout-detach", "submodule update" can allow a custom command to be used in to update the working tree of submodules via the "submodule.*.update" configuration variable.
  • "git submodule update" can optionally clone the submodule repositories shallowly.
  • "git format-patch" learned "--from[=whom]" option, which sets the
  • "From: " header to the specified person (or the person who runs the command, if "=whom" part is missing) and move the original author information to an in-body From: header as necessary.
  • The configuration variable "merge.ff" was cleary a tri-state to choose one from "favor fast-forward when possible", "always create a merge even when the history could fast-forward" and "do not create any merge, only update when the history fast-forwards", but the command line parser did not implement the usual convention of
  • "last one wins, and command line overrides the configuration" correctly.
  • "gitweb" learned to optionally place extra links that point at the levels higher than the Gitweb pages themselves in the breadcrumbs, so that it can be used as part of a larger installation.
  • "git log --format=" now honors i18n.logoutputencoding configuration variable.
  • The "push.default=simple" mode of "git push" has been updated to behave like "current" without requiring a remote tracking information, when you push to a remote that is different from where you fetch from (i.e. a triangular workflow).
  • Having multiple "fixup!" on a line in the rebase instruction sheet did not work very well with "git rebase -i --autosquash".
  • "git log" learned the "--author-date-order" option, with which the output is topologically sorted and commits in parallel histories are shown intermixed together based on the author timestamp.
  • Various subcommands of "git submodule" refused to run from anywhere other than the top of the working tree of the superproject, but they have been taught to let you run from a subdirectory.
  • "git diff" learned a mode that ignores hunks whose change consists only of additions and removals of blank lines, which is the same as
  • "diff -B" (ignore blank lines) of GNU diff.
  • "git rm" gives a single message followed by list of paths to report multiple paths that cannot be removed.
  • "git rebase" can be told with ":/look for this string" syntax commits to replay the changes onto and where the work to be replayed begins.
  • Many tutorials teach users to set "color.ui" to "auto" as the first thing after you set "user.name/email" to introduce yourselves to
  • Git. Now the variable defaults to "auto".
  • On Cygwin, "cygstart" is now recognised as a possible way to start a web browser (used in "help -w" and "instaweb" among others).
  • "git status" learned status.branch and status.short configuration variables to use --branch and --short options by default (override with --no-branch and --no-short options from the command line).
  • "git cmd ", when happens to be a 40-hex string, directly uses the 40-hex string as an object name, even if a ref "refs//" exists. This disambiguation order is unlikely to change, but we should warn about the ambiguity just like we warn when more than one refs/ hierarchies share the same name.
  • "git rebase" learned "--[no-]autostash" option to save local changes instead of refusing to run (to which people's normal response was to stash them and re-run). This introduced a corner case breakage to "git am --abort" but it has been fixed.
  • Instead of typing four capital letters "HEAD", you can say "@" now, e.g. "git log @".
  • "check-ignore" (new feature since 1.8.2) has been updated to work more like "check-attr" over bidi-pipes.
  • "git describe" learned "--first-parent" option to limit its closest tagged commit search to the first-parent chain.
  • "git merge foo" that might have meant "git merge origin/foo" is diagnosed with a more informative error message.
  • "git log -L,:" has been added. This may still have leaks and rough edges, though. We used the approxidate() parser for "--expire=" options of various commands, but it is better to treat --expire=all and --expire=now a bit more specially than using the current timestamp.
  • "git gc" and "git reflog" have been updated with a new parsing function for expiry dates.
  • Updates to completion (both bash and zsh) helpers.
  • The behaviour of the "--chain-reply-to" option of "git send-email" have changed at 1.7.0, and we added a warning/advice message to help users adjust to the new behaviour back then, but we kept it around for too long. The message has finally been removed.
  • "git fetch origin master" unlike "git fetch origin" or "git fetch" did not update "refs/remotes/origin/master"; this was an early design decision to keep the update of remote tracking branches predictable, but in practice it turns out that people find it more convenient to opportunistically update them whenever we have a chance, and we have been updating them when we run "git push" which already breaks the original "predictability" anyway.
  • The configuration variable core.checkstat was advertised in the documentation but the code expected core.statinfo instead.
  • For now, we accept both core.checkstat and core.statinfo, but the latter will be removed in the longer term.
  • Performance, Internal Implementation, etc.:
  • The function attributes extensions are used to catch mistakes in use of our own variadic functions that use NULL sentinel at the end (i.e. like execl(3)) and format strings (i.e. like printf(3)).
  • The code to allow configuration data to be read from in-tree blob objects is in. This may help working in a bare repository and submodule updates.
  • Fetching between repositories with many refs employed O(n^2) algorithm to match up the common objects, which has been corrected.
  • The original way to specify remote repository using .git/branches/ used to have a nifty feature. The code to support the feature was still in a function but the caller was changed not to call it 5 years ago, breaking that feature and leaving the supporting code unreachable. The dead code has been removed.
  • "git pack-refs" that races with new ref creation or deletion have been susceptible to lossage of refs under right conditions, which has been tightened up.
  • We read loose and packed rerferences in two steps, but after deciding to read a loose ref but before actually opening it to read it, another process racing with us can unlink it, which would cause us to barf. The codepath has been updated to retry when such a race is detected, instead of outright failing.
  • Uses of the platform fnmatch(3) function (many places in the code, matching pathspec, .gitignore and .gitattributes to name a few) have been replaced with wildmatch, allowing "foo/**/bar" that would match foo/bar, foo/a/bar, foo/a/b/bar, etc.
  • Memory ownership and lifetime rules for what for-each-ref feeds to its callbacks have been clarified (in short, "you do not own it, so make a copy if you want to keep it").
  • The revision traversal logic to improve culling of irrelevant parents while traversing a mergy history has been updated.
  • Some leaks in unpack-trees (used in merge, cherry-pick and other codepaths) have been plugged.
  • The codepath to read from marks files in fast-import/export did not have to accept anything but 40-hex representation of the object name. Further, fast-export did not need full in-core object representation to have parsed wen reading from them. These codepaths have been optimized by taking advantage of these access patterns.
  • Object lookup logic, when the object hashtable starts to become crowded, has been optimized.
  • When TEST_OUTPUT_DIRECTORY setting is used, it was handled somewhat inconsistently between the test framework and t/Makefile, and logic to summarize the results looked at a wrong place.
  • "git clone" uses a lighter-weight implementation when making sure that the history behind refs are complete.
  • Many warnings from sparse source checker in compat/ area has been squelched.
  • The code to reading and updating packed-refs file has been updated, correcting corner case bugs.
  • Also contains various documentation updates and code clean-ups.
  • Fixes since v1.8.3:
  • Unless otherwise noted, all the fixes since v1.8.3 in the maintenance track are contained in this release (see release notes to them for details).
  • Newer Net::SMTP::SSL module does not want the user programs to use the default behaviour to let server certificate go without verification, so by default enable the verification with a mechanism to turn it off if needed. (merge 35035bb rr/send-email-ssl-verify later to maint).
  • When "git" is spawned in such a way that any of the low 3 file descriptors is closed, our first open() may yield file descriptor 2, and writing error message to it would screw things up in a big way. (merge a11c396 tr/protect-low-3-fds later to maint).
  • The mailmap mechanism unnecessarily downcased the e-mail addresses in the output, and also ignored the human name when it is a single character name. (merge bd23794 jc/mailmap-case-insensitivity later to maint).
  • In two places we did not check return value (expected to be a file descriptor) correctly. (merge a77f106 tr/fd-gotcha-fixes later to maint).
  • Logic to auto-detect character encodings in the commit log message did not reject overlong and invalid UTF-8 characters. (merge 81050ac bc/commit-invalid-utf8 later to maint).
  • Pass port number as a separate argument when "send-email" initializes
  • Net::SMTP, instead of as a part of the hostname, i.e. host:port.
  • This allows GSSAPI codepath to match with the hostname given. (merge 1a741bf bc/send-email-use-port-as-separate-param later to maint).
  • "git diff" refused to even show difference when core.safecrlf is set to true (i.e. error out) and there are offending lines in the working tree files.
  • (merge 5430bb2 jc/maint-diff-core-safecrlf later to maint).
  • A test that should have failed but didn't revealed a bug that needs to be corrected. (merge 94d75d1 jc/t1512-fix later to maint).
  • An overlong path to a .git directory may have overflown the temporary path buffer used to create a name for lockfiles. (merge 2fbd4f9 mh/maint-lockfile-overflow later to maint).
  • Invocations of "git checkout" used internally by "git rebase" were counted as "checkout", and affected later "git checkout -" to the user to an unexpected place. (merge 3bed291 rr/rebase-checkout-reflog later to maint).
  • "git stash save", when your local change turns a tracked file into a directory, has to remove files in that directory in order to revert your working tree to a pristine state. This will lose untracked files in such a directory, and the command now requires you to "--force" it.
  • The configuration variable column.ui was poorly documented. (merge 5e62cc1 rr/column-doc later to maint).
  • "git name-rev --refs=tags/v*" were forbidden, which was a bit inconvenient (you had to give a pattern to match refs fully, like --refs=refs/tags/v*). (merge 98c5c4a nk/name-rev-abbreviated-refs later to maint).
  • "git apply" parsed patches that add new files, generated by programs other than Git, incorrectly. This is an old breakage in v1.7.11 and will need to be merged down to the maintanance tracks.
  • Older cURL wanted piece of memory we call it with to be stable, but we updated the auth material after handing it to a call.
  • "git pull" into nothing trashed "local changes" that were in the index, and this avoids it.
  • Many "git submodule" operations do not work on a submodule at a path whose name is not in ASCII.
  • "cherry-pick" had a small leak in an error codepath.
  • Logic used by git-send-email to suppress cc mishandled names like
  • "A U. Thor" , where the human readable part needs to be quoted (the user input may not have the double quotes around the name, and comparison was done between quoted and unquoted strings). It also mishandled names that need RFC2047 quoting.
  • Call to discard_cache/discard_index (used when we use different contents of the index in-core, in many operations like commit, apply, and merge) used to leak memory that held the array of index
  • entries, which has been plugged. (merge a0fc4db rs/discard-index-discard-array later to maint).
  • "gitweb" forgot to clear a global variable $search_regexp upon each request, mistakenly carrying over the previous search to a new one when used as a persistent CGI.
  • The wildmatch engine did not honor WM_CASEFOLD option correctly.
  • "git log -c --follow $path" segfaulted upon hitting the commit that renamed the $path being followed.
  • When a reflog notation is used for implicit "current branch", we did not say which branch and worse said "branch ''".
  • "difftool --dir-diff" did not copy back changes made by the end-user in the diff tool backend to the working tree in some cases.
  • "git push $there HEAD:branch" did not resolve HEAD early enough, so it was easy to flip it around while push is still going on and push out a branch that the user did not originally intended when the command was started.
  • The bash prompt code (in contrib/) displayed the name of the branch being rebased when "rebase -i/-m/-p" modes are in use, but not the plain vanilla "rebase".
  • Handling of negative exclude pattern for directories "!dir" was broken in the update to v1.8.3.
  • zsh prompt script that borrowed from bash prompt script did not work due to slight differences in array variable notation between these two shells.
  • An entry for "file://" scheme in the enumeration of URL types Git can take in the HTML documentation was made into a clickable link by mistake.
  • "git push --[no-]verify" was not documented.
  • Stop installing the git-remote-testpy script that is only used for testing.
  • "git commit --allow-empty-message -m ''" should not start an editor.
  • "git merge @{-1}~22" was rewritten to "git merge frotz@{1}~22" incorrectly when your previous branch was "frotz" (it should be rewritten to "git merge frotz~22" instead).
  • "git diff -c -p" was not showing a deleted line from a hunk when another hunk immediately begins where the earlier one ends.
  • "git log --ancestry-path A...B" did not work as expected, as it did not pay attention to the fact that the merge base between A and B was the bottom of the range being specified.
  • Mac OS X does not like to write(2) more than INT_MAX number of bytes; work it around by chopping write(2) into smaller pieces.
  • Newer MacOS X encourages the programs to compile and link with their CommonCrypto, not with OpenSSL.
  • "git clone foo/bar:baz" cannot be a request to clone from a remote
  • over git-over-ssh specified in the scp style. This case is now detected and clones from a local repository at "foo/bar:baz".
  • When $HOME is misconfigured to point at an unreadable directory, we used to complain and die. Loosen the check.
  • "git subtree" (in contrib/) had one codepath with loose error checks to lose data at the remote side.
  • "git fetch" into a shallow repository from a repository that does not know about the shallow boundary commits (e.g. a different fork from the repository the current shallow repository was cloned from) did not work correctly.
  • "git checkout foo" DWIMs the intended "upstream" and turns it into
  • "git checkout -t -b foo remotes/origin/foo". This codepath has been updated to correctly take existing remote definitions into account.

New in version 1.8.3.2 (June 29th, 2013)

  • Cloning with "git clone --depth N" while fetch.fsckobjects (or transfer.fsckobjects) is set to true did not tell the cut-off points of the shallow history to the process that validates the objects and the history received, causing the validation to fail.
  • "git checkout foo" DWIMs the intended "upstream" and turns it into "git checkout -t -b foo remotes/origin/foo". This codepath has been updated to correctly take existing remote definitions into account.
  • "git fetch" into a shallow repository from a repository that does not know about the shallow boundary commits (e.g. a different fork from the repository the current shallow repository was cloned from) did not work correctly.
  • "git subtree" (in contrib/) had one codepath with loose error checks to lose data at the remote side.
  • "git log --ancestry-path A...B" did not work as expected, as it did not pay attention to the fact that the merge base between A and B was the bottom of the range being specified.
  • "git diff -c -p" was not showing a deleted line from a hunk when another hunk immediately begins where the earlier one ends.
  • "git merge @{-1}~22" was rewritten to "git merge frotz@{1}~22" incorrectly when your previous branch was "frotz" (it should be rewritten to "git merge frotz~22" instead).
  • "git commit --allow-empty-message -m ''" should not start an editor.
  • "git push --[no-]verify" was not documented.
  • An entry for "file://" scheme in the enumeration of URL types Git can take in the HTML documentation was made into a clickable link by mistake.
  • zsh prompt script that borrowed from bash prompt script did not work due to slight differences in array variable notation between these two shells.
  • The bash prompt code (in contrib/) displayed the name of the branch being rebased when "rebase -i/-m/-p" modes are in use, but not the plain vanilla "rebase".
  • "git push $there HEAD:branch" did not resolve HEAD early enough, so it was easy to flip it around while push is still going on and push out a branch that the user did not originally intended when the command was started.
  • "difftool --dir-diff" did not copy back changes made by the end-user in the diff tool backend to the working tree in some cases.

New in version 1.8.3.1 (June 11th, 2013)

  • When $HOME is misconfigured to point at an unreadable directory, we used to complain and die. The check has been loosened.
  • Handling of negative exclude pattern for directories "!dir" was broken in the update to v1.8.3.
  • Also contains a handful of trivial code clean-ups, documentation updates, updates to the test suite, etc.

New in version 1.8.3 (May 27th, 2013)

  • Foreign interface:
  • remote-hg and remote-bzr helpers (in contrib/ since v1.8.2) have
  • been updated; especially, the latter has been done in an
  • accelerated schedule (read: we may not have merged to this release
  • if we were following the usual "cook sufficiently in next before
  • unleashing it to the world" workflow) in order to help Emacs folks,
  • whose primary SCM seems to be stagnating.
  • UI, Workflows & Features:
  • A handful of updates applied to gitk, including an addition of "revert" action, showing dates in tags in a nicer way, making colors configurable, and support for -G'pickaxe' search.
  • The prompt string generator (in contrib/completion/) learned to show how many changes there are in total and how many have been replayed during a "git rebase" session.
  • "git branch --vv" learned to paint the name of the branch it integrates with in a different color (color.branch.upstream, which defaults to blue).
  • In a sparsely populated working tree, "git checkout " no longer unmarks paths that match the given pathspec that were originally ignored with "--sparse" (use --ignore-skip-worktree-bits option to resurrect these paths out of the index if you really want to).
  • "git log --format" specifier learned %C(auto) token that tells Git to use color when interpolating %d (decoration), %h (short commit object name), etc. for terminal output.
  • "git bisect" leaves the final outcome as a comment in its bisect log file.
  • "git clone --reference" can now refer to a gitfile "textual symlink" that points at the real location of the repository.
  • "git count-objects" learned "--human-readable" aka "-H" option to show various large numbers in Ki/Mi/GiB scaled as necessary.
  • "git cherry-pick $blob" and "git cherry-pick $tree" are nonsense, and a more readable error message e.g. "can't cherry-pick a tree" is given (we used to say "expected exactly one commit").
  • The "--annotate" option to "git send-email" can be turned on (or off) by default with sendemail.annotate configuration variable (you can use --no-annotate from the command line to override it).
  • The "--cover-letter" option to "git format-patch" can be turned on (or off) by default with format.coverLetter configuration variable. By setting it to 'auto', you can turn it on only for a series with two or more patches.
  • The bash completion support (in contrib/) learned that cherry-pick takes a few more options than it already knew about.
  • "git help" learned "-g" option to show the list of guides just like list of commands are given with "-a".
  • A triangular "pull from one place, push to another place" workflow is supported better by new remote.pushdefault (overrides the "origin" thing) and branch.*.pushremote (overrides the branch.*.remote) configuration variables.
  • "git status" learned to report that you are in the middle of a revert session, just like it does for a cherry-pick and a bisect session.
  • The handling by "git branch --set-upstream-to" against various forms of erroneous inputs was suboptimal and has been improved.
  • When the interactive access to git-shell is not enabled, it issues a message meant to help the system administrator to enable it. An explicit way has been added to issue custom messages to refuse an access over the network to help the end users who connect to the service expecting an interactive shell.
  • In addition to the case where the user edits the log message with the "e)dit" option of "am -i", replace the "Applying: this patch" message with the final log message contents after applymsg hook munges it.
  • "git status" suggests users to look into using --untracked=no option when it takes too long.
  • "git status" shows a bit more information during a rebase/bisect session.
  • "git fetch" learned to fetch a commit at the tip of an unadvertised ref by specifying a raw object name from the command line when the server side supports this feature.
  • Output from "git log --graph" works better with submodule log output now.
  • "git count-objects -v" learned to report leftover temporary packfiles and other garbage in the object store.
  • A new read-only credential helper (in contrib/) to interact with the .netrc/.authinfo files has been added.
  • "git send-email" can be used with the credential helper system.
  • There was no Porcelain way to say "I no longer am interested in this submodule", once you express your interest in a submodule with "submodule init". "submodule deinit" is the way to do so.
  • "git pull --rebase" learned to pass "-v/-q" options to underlying "git rebase".
  • The new "--follow-tags" option tells "git push" to push relevant annotated tags when pushing branches out.
  • "git merge" and "git pull" can optionally be told to inspect and reject when merging a commit that does not carry a trusted GPG signature.
  • "git mergetool" now feeds files to the "p4merge" backend in the order that matches the p4 convention, where "theirs" is usually shown on the left side, which is the opposite from what other backends expect.
  • "show/log" now honors gpg.program configuration just like other parts of the code that use GnuPG.
  • "git log" that shows the difference between the parent and the child has been optimized somewhat.
  • "git difftool" allows the user to write into the temporary files being shown; if the user makes changes to the working tree at the same time, it now refrains from overwriting the copy in the working tree and leaves the temporary file so that changes can be merged manually.
  • There was no good way to ask "I have a random string that came from outside world. I want to turn it into a 40-hex object name while making sure such an object exists". A new peeling suffix ^{object} can be used for that purpose, together with "rev-parse --verify".
  • Performance, Internal Implementation, etc.:
  • Updates for building under msvc.
  • A handful of issues in the code that traverses the working tree to find untracked and/or ignored files have been fixed, and the general codepath involved in "status -u" and "clean" have been cleaned up and optimized.
  • The stack footprint of some codepaths that access an object from a pack has been shrunk.
  • The logic to coalesce the same lines removed from the parents in the output from "diff -c/--cc" has been updated, but with O(n^2) complexity, so this might turn out to be undesirable.
  • The code to enforce permission bits on files in $GIT_DIR/ for shared repositories has been simplified.
  • A few codepaths know how much data they need to put in the hashtables they use when they start, but still began with small tables and repeatedly grew and rehashed them.
  • The API to walk reflog entries from the latest to older, which was necessary for operations such as "git checkout -", was cumbersome to use correctly and also inefficient.
  • Codepaths that inspect log-message-to-be and decide when to add a new Signed-off-by line in various commands have been consolidated.
  • The pkt-line API, implementation and its callers have been cleaned
  • up to make them more robust.
  • The Cygwin port has a faster-but-lying lstat(2) emulation whose incorrectness does not matter in practice except for a few codepaths, and setting permission bits on directories is a codepath that needs to use a more correct one.
  • "git checkout" had repeated pathspec matches on the same paths, which have been consolidated. Also a bug in "git checkout dir/" that is started from an unmerged index has been fixed.
  • A few bugfixes to "git rerere" working on corner case merge conflicts have been applied.
  • Also contains various documentation updates and code clean-ups.

New in version 1.8.2.3 (May 10th, 2013)

  • "rev-list --stdin" and friends kept bogus pointers into the input buffer around as human readable object names. This was not a huge problem but was exposed by a new change that uses these names in error output.
  • When "git difftool" drove "kdiff3", it mistakenly passed --auto option that was meant while resolving merge conflicts.
  • "git remote add" command did not diagnose extra command line arguments as an error and silently ignored them.
  • Also contains a handful of trivial code clean-ups, documentation updates, updates to the test suite, etc.

New in version 1.8.2.2 (April 29th, 2013)

  • Zsh completion forgot that '%' character used to signal untracked files needs to be escaped with another '%'.
  • A commit object whose author or committer ident are malformed crashed some code that trusted that a name, an email and an timestamp can always be found in it.
  • The new core.commentchar configuration was not applied to a few places.
  • "git pull --rebase" did not pass "-v/-q" options to underlying "git rebase".
  • When receive-pack detects error in the pack header it received in order to decide which of unpack-objects or index-pack to run, it returned without closing the error stream, which led to a hang sideband thread.
  • "git diff --diff-algorithm=algo" was understood by the command line parser, but "git diff --diff-algorithm algo" was not.
  • "git log -S/-G" started paying attention to textconv filter, but there was no way to disable this. Make it honor --no-textconv option.
  • "git merge $(git rev-parse v1.8.2)" behaved quite differently from "git merge v1.8.2", as if v1.8.2 were written as v1.8.2^0 and did not pay much attention to the annotated tag payload. Make the code notice the type of the tag object, in addition to the dwim_ref() based classification the current code uses (i.e. the name appears in refs/tags/) to decide when to special case merging of tags.
  • "git cherry-pick" and "git revert" can take more than one commit on the command line these days, but it was not mentioned on the usage text.
  • Perl scripts like "git-svn" closed (not redirecting to /dev/null) the standard error stream, which is not a very smart thing to do. Later open may return file descriptor #2 for unrelated purpose, and error reporting code may write into them.
  • "git apply --whitespace=fix" was not prepared to see a line getting longer after fixing whitespaces (e.g. tab-in-indent aka Python).
  • "git diff/log --cc" did not work well with options that ignore whitespace changes.
  • Documentation on setting up a http server that requires authentication only on the push but not fetch has been clarified.
  • A few bugfixes to "git rerere" working on corner case merge conflicts have been applied.
  • "git bundle" did not like a bundle created using a commit without any message as its one of the prerequistes.

New in version 1.8.2 (March 21st, 2013)

  • Updates since v1.8.1:
  • UI, Workflows & Features:
  • Initial ports to QNX and z/OS UNIX System Services have started.
  • Output from the tests is coloured using "green is okay, yellow is questionable, red is bad and blue is informative" scheme.
  • Mention of "GIT/Git/git" in the documentation have been updated to be more uniform and consistent. The name of the system and the concept it embodies is "Git"; the command the users type is "git". All-caps "GIT" was merely a way to imitate "Git" typeset in small caps in our ASCII text only documentation and to be avoided.
  • The completion script (in contrib/completion) used to let the default completer to suggest pathnames, which gave too many irrelevant choices (e.g. "git add" would not want to add an unmodified path). It learnt to use a more git-aware logic to enumerate only relevant ones.
  • In bare repositories, "git shortlog" and other commands now read mailmap files from the tip of the history, to help running these tools in server settings.
  • Color specifiers, e.g. "%C(blue)Hello%C(reset)", used in the "--format=" option of "git log" and friends can be disabled when the output is not sent to a terminal by prefixing them with "auto,", e.g. "%C(auto,blue)Hello%C(auto,reset)".
  • Scripts can ask Git that wildcard patterns in pathspecs they give do not have any significance, i.e. take them as literal strings.
  • The patterns in .gitignore and .gitattributes files can have **/, as a pattern that matches 0 or more levels of subdirectory. E.g. "foo/**/bar" matches "bar" in "foo" itself or in a subdirectory of "foo".
  • When giving arguments without "--" disambiguation, object names that come earlier on the command line must not be interpretable as pathspecs and pathspecs that come later on the command line must not be interpretable as object names. This disambiguation rule has been tweaked so that ":/" (no other string before or after) is always interpreted as a pathspec; "git cmd -- :/" is no longer needed, you can just say "git cmd :/".
  • Various "hint" lines Git gives when it asks the user to edit messages in the editor are commented out with '#' by default. The core.commentchar configuration variable can be used to customize this '#' to a different character.
  • "git add -u" and "git add -A" without pathspec issues warning to make users aware that they are only operating on paths inside the subdirectory they are in. Use ":/" (everything from the top) or "." (everything from the $cwd) to disambiguate.
  • "git blame" (and "git diff") learned the "--no-follow" option.
  • "git branch" now rejects some nonsense combinations of command line arguments (e.g. giving more than one branch name to rename) with more case-specific error messages.
  • "git check-ignore" command to help debugging .gitignore files has been added.
  • "git cherry-pick" can be used to replay a root commit to an unborn branch.
  • "git commit" can be told to use --cleanup=whitespace by setting the configuration variable commit.cleanup to 'whitespace'.
  • "git diff" and other Porcelain commands can be told to use a non-standard algorithm by setting diff.algorithm configuration variable.
  • "git fetch --mirror" and fetch that uses other forms of refspec with wildcard used to attempt to update a symbolic ref that match the wildcard on the receiving end, which made little sense (the real ref that is pointed at by the symbolic ref would be updated anyway). Symbolic refs no longer are affected by such a fetch.
  • "git format-patch" now detects more cases in which a whole branch is being exported, and uses the description for the branch, when asked to write a cover letter for the series.
  • "git format-patch" learned "-v $count" option, and prepends a string "v$count-" to the names of its output files, and also automatically sets the subject prefix to "PATCH v$count". This allows patches from rerolled series to be stored under different names and makes it easier to reuse cover letter messages.
  • "git log" and friends can be told with --use-mailmap option to rewrite the names and email addresses of people using the mailmap mechanism.
  • "git log --cc --graph" now shows the combined diff output with the ancestry graph.
  • "git log --grep=" honors i18n.logoutputencoding to look for the pattern after fixing the log message to the specified encoding.
  • "git mergetool" and "git difftool" learned to list the available tool backends in a more consistent manner.
  • "git mergetool" is aware of TortoiseGitMerge now and uses it over TortoiseMerge when available.
  • "git push" now requires "-f" to update a tag, even if it is a fast-forward, as tags are meant to be fixed points.
  • Error messages from "git push" when it stops to prevent remote refs from getting overwritten by mistake have been improved to explain various situations separately.
  • "git push" will stop without doing anything if the new "pre-push" hook exists and exits with a failure.
  • When "git rebase" fails to generate patches to be applied (e.g. due to oom), it failed to detect the failure and instead behaved as if there were nothing to do. A workaround to use a temporary file has been applied, but we probably would want to revisit this later, as it hurts the common case of not failing at all.
  • Input and preconditions to "git reset" has been loosened where appropriate. "git reset $fromtree Makefile" requires $fromtree to be any tree (it used to require it to be a commit), for example. "git reset" (without options or parameters) used to error out when you do not have any commits in your history, but it now gives you an empty index (to match non-existent commit you are not even on).
  • "git status" says what branch is being bisected or rebased when able, not just "bisecting" or "rebasing".
  • "git submodule" started learning a new mode to integrate with the tip of the remote branch (as opposed to integrating with the commit recorded in the superproject's gitlink).
  • "git upload-pack" which implements the service "ls-remote" and "fetch" talk to can be told to hide ref hierarchies the server side internally uses (and that clients have no business learning about) with transfer.hiderefs configuration.
  • Foreign Interface:
  • "git fast-export" has been updated for its use in the context of the remote helper interface.
  • A new remote helper to interact with bzr has been added to contrib/.
  • "git p4" got various bugfixes around its branch handling. It is also made usable with Python 2.4/2.5. In addition, its various portability issues for Cygwin have been addressed.
  • The remote helper to interact with Hg in contrib/ has seen a few fixes.
  • Performance, Internal Implementation, etc.:
  • "git fsck" has been taught to be pickier about entries in tree objects that should not be there, e.g. ".", ".git", and "..".
  • Matching paths with common forms of pathspecs that contain wildcard characters has been optimized further.
  • We stopped paying attention to $GIT_CONFIG environment that points at a single configuration file from any command other than "git config" quite a while ago, but "git clone" internally set, exported, and then unexported the variable during its operation unnecessarily.
  • "git reset" internals has been reworked and should be faster in general. We tried to be careful not to break any behaviour but there could be corner cases, especially when running the command from a conflicted state, that we may have missed.
  • The implementation of "imap-send" has been updated to reuse xml quoting code from http-push codepath, and lost a lot of unused code.
  • There is a simple-minded checker for the test scripts in t/ directory to catch most common mistakes (it is not enabled by default).
  • You can build with USE_WILDMATCH=YesPlease to use a replacement implementation of pattern matching logic used for pathname-like things, e.g. refnames and paths in the repository. This new implementation is not expected change the existing behaviour of Git in this release, except for "git for-each-ref" where you can now say "refs/**/master" and match with both refs/heads/master and refs/remotes/origin/master. We plan to use this new implementation in wider places (e.g. "git ls-files '**/Makefile' may find Makefile at the top-level, and "git log '**/t*.sh'" may find commits that touch a shell script whose name begins with "t" at any level) in future versions of Git, but we are not there yet. By building with USE_WILDMATCH, using the resulting Git daily and reporting when you find breakages, you can help us get closer to that goal.
  • Some reimplementations of Git do not write all the stat info back to the index due to their implementation limitations (e.g. jgit). A configuration option can tell Git to ignore changes to most of the stat fields and only pay attention to mtime and size, which these implementations can reliably update. This can be used to avoid excessive revalidation of contents.
  • Some platforms ship with old version of expat where xmlparse.h needs to be included instead of expat.h; the build procedure has been taught about this.
  • "make clean" on platforms that cannot compute header dependencies on the fly did not work with implementations of "rm" that do not like an empty argument list.
  • Also contains minor documentation updates and code clean-ups.
  • Fixes since v1.8.1:
  • Unless otherwise noted, all the fixes since v1.8.1 in the maintenance
  • track are contained in this release (see release notes to them for
  • details).
  • An element on GIT_CEILING_DIRECTORIES list that does not name the real path to a directory (i.e. a symbolic link) could have caused the GIT_DIR discovery logic to escape the ceiling.
  • When attempting to read the XDG-style $HOME/.config/git/config and finding that $HOME/.config/git is a file, we gave a wrong error message, instead of treating the case as "a custom config file does not exist there" and moving on.
  • The behaviour visible to the end users was confusing, when they attempt to kill a process spawned in the editor that was in turn launched by Git with SIGINT (or SIGQUIT), as Git would catch that signal and die. We ignore these signals now. (merge 0398fc34 pf/editor-ignore-sigint later to maint).
  • A child process that was killed by a signal (e.g. SIGINT) was reported in an inconsistent way depending on how the process was spawned by us, with or without a shell in between.
  • After failing to create a temporary file using mkstemp(), failing pathname was not reported correctly on some platforms.
  • We used to stuff "user@" and then append what we read from /etc/mailname to come up with a default e-mail ident, but a bug lost the "user@" part.
  • The attribute mechanism didn't allow limiting attributes to be applied to only a single directory itself with "path/" like the exclude mechanism does. The initial implementation of this that was merged to 'maint' and 1.8.1.2 was with a severe performance degradations and needs to merge a fix-up topic.
  • The smart HTTP clients forgot to verify the content-type that comes back from the server side to make sure that the request is being handled properly.
  • "git am" did not parse datestamp correctly from Hg generated patch, when it is run in a locale outside C (or en).
  • "git apply" misbehaved when fixing whitespace breakages by removing excess trailing blank lines.
  • "git apply --summary" has been taught to make sure the similarity value shown in its output is sensible, even when the input had a bogus value.
  • A tar archive created by "git archive" recorded a directory in a way that made NetBSD's implementation of "tar" sometimes unhappy.
  • "git archive" did not record uncompressed size in the header when streaming a zip archive, which confused some implementations of unzip.
  • "git archive" did not parse configuration values in tar.* namespace correctly. (merge b3873c3 jk/config-parsing-cleanup later to maint).
  • Attempt to "branch --edit-description" an existing branch, while being on a detached HEAD, errored out.
  • "git clean" showed what it was going to do, but sometimes end up finding that it was not allowed to do so, which resulted in a confusing output (e.g. after saying that it will remove an untracked directory, it found an embedded git repository there which it is not allowed to remove). It now performs the actions and then reports the outcome more faithfully.
  • When "git clone --separate-git-dir=$over_there" is interrupted, it failed to remove the real location of the $GIT_DIR it created. This was most visible when interrupting a submodule update.
  • "git cvsimport" mishandled timestamps at DST boundary.
  • We used to have an arbitrary 32 limit for combined diff input, resulting in incorrect number of leading colons shown when showing the "--raw --cc" output.
  • "git fetch --depth" was broken in at least three ways. The resulting history was deeper than specified by one commit, it was unclear how to wipe the shallowness of the repository with the command, and documentation was misleading. (merge cfb70e1 nd/fetch-depth-is-broken later to maint).
  • "git log --all -p" that walked refs/notes/textconv/ ref can later try to use the textconv data incorrectly after it gets freed.
  • We forgot to close the file descriptor reading from "gpg" output, killing "git log --show-signature" on a long history.
  • The way "git svn" asked for password using SSH_ASKPASS and GIT_ASKPASS was not in line with the rest of the system.
  • The --graph code fell into infinite loop when asked to do what the code did not expect.
  • http transport was wrong to ask for the username when the authentication is done by certificate identity.
  • "git pack-refs" that ran in parallel to another process that created new refs had a nasty race.
  • Rebasing the history of superproject with change in the submodule has been broken since v1.7.12.
  • After "git add -N" and then writing a tree object out of the index, the cache-tree data structure got corrupted.
  • "git clone" used to allow --bare and --separate-git-dir=$there options at the same time, which was nonsensical.
  • "git rebase --preserve-merges" lost empty merges in recent versions of Git.
  • "git merge --no-edit" computed who were involved in the work done on the side branch, even though that information is to be discarded without getting seen in the editor.
  • "git merge" started calling prepare-commit-msg hook like "git commit" does some time ago, but forgot to pay attention to the exit status of the hook.
  • A failure to push due to non-ff while on an unborn branch dereferenced a NULL pointer when showing an error message.
  • When users spell "cc:" in lowercase in the fake "header" in the trailer part, "git send-email" failed to pick up the addresses from there. As e-mail headers field names are case insensitive, this script should follow suit and treat "cc:" and "Cc:" the same way.
  • Output from "git status --ignored" showed an unexpected interaction with "--untracked".
  • "gitweb", when sorting by age to show repositories with new activities first, used to sort repositories with absolutely nothing in it early, which was not very useful.
  • "gitweb"'s code to sanitize control characters before passing it to "highlight" filter lost known-to-be-safe control characters by mistake.
  • "gitweb" pages served over HTTPS, when configured to show picon or gravatar, referred to these external resources to be fetched via HTTP, resulting in mixed contents warning in browsers.
  • When a line to be wrapped has a solid run of non space characters whose length exactly is the wrap width, "git shortlog -w" failed to add a newline after such a line.
  • Command line completion leaked an unnecessary error message while looking for possible matches with paths in .
  • Command line completion for "tcsh" emitted an unwanted space after completing a single directory name.
  • Command line completion code was inadvertently made incompatible with older versions of bash by using a newer array notation.
  • "git push" was taught to refuse updating the branch that is currently checked out long time ago, but the user manual was left stale. (merge 50995ed wk/man-deny-current-branch-is-default-these-days later to maint).
  • Some shells do not behave correctly when IFS is unset; work it around by explicitly setting it to the default value.
  • Some scripted programs written in Python did not get updated when PYTHON_PATH changed. (cherry-pick 96a4647fca54031974cd6ad1 later to maint).
  • When autoconf is used, any build on a different commit always ran "config.status --recheck" even when unnecessary.
  • A fix was added to the build procedure to work around buggy versions of ccache broke the auto-generation of dependencies, which unfortunately is still relevant because some people use ancient distros.
  • The autoconf subsystem passed --mandir down to generated config.mak.autogen but forgot to do the same for --htmldir. (merge 55d9bf0 ct/autoconf-htmldir later to maint).
  • A change made on v1.8.1.x maintenance track had a nasty regression to break the build when autoconf is used. (merge 7f1b697 jn/less-reconfigure later to maint).
  • We have been carrying a translated and long-unmaintained copy of an old version of the tutorial; removed.
  • t0050 had tests expecting failures from a bug that was fixed some time ago.
  • t4014, t9502 and t0200 tests had various portability issues that broke on OpenBSD.
  • t9020 and t3600 tests had various portability issues.
  • t9200 runs "cvs init" on a directory that already exists, but a platform can configure this fail for the current user (e.g. you need to be in the cvsadmin group on NetBSD 6.0).
  • t9020 and t9810 had a few non-portable shell script construct.
  • Scripts to test bash completion was inherently flaky as it was affected by whatever random things the user may have on $PATH.
  • An element on GIT_CEILING_DIRECTORIES could be a "logical" pathname that uses a symbolic link to point at somewhere else (e.g. /home/me that points at /net/host/export/home/me, and the latter directory is automounted). Earlier when Git saw such a pathname e.g. /home/me on this environment variable, the "ceiling" mechanism did not take effect. With this release (the fix has also been merged to the v1.8.1.x maintenance series), elements on GIT_CEILING_DIRECTORIES are by default checked for such aliasing coming from symbolic links. As this needs to actually resolve symbolic links for each element on the GIT_CEILING_DIRECTORIES, you can disable this mechanism for some elements by listing them after an empty element on the GIT_CEILING_DIRECTORIES. e.g. Setting /home/me::/home/him to GIT_CEILING_DIRECTORIES makes Git resolve symbolic links in /home/me when checking if the current directory is under /home/me, but does not do so for /home/him. (merge 7ec30aa mh/maint-ceil-absolute later to maint).

New in version 1.8.2 RC0 (February 18th, 2013)

  • UI, Workflows & Features:
  • Initial ports to QNX and z/OS UNIX System Services have started.
  • Output from the tests is coloured using "green is okay, yellow is questionable, red is bad and blue is informative" scheme.
  • Mention of "GIT/Git/git" in the documentation have been updated to be more uniform and consistent. The name of the system and the concept it embodies is "Git"; the command the users type is "git". All-caps "GIT" was merely a way to imitate "Git" typeset in small caps in our ASCII text only documentation and to be avoided.
  • The completion script (in contrib/completion) used to let the default completer to suggest pathnames, which gave too many irrelevant choices (e.g. "git add" would not want to add an unmodified path). It learnt to use a more git-aware logic to enumerate only relevant ones.
  • In bare repositories, "git shortlog" and other commands now read mailmap files from the tip of the history, to help running these tools in server settings.
  • Color specifiers, e.g. "%C(blue)Hello%C(reset)", used in the "--format=" option of "git log" and friends can be disabled when the output is not sent to a terminal by prefixing them with "auto,", e.g. "%C(auto,blue)Hello%C(auto,reset)".
  • Scripts can ask Git that wildcard patterns in pathspecs they give do not have any significance, i.e. take them as literal strings.
  • The patterns in .gitignore and .gitattributes files can have **/, as a pattern that matches 0 or more levels of subdirectory. E.g. "foo/**/bar" matches "bar" in "foo" itself or in a subdirectory of "foo".
  • When giving arguments without "--" disambiguation, object names that come earlier on the command line must not be interpretable as pathspecs and pathspecs that come later on the command line must not be interpretable as object names. This disambiguation rule has been tweaked so that ":/" (no other string before or after) is always interpreted as a pathspec; "git cmd -- :/" is no longer needed, you can just say "git cmd :/".
  • Various "hint" lines Git gives when it asks the user to edit messages in the editor are commented out with '#' by default. The core.commentchar configuration variable can be used to customize this '#' to a different character.
  • "git add -u" and "git add -A" without pathspec issues warning to make users aware that they are only operating on paths inside the subdirectory they are in. Use ":/" (everything from the top) or "." (everything from the $cwd) to disambiguate.
  • "git blame" (and "git diff") learned the "--no-follow" option.
  • "git branch" now rejects some nonsense combinations of command line arguments (e.g. giving more than one branch name to rename) with more case-specific error messages.
  • "git check-ignore" command to help debugging .gitignore files has been added.
  • "git cherry-pick" can be used to replay a root commit to an unborn branch.
  • "git commit" can be told to use --cleanup=whitespace by setting the configuration variable commit.cleanup to 'whitespace'.
  • "git diff" and other Porcelain commands can be told to use a non-standard algorithm by setting diff.algorithm configuration variable.
  • "git fetch --mirror" and fetch that uses other forms of refspec with wildcard used to attempt to update a symbolic ref that match the wildcard on the receiving end, which made little sense (the real ref that is pointed at by the symbolic ref would be updated anyway). Symbolic refs no longer are affected by such a fetch.
  • "git format-patch" now detects more cases in which a whole branch is being exported, and uses the description for the branch, when asked to write a cover letter for the series.
  • "git format-patch" learned "-v $count" option, and prepends a string "v$count-" to the names of its output files, and also automatically sets the subject prefix to "PATCH v$count". This allows patches from rerolled series to be stored under different names and makes it easier to reuse cover letter messsages.
  • "git log" and friends can be told with --use-mailmap option to rewrite the names and email addresses of people using the mailmap mechanism.
  • "git log --cc --graph" now shows the combined diff output with the ancestry graph.
  • "git log --grep=" honors i18n.logoutputencoding to look for the pattern after fixing the log message to the specified encoding.
  • "git mergetool" and "git difftool" learned to list the available tool backends in a more consistent manner.
  • "git mergetool" is aware of TortoiseGitMerge now and uses it over TortoiseMerge when available.
  • "git push" now requires "-f" to update a tag, even if it is a fast-forward, as tags are meant to be fixed points.
  • Error messages from "git push" when it stops to prevent remote refs from getting overwritten by mistake have been improved to explain various situations separately.
  • "git push" will stop without doing anything if the new "pre-push" hook exists and exits with a failure.
  • When "git rebase" fails to generate patches to be applied (e.g. due to oom), it failed to detect the failure and instead behaved as if there were nothing to do. A workaround to use a temporary file has been applied, but we probably would want to revisit this later, as it hurts the common case of not failing at all.
  • Input and preconditions to "git reset" has been loosened where appropriate. "git reset $fromtree Makefile" requires $fromtree to be any tree (it used to require it to be a commit), for example. "git reset" (without options or parameters) used to error out when you do not have any commits in your history, but it now gives you an empty index (to match non-existent commit you are not even on).
  • "git status" says what branch is being bisected or rebased when able, not just "bisecting" or "rebasing".
  • "git submodule" started learning a new mode to integrate with the tip of the remote branch (as opposed to integrating with the commit recorded in the superproject's gitlink).
  • "git upload-pack" which implements the service "ls-remote" and "fetch" talk to can be told to hide ref hierarchies the server side internally uses (and that clients have no business learning about) with transfer.hiderefs configuration.
  • Foreign Interface:
  • "git fast-export" has been updated for its use in the context of the remote helper interface.
  • A new remote helper to interact with bzr has been added to contrib/.
  • "git p4" got various bugfixes around its branch handling. It is also made usable with Python 2.4/2.5. In addition, its various portability issues for Cygwin have been addressed.
  • The remote helper to interact with Hg in contrib/ has seen a few fixes.
  • Performance, Internal Implementation, etc.:
  • "git fsck" has been taught to be pickier about entries in tree objects that should not be there, e.g. ".", ".git", and "..".
  • Matching paths with common forms of pathspecs that contain wildcard characters has been optimized further.
  • We stopped paying attention to $GIT_CONFIG environment that points at a single configuration file from any command other than "git config" quite a while ago, but "git clone" internally set, exported, and then unexported the variable during its operation unnecessarily.
  • "git reset" internals has been reworked and should be faster in general. We tried to be careful not to break any behaviour but there could be corner cases, especially when running the command from a conflicted state, that we may have missed.
  • The implementation of "imap-send" has been updated to reuse xml quoting code from http-push codepath, and lost a lot of unused code.
  • There is a simple-minded checker for the test scripts in t/ directory to catch most common mistakes (it is not enabled by default).
  • You can build with USE_WILDMATCH=YesPlease to use a replacement implementation of pattern matching logic used for pathname-like things, e.g. refnames and paths in the repository. This new implementation is not expected change the existing behaviour of Git in this release, except for "git for-each-ref" where you can now say "refs/**/master" and match with both refs/heads/master and refs/remotes/origin/master. We plan to use this new implementation in wider places (e.g. "git ls-files '**/Makefile' may find Makefile at the top-level, and "git log '**/t*.sh'" may find commits that touch a shell script whose name begins with "t" at any level) in future versions of Git, but we are not there yet. By building with USE_WILDMATCH, using the resulting Git daily and reporting when you find breakages, you can help us get closer to that goal.
  • Some reimplementations of Git do not write all the stat info back to the index due to their implementation limitations (e.g. jgit). A configuration option can tell Git to ignore changes to most of the stat fields and only pay attention to mtime and size, which these implementations can reliably update. This can be used to avoid excessive revalidation of contents.
  • Some platforms ship with old version of expat where xmlparse.h needs to be included instead of expat.h; the build procedure has been taught about this.
  • "make clean" on platforms that cannot compute header dependencies on the fly did not work with implementations of "rm" that do not like an empty argument list.
  • Also contains minor documentation updates and code clean-ups.

New in version 1.8.1.3 (February 9th, 2013)

  • The attribute mechanism didn't allow limiting attributes to be applied to only a single directory itself with "path/" like the exclude mechanism does. The fix for this in 1.8.1.2 had performance degradations.
  • Command line completion code was inadvertently made incompatible with older versions of bash by using a newer array notation.
  • Scripts to test bash completion was inherently flaky as it was affected by whatever random things the user may have on $PATH.
  • A fix was added to the build procedure to work around buggy versions of ccache broke the auto-generation of dependencies, which unfortunately is still relevant because some people use ancient distros.
  • We used to stuff "user@" and then append what we read from /etc/mailname to come up with a default e-mail ident, but a bug lost the "user@" part.
  • "git am" did not parse datestamp correctly from Hg generated patch, when it is run in a locale outside C (or en).
  • Attempt to "branch --edit-description" an existing branch, while being on a detached HEAD, errored out.
  • "git cherry-pick" did not replay a root commit to an unborn branch.
  • We forgot to close the file descriptor reading from "gpg" output, killing "git log --show-signature" on a long history.
  • "git rebase --preserve-merges" lost empty merges in recent versions of Git.
  • Rebasing the history of superproject with change in the submodule has been broken since v1.7.12.
  • A failure to push due to non-ff while on an unborn branch dereferenced a NULL pointer when showing an error message.
  • Also contains various documentation fixes.

New in version 1.8.1.2 (January 29th, 2013)

  • An element on GIT_CEILING_DIRECTORIES list that does not name the real path to a directory (i.e. a symbolic link) could have caused the GIT_DIR discovery logic to escape the ceiling.
  • Command line completion for "tcsh" emitted an unwanted space after completing a single directory name.
  • Command line completion leaked an unnecessary error message while looking for possible matches with paths in .
  • "git archive" did not record uncompressed size in the header when streaming a zip archive, which confused some implementations of unzip.
  • When users spelled "cc:" in lowercase in the fake "header" in the trailer part, "git send-email" failed to pick up the addresses from there. As e-mail headers field names are case insensitive, this script should follow suit and treat "cc:" and "Cc:" the same way.
  • Also contains various documentation fixes.

New in version 1.8.1 (January 2nd, 2013)

  • Updates since v1.8.0:
  • UI, Workflows & Features:
  • Command-line completion scripts for tcsh and zsh have been added.
  • "git-prompt" scriptlet (in contrib/completion) can be told to paint pieces of the hints in the prompt string in colors.ubuntu1210installationSome documentation pages that used to ship only in the plain text format are now formatted in HTML as well.
  • We used to have a workaround for a bug in ancient "less" that causes it to exit without any output when the terminal is resized. The bug has been fixed in "less" version 406 (June 2007), and the workaround has been removed in this release.
  • When "git checkout" checks out a branch, it tells the user how far behind (or ahead) the new branch is relative to the remote tracking branch it builds upon. The message now also advises how to sync them up by pushing or pulling. This can be disabled with the advice.statusHints configuration variable.
  • "git config --get" used to diagnose presence of multiple definitions of the same variable in the same configuration file as an error, but it now applies the "last one wins" rule used by the internal configuration logic. Strictly speaking, this may be an API regression but it is expected that nobody will notice it in practice.
  • A new configuration variable "diff.context" can be used to give the default number of context lines in the patch output, to override the hardcoded default of 3 lines.
  • "git format-patch" learned the "--notes=" option to give notes for the commit after the three-dash lines in its output.
  • "git log -p -S" now looks for the after applying the textconv filter (if defined); earlier it inspected the contents of the blobs without filtering.
  • "git log --grep=" learned to honor the "grep.patterntype" configuration set to "perl".
  • "git replace -d " now interprets as an extended SHA-1 (e.g. HEAD~4 is allowed), instead of only accepting full hex object name.
  • "git rm $submodule" used to punt on removing a submodule working tree to avoid losing the repository embedded in it. Because recent git uses a mechanism to separate the submodule repository from the submodule working tree, "git rm" learned to detect this case and removes the submodule working tree when it is safe to do so.
  • "git send-email" used to prompt for the sender address, even when the committer identity is well specified (e.g. via user.name and user.email configuration variables). The command no longer gives this prompt when not necessary.
  • "git send-email" did not allow non-address garbage strings to appear after addresses on Cc: lines in the patch files (and when told to pick them up to find more recipients), e.g. Cc: Stable Kernel # for v3.2 and up The command now strips " # for v3.2 and up" part before adding the remainder of this line to the list of recipients.
  • "git submodule add" learned to add a new submodule at the same path as the path where an unrelated submodule was bound to in an existing revision via the "--name" option.
  • "git submodule sync" learned the "--recursive" option.
  • "diff.submodule" configuration variable can be used to give custom default value to the "git diff --submodule" option.
  • "git symbolic-ref" learned the "-d $symref" option to delete the named symbolic ref, which is more intuitive way to spell it than "update-ref -d --no-deref $symref".
  • Foreign Interface:
  • "git cvsimport" can be told to record timezones (other than GMT) per-author via its author info file.
  • The remote helper interface to interact with subversion repositories (one of the GSoC 2012 projects) has been merged.
  • A new remote-helper interface for Mercurial has been added to contrib/remote-helpers.
  • The documentation for git(1) was pointing at a page at an external site for the list of authors that no longer existed. The link has been updated to point at an alternative site. Performance, Internal Implementation, etc.
  • Compilation on Cygwin with newer header files are supported now.
  • A couple of low-level implementation updates on MinGW.
  • The logic to generate the initial advertisement from "upload-pack" (i.e. what is invoked by "git fetch" on the other side of the connection) to list what refs are available in the repository has been optimized.
  • The logic to find set of attributes that match a given path has been optimized.
  • Use preloadindex in "git diff-index" and "git update-index", which has a nice speedup on systems with slow stat calls (and even on Linux). Also contains minor documentation updates and code clean-ups.
  • Fixes since v1.8.0:
  • Unless otherwise noted, all the fixes since v1.8.0 in the maintenance track are contained in this release (see release notes to them for details).
  • The configuration parser had an unnecessary hardcoded limit on variable names that was not checked consistently.
  • The "say" function in the test scaffolding incorrectly allowed "echo" to interpret "\a" as if it were a C-string asking for a BEL output.
  • "git mergetool" feeds /dev/null as a common ancestor when dealing with an add/add conflict, but p4merge backend cannot handle it. Work it around by passing a temporary empty file.
  • "git log -F -E --grep=''" failed to use the given pattern as extended regular expression, and instead looked for the string literally.
  • "git grep -e pattern " asked the attribute system to read ":.gitattributes" file in the working tree, which was nonsense.
  • A symbolic ref refs/heads/SYM was not correctly removed with "git branch -d SYM"; the command removed the ref pointed by SYM instead.
  • Update "remote tracking branch" in the documentation to "remote-tracking branch".
  • "git pull --rebase" run while the HEAD is detached tried to find the upstream branch of the detached HEAD (which by definition does not exist) and emitted unnecessary error messages.
  • The refs/replace hierarchy was not mentioned in the repository-layout docs.
  • Various rfc2047 quoting issues around a non-ASCII name on the From: line in the output from format-patch have been corrected.
  • Sometimes curl_multi_timeout() function suggested a wrong timeout value when there is no file descriptor to wait on and the http transport ended up sleeping for minutes in select(2) system call. A workaround has been added for this.
  • For a fetch refspec (or the result of applying wildcard on one), we always want the RHS to map to something inside "refs/" hierarchy, but the logic to check it was not exactly right. (merge 5c08c1f jc/maint-fetch-tighten-refname-check later to maint).
  • "git diff -G" did not honor textconv filter when looking for changes.
  • Some HTTP servers ask for auth only during the actual packing phase (not in ls-remote phase); this is not really a recommended configuration, but the clients used to fail to authenticate with such servers. (merge 2e736fd jk/maint-http-half-auth-fetch later to maint).
  • "git p4" used to try expanding malformed "$keyword$" that spans across multiple lines.
  • Syntax highlighting in "gitweb" was not quite working.
  • RSS feed from "gitweb" had a xss hole in its title output.
  • "git config --path $key" segfaulted on "[section] key" (a boolean "true" spelled without "=", not "[section] key = true").
  • "git checkout -b foo" while on an unborn branch did not say "Switched to a new branch 'foo'" like other cases.
  • Various codepaths have workaround for a common misconfiguration to spell "UTF-8" as "utf8", but it was not used uniformly. Most notably, mailinfo (which is used by "git am") lacked this support.
  • We failed to mention a file without any content change but whose permission bit was modified, or (worse yet) a new file without any content in the "git diff --stat" output.
  • When "--stat-count" hides a diffstat for binary contents, the total number of added and removed lines at the bottom was computed incorrectly.
  • When "--stat-count" hides a diffstat for unmerged paths, the total number of affected files at the bottom of the "diff --stat" output was computed incorrectly.
  • "diff --shortstat" miscounted the total number of affected files when there were unmerged paths.
  • "update-ref -d --deref SYM" to delete a ref through a symbolic ref that points to it did not remove it correctly.

New in version 1.8.0.1 (November 26th, 2012)

  • The configuration parser had an unnecessary hardcoded limit on variable names that was not checked consistently.
  • The "say" function in the test scaffolding incorrectly allowed "echo" to interpret "\a" as if it were a C-string asking for a
  • BEL output.
  • "git mergetool" feeds /dev/null as a common ancestor when dealing with an add/add conflict, but p4merge backend cannot handle it. Work it around by passing a temporary empty file.
  • "git log -F -E --grep=''" failed to use the given pattern as extended regular expression, and instead looked for the string literally.
  • "git grep -e pattern " asked the attribute system to read
  • ":.gitattributes" file in the working tree, which was nonsense.
  • A symbolic ref refs/heads/SYM was not correctly removed with "git branch -d SYM"; the command removed the ref pointed by SYM instead.
  • Earlier we fixed documentation to hyphenate "remote-tracking branch" to clarify that these are not a remote entity, but unhyphenated spelling snuck in to a few places since then.
  • "git pull --rebase" run while the HEAD is detached tried to find the upstream branch of the detached HEAD (which by definition does not exist) and emitted unnecessary error messages.
  • The refs/replace hierarchy was not mentioned in the repository-layout docs.
  • Sometimes curl_multi_timeout() function suggested a wrong timeout value when there is no file descriptors to wait on and the http transport ended up sleeping for minutes in select(2) system call.
  • A workaround has been added for this.
  • Various rfc2047 quoting issues around a non-ASCII name on the
  • From: line in the output from format-patch have been corrected.
  • "git diff -G" did not honor textconv filter when looking for changes.
  • Bash completion script (in contrib/) did not correctly complete a lazy "git checkout $name_of_remote_tracking_branch_that_is_unique"
  • command line.
  • RSS feed from "gitweb" had a xss hole in its title output.
  • "git config --path $key" segfaulted on "[section] key" (a boolean
  • "true" spelled without "=", not "[section] key = true").
  • "git checkout -b foo" while on an unborn branch did not say
  • "Switched to a new branch 'foo'" like other cases.