git 2.13.3

Git is a distributed version control system, originally designed for Linux kernel development and large projects with non-linear workflows. It's comprised of individual tools, reuses ssh and rsync protocols, emphasises speed and data integrity, and keeps every checkout as full-fledged repository, and cryptographically authenticates source history. Various graphical frontends, IDE integrations and web services (GitHub) exist; with its git-fast-export format meanwhile serves interoperability with bzr, hg, fossil, svn.

Tags c git scm vcs dvcs
License GNU LGPL
State stable

Recent Releases

2.13.313 Jul 2017 11:05 minor feature: The "collision detecting" SHA-1 implementation shipped with 2.13.2, was still broken on some platforms. Update to the upstream code, again to take their. The 'diff-highlight' program (in contrib/) has been restructured, for easier reuse by an external project 'diff-so-fancy'. "git mergetool" learned to work around a wrapper MacOS X adds, around underlying meld. An example in documentation that does not work in multi worktree, configuration has been corrected. The pretty-format specifiers like ' h', ' t', etc. had an, optimization that no longer works correctly. In preparation/hope, of getting it correctly implemented, first discard the optimization, that is broken. The code to pick up and execute command alias definition from the, configuration used to switch to the top of the working tree and, then come back when the expanded alias was executed, which was, unnecessarilyl complex. Attempt to simplify the logic by using the, early-config mechanism that does not chdir around. "git add -p" were updated in 2.12 timeframe to cope with custom, core.commentchar but the implementation was gy and a, metacharacter like and did not work. a recent regression to "git rebase -i" and add tests that would, have caught it and others. An unaligned 32-bit access in pack-bitmap code ahs been corrected. Tighten error checks for invalid "git apply" input. The split index code did not honor core.sharedrepository setting, correctly. The Makefile rule in contrib/subtree for building documentation, learned to honour USE_ASCIIDOCTOR just like the main documentation, set does. A few tests that tried to verify the contents of push certificates, did not use 'git rev-parse' to formulate the line to look for in, the certificate correctly. After "git branch --move" of the currently checked out branch, the, code to walk the reflog of HEAD via "log -g" and friends, incorrectly stopped at the reflog entry that records the renaming, of the branch. The rewrite of "git branch --list" usi
2.13.226 Jun 2017 08:25 minor feature: The "collision detecting" SHA-1 implementation shipped with 2.13.1, was still broken on some platforms. Update to the upstream code, again to take their. "git checkout --recurse-submodules" did not quite work with a, submodule that itself has submodules. Introduce the () macro to improve die(":."). The "run-command" API implementation has been made more robust, against dead-locking in a threaded environment. A recent update to started skipping all the, tests in the script when a web server testing is disabled or, unavailable, not just the ones that require a web server. Non HTTP, tests have been salvaged to always run in this script. "git clean -d" used to clean directories that has ignored files, even though the command should not lose ignored ones without "-x". "git status --ignored" did not list ignored and untracked files, without "-uall". These have been corrected. The timestamp of the index file is now taken after the file is,, to help Windows, on which a stale timestamp is reported by, fstat() on a file that is opened for writing and data was written, but not yet. "git pull --rebase --autostash" didn't auto-stash when the local history, fast-forwards to the upstream. "git describe --contains" penalized light-weight tags so much that, they were almost never considered. Instead, give them about the, same chance to be considered as an annotated tag that is the same, age as the underlying commit would. The result from "git diff" that compares two blobs, e.g. "git diff, commit1: path commit2: path", used to be shown with the full, object name as given on the command line, but it is more natural to, use the path in the output and use it to look up.gitattributes. A flaky test has been corrected. Help contributors that visit us at GitHub. "git stash push. " did not work from a subdirectory at all. for a topic in v2.13.
2.13.106 Jun 2017 14:45 minor feature: The Web interface to gmane news archive is long gone, even though, the articles are still accessible via NTTP. Replace the links with, ones to Because their message identification is, based on the actual message-id, it is likely that it will be easier, to migrate away from it if/when necessary. Update tests to pass under GETTEXT_POISON (a mechanism to ensure, that output strings that should not be translated are not, translated by mistake), and tell TravisCI to run them. Setting "log.decorate=false" in the configuration file did not take, effect in v2.13, which has been corrected. An earlier update to test 7400 needed to be skipped on CYGWIN. Git sometimes gives an advice in a rhetorical question that does, not require an answer, which can confuse new users and non native, speakers. Attempt to rephrase them. "git read-tree -m" (no tree-ish) gave a nonsense suggestion "use, --empty if you want to clear the index". With "-m", such a request, will still fail anyway, as you'd need to name at least one tree-ish, to be merged. The codepath in "git am" that is used when running "git rebase", leaked memory held for the log message of the commits being rebased. "pack-objects" can stream a slice of an existing packfile out when, the pack bitmap can tell that the reachable objects are all needed, in the output, without inspecting individual objects. This, strategy however would not work well when "--local" and other, options are in use, and need to be disabled. Clarify documentation for include.path and includeIf...path, configuration variables. Tag objects, which are not reachable from any ref, that point at, missing objects were mishandled by "git gc" and friends (they, should silently be ignored instead), A few http:// links that are redirected to https:// in the, documentation have been updated to https:// links. Make sure our tests would pass when the sources are checked out, with "platform native" line ending convention by default on, Windows
2.13.011 May 2017 01:25 minor feature: Use of an empty string as a pathspec element that is used for, 'everything matches' is still warned and Git asks users to use a, more explicit '.' for that instead. The hope is that existing, users will not mind this change, and eventually the warning can be, turned into a hard error, upgrading the deprecation into removal of, this (mis)feature. That is not scheduled to happen in the upcoming, release (yet). The historical argument order "git merge. HEAD....", has been deprecated for quite some time, and is now removed. The default location " /.git-credential-cache/socket" for the, socket used to communicate with the credential-cache daemon has, been moved to " /.cache/git/credential/socket". Git now avoids blindly falling back to ".git" when the setup, sequence said we are _not_ in Git repository. A corner case that, happens to work right now may be broken by a call to die(""). We've tried hard to locate such cases and them, but there, might still be cases that need to be addressed--reports are, greatly appreciated. "git describe" and "git name-rev" have been taught to take more, than one refname patterns to restrict the set of refs to base their, naming output on, and also learned to take negative patterns to, name refs not to be used for naming via their "--exclude" option. Deletion of a branch "foo/bar" could remove.git/refs/heads/foo, once there no longer is any other branch whose name begins with, "foo/", but we didn't do so so far. Now we do. When "git merge" detects a path that is renamed in one history, while the other history deleted (or modified) it, it now reports, both paths to help the user understand what is going on in the two, histories being merged. The. part in "http.... " configuration variable, can now be spelled with '*' that serves as wildcard. E.g. "http.https://*" can be used to specify the, proxy used for,, etc, i.e. any host in the domain. "git tag" did not
2.12.225 Mar 2017 22:05 minor feature: git status --porcelain" is supposed to give a stable output, but a, few strings were left as translatable by mistake. "Dumb http" transport used to misparse a nonsense http-alternates, response, which has been. "git diff --quiet" relies on the size field in diff_filespec to be, correctly populated, but diff_populate_filespec() helper function, made an incorrect short-cut when asked only to populate the size, field for paths that need to go through convert_to_git() (e.g. CRLF, conversion). There is no need for Python only to give a few messages to the, standard error stream, but we somehow did. A leak in a codepath to read from a packed object in (rare) cases, has been plugged. "git upload-pack", which is a counter-part of "git fetch", did not, report a request for a ref that was not advertised as invalid. This is generally not a problem (because "git fetch" will stop, before making such a request), but is the right thing to do. A "gc.log" file left by a backgrounded "gc --auto" disables further, automatic gc; it has been taught to run at least once a day by ignoring a stale "gc.log" file that is too old. "git remote rm X", when a branch has remote X configured as the, value of its branch.*.remote, tried to remove branch.*.remote and, branch.*.merge and failed if either is unset. A caller of tempfile API that uses stdio interface to write to, files may ignore errors while writing, which is detected when, tempfile is (with a call to ferror()). By that time, the, original errno that may have told us what went wrong is likely to, be long gone and was overwritten by an irrelevant value. _tempfile() now resets errno to EIO to make errno at least, predictable. "git show-branch" expected there were only very short branch names, in the repository and used a -length buffer to hold them, without checking for overflow. The code that parses header fields in the commit object has been, updated for (micro)performance and code hygiene. A test that creates a confusing bra
2.12.121 Mar 2017 19:05 minor feature: Reduce authentication round-trip over HTTP when the server supports, just a single authentication method. This also improves the, behaviour when Git is misconfigured to enable http.emptyAuth, against a server that does not authenticate without a username, (i.e. not using Kerberos etc. which makes http.emptyAuth, pointless). Windows port wants to use OpenSSL's implementation of SHA-1, routines, so let them. Add 32-bit Linux variant to the set of platforms to be tested with, Travis CI. When a redirected http transport gets an error during the, redirected request, we ignored the error we got from the server, and ended up giving a not-so-useful error message. The patch subcommand of "git add -i" was meant to have paths, selection prompt just like other subcommand, unlike "git add -p", directly jumps to hunk selection. Recently, this was broken and, "add -i" lost the paths selection dialog, but it now has been. Git v2.12 was shipped with an embarrassing breakage where various, operations that verify paths given from the user stopped dying when, seeing an, and instead later triggering segfault. The code to parse "git log -L..." command line was gy when there, are many ranges specified with -L; overrun of the allocated buffer, has been. The command-line parsing of "git log -L" copied internal data, structures using incorrect size on ILP32 systems.
2.12.025 Feb 2017 23:05 minor feature: Use of an empty string that is used for 'everything matches' is, still warned and Git asks users to use a more explicit '.' for that, instead. The hope is that existing users will not mind this, change, and eventually the warning can be turned into a hard error, upgrading the deprecation into removal of this (mis)feature. That, is not scheduled to happen in the upcoming release (yet). The historical argument order "git merge. HEAD....", has been deprecated for quite some time, and will be removed in a, future release. An ancient script "git relink" has been removed. Various updates to "git p4". "git p4" didn't interact with the internal of.git directory, correctly in the modern "git-worktree"-enabled world. "git branch --list" and friends learned "--ignore-case" option to, optionally sort branches and tags case insensitively. In addition to (subject), (body), "log --pretty=format:.", learned a new placeholder (trailers). "git rebase" learned "--quit" option, which allows a user to, remove the metadata left by an earlier "git rebase" that was, manually aborted without using "git rebase --abort". "git clone --reference there --recurse-submodules super" has been, taught to guess repositories usable as references for submodules of, super that are embedded in there while making a clone of the, superproject borrow objects from there; extend the mechanism to, also allow submodules of these submodules to borrow repositories, embedded in these clones of the submodules embedded in the clone of, the superproject. Porcelain scripts written in Perl are getting internationalized. "git merge --continue" has been added as a synonym to "git commit", to conclude a merge that has stopped due to conflicts. Finer-grained control of what protocols are allowed for transports, during clone/fetch/push have been enabled via a new configuration, mechanism. "git shortlog" learned "--committer" option to group commits by, committer, instead of author. GitLFS integration wi
2.11.104 Feb 2017 05:05 minor feature: The default Travis-CI configuration specifies newer P4 and GitLFS. The character width table has been updated to match Unicode 9.0, Update the isatty() emulation for Windows by updating the previous, hack that depended on internals of (older) MSVC runtime. "git rev-parse --symbolic" failed with a more recent notation like, "HEAD -1" and "HEAD !". An empty directory in a working tree that can simply be nuked used, to interfere while merging or cherry-picking a change to create a, submodule directory there, which has been. The code in "git push" to compute if any commit being pushed in the, superproject binds a commit in a submodule that hasn't been pushed, out was overly inefficient, making it unusable even for a small, project that does not have any submodule but have a reasonable, number of refs. "git push --dry-run --recurse-submodule=on-demand" wasn't, "--dry-run" in the submodules. The output from "git worktree list" was made in readdir() order, and was unstable. mergetool...trustExitCode configuration variable did not apply, to built-in tools, but now it does. "git p4" LFS support was broken when LFS stores an empty blob. a corner case in merge-recursive regression that crept in, during 2.10 development cycle. Update the error messages from the dumb-http client when it fails, to obtain loose objects; we used to give sensible error message, only upon 404 but we now forbid unexpected redirects that needs to, be reported with something sensible. When diff.renames configuration is on (and with Git 2.9 and later, it is enabled by default, which made it worse), "git stash", misbehaved if a file is removed and another file with a very, similar content is added. "git diff --no-index" did not take "--no-abbrev" option. "git difftool --dir-diff" had a minor regression when started from, a subdirectory, which has been. "git commit --allow-empty --only" (no pathspec) with dirty index, ought to be an acceptable way to create a new commit that does not, change
2.11.030 Nov 2016 19:25 minor feature: An empty string used as a pathspec element has always meant, 'everything matches', but it is too easy to write a script that, finds a path to remove in path and run 'git rm " paht"' by, mistake (when the user meant to give " path"), which ends up, removing everything. This release starts warning about the, use of an empty string that is used for 'everything matches' and, asks users to use a more explicit '.' for that instead. The hope is that existing users will not mind this change, and, eventually the warning can be turned into a hard error, upgrading, the deprecation into removal of this (mis)feature. The historical argument order "git merge. HEAD....", has been deprecated for quite some time, and will be removed in the, next release (not this one). The default abbreviation length, which has historically been 7, now, scales as the repository grows, using the approximate number of, objects in the repository and a bit of math around the birthday, paradox. The logic suggests to use 12 hexdigits for the Linux, kernel, and 9 to 10 for Git itself. Comes with new version of git-gui, now at its 0.21.0 tag. "git format-patch --cover-letter HEAD " to format a single patch, with a separate cover letter now numbers the output as PATCH 0/1 , and PATCH 1/1 by default. An incoming "git push" that attempts to push too many bytes can now, be rejected by setting a new configuration variable at the receiving, end. "git nosuchcommand --help" said "No manual entry for gitnosuchcommand", which was not intuitive, given that "git nosuchcommand" said "git:, 'nosuchcommand' is not a git command". "git clone --recurse-submodules --reference path URL" is a way to, reduce network transfer cost by borrowing objects in an existing, path repository when cloning the superproject from URL; it, learned to also peek into path for presence of corresponding, repositories of submodules and borrow objects from there when able. The "git diff --submodule= short,log " mechanism has been
2.10.230 Oct 2016 23:45 minor feature: The code that parses the format parameter of for-each-ref command, has seen a micro-optimization. The "graph" API used in "git log --graph" miscounted the number of, output columns consumed so far when drawing a padding line, which, has been ; this did not affect any existing code as nobody, tried to write anything after the padding on such a line, though. Almost everybody uses DEFAULT_ABBREV to refer to the default, setting for the abbreviation, but "git blame" peeked into, underlying variable bypassing the macro for no good reason. Doc update to clarify what "log -3 --reverse" does. An author name, that spelled a backslash-quoted double quote in the, human readable part "My "double quoted " name", was not unquoted, correctly while applying a patch from a piece of e-mail. The original command line syntax for "git merge", which was "git, merge. HEAD....", has been deprecated for quite some, time, and "git gui" was the last in-tree user of the syntax. This, is finally, so that we can move forward with the deprecation. Codepaths that read from an on-disk loose object were too loose in, validating what they are reading is a proper object file and, sometimes read past the data they read from the disk, which has, been corrected. H/t to Gustavo Grieco for reporting. "git worktree", even though it used the default_abbrev setting that, ought to be affected by core.abbrev configuration variable, ignored, the variable setting. The command has been taught to read the, default set of configuration variables to correct this. A low-level function verify_packfile() was meant to show errors, that were detected without dying itself, but under some conditions, it didn't and died instead, which has been. When "git fetch" tries to find where the history of the repository, it runs in has diverged from what the other side has, it has a, mechanism to avoid digging too deep into irrelevant side branches. This however did not work well over the "smart-http" transport due, to a de
2.10.105 Oct 2016 06:25 minor feature: Clarify various ways to specify the "revision ranges" in the, documentation. "diff-highlight" script (in contrib/) learned to work better with, "git log -p --graph" output. The test framework left the number of tests and success/failure, count in the t/test-results directory, keyed by the name of the, test script plus the process ID. The latter however turned out not, to serve any useful purpose. The process ID part of the filename, has been removed. Having a submodule whose ".git" repository is somehow corrupt, caused a few commands that recurse into submodules loop forever. "git symbolic-ref -d HEAD" happily removes the symbolic ref, but, the resulting repository becomes an invalid one. Teach the command, to forbid removal of HEAD. A test spawned a short-lived background process, which sometimes, prevented the test directory from getting removed at the end of the, script on some platforms. Update a few tests that used to use GIT_CURL_VERBOSE to use the, newer GIT_TRACE_CURL. Update Japanese translation for "git-gui". "git fetch http::/site/path" did not die correctly and segfaulted, instead. "git commit-tree" stopped reading commit.gpgsign configuration, variable that was meant for Porcelain "git commit" in Git 2.9; we, forgot to update "git gui" to look at the configuration to match, this change. "git log --cherry-pick" used to include merge commits as candidates, to be matched up with other commits, resulting a lot of wasted time. The patch-id generation logic has been updated to ignore merges to, avoid the wastage. The http transport (with curl-multi option, which is the default, these days) failed to remove curl-easy handle from a curlm session, which led to unnecessary API failures. "git diff -W" output needs to extend the context backward to, include the header line of the current function and also forward to, include the body of the entire current function up to the header, line of the next one. This process may have to merge to adjacent, hunks,
2.10.005 Sep 2016 06:05 minor feature: git pull --rebase --verify-signature" learned to warn the user, that "--verify-signature" is a no-op when rebasing. An upstream project can make a recommendation to shallowly clone, some submodules in the.gitmodules file it ships. "git worktree add" learned that '-' can be used as a short-hand for, "@ -1 ", the previous branch. Update the funcname definition to support css files. The completion script (in contrib/) learned to complete "git, status" options. Messages that are generated by auto gc during "git push" on the, receiving end are now passed back to the sending end in such a way, that they are shown with "remote: " preto avoid confusing the, users. "git add -i/-p" learned to honor diff.compactionHeuristic, experimental knob, so that the user can work on the same hunk split, as "git diff" output. "upload-pack" allows a custom "git pack-objects" replacement when, responding to "fetch/clone" via the uploadpack.packObjectsHook. (merge b738396 jk/upload-pack-hook later to maint). Teach format-patch and mailsplit (hence "am") how a line that, happens to begin with "From " in the e-mail message is quoted with, " ", so that these lines can be restored to their original shape. (merge d9925d1 ew/mboxrd-format-am later to maint). "git repack" learned the "--keep-unreachable" option, which sends, loose unreachable objects to a pack instead of leaving them loose. This helps heuristics based on the number of loose objects, (e.g. "gc --auto"). (merge e26a8c4 jk/repack-keep-unreachable later to maint). "log --graph --format=" learned that " (N)" specifies the width, relative to the terminal's left edge, not relative to the area to, draw text that is to the right of the ancestry-graph section. It, also now accepts negative N that means the column limit is relative, to the right border. A careless invocation of "git send-email directory/" after editing, 0001-change.patch with an editor often ends up sending both, 0001-change.patch and its backup file, 0001-change.p
2.9.314 Aug 2016 02:05 minor feature: A helper function that takes the contents of a commit object and, finds its subject line did not ignore leading blank lines, as is, commonly done by other codepaths. Make it ignore leading blank, lines to match. Git does not know what the contents in the index should be for a, path added with "git add -N" yet, so "git grep --cached" should not, show hits (or show lack of hits, with -L) in such a path, but that, logic does not apply to "git grep", i.e. searching in the working, tree files. But we did so by mistake, which has been corrected. "git rebase -i --autostash" did not restore the auto-stashed change, when the operation was aborted. "git commit --amend --allow-empty-message -S" for a commit without, any message body could have misidentified where the header of the, commit object ends. More mark-up updates to typeset strings that are expected to, literally typed by the end user in -width font. For a long time, we carried an in-code comment that said our, colored output would work only when we use fprintf/fputs on, Windows, which no longer is the case for the past few years. "gc.autoPackLimit" when set to 1 should not trigger a repacking, when there is only one pack, but the code counted poorly and did, so. One part of "git am" had an oddball helper function that called, stuff from outside "his" as opposed to calling what we have "ours", which was not gender-neutral and also inconsistent with the rest of, the system where outside stuff is usuall called "theirs" in, contrast to "ours". The test framework learned a new helper test_match_signal to, check an exit code from getting killed by an expected signal. "git blame -M" missed a single line that was moved within the file. recently introduced codepaths that are involved in parallel, submodule operations, which gave up on reading too early, and, could have wasted CPU while attempting to write under a corner, case condition. "git grep -i" has been taught to fold case in non-ascii locales, correctly. A
2.9.217 Jul 2016 19:05 minor feature: A merged to v2.9.1 had a few tests that are not meant to be, run on platforms without 64-bit long, which caused unnecessary, test failures on them because we didn't detect the platform and, skip them. These tests are now skipped on platforms that they, are not applicable to.
2.9.113 Jul 2016 05:05 minor feature: When "git daemon" is run without -- init- timeout specified, a, connection from a client that silently goes offline can hang around, for a long time, wasting resources. The socket-level KEEPALIVE has, been enabled to allow the OS to notice such failed connections. The commands in `git log` family take C(auto) in a custom format, string. This unconditionally turned the color on, ignoring, --no-color or with --color=auto when the output is not connected to, a tty; this was corrected to make the format truly behave as, "auto". "git rev-list --count" whose walk-length is limited with "-n", option did not work well with the counting optimized to look at the, bitmap index. "git show -W" (extend hunks to cover the entire function, delimited, by lines that match the "funcname" pattern) used to show the entire, file when a change added an entire function at the end of the file, which has been. The documentation set has been updated so that literal commands, configuration variables and environment variables are consistently, typeset in -width font and bold in manpages. "git svn propset" subcommand that was added in 2.3 days is, documented now. The documentation tries to consistently spell "GPG"; when, referring to the specific program name, "gpg" is used. "git reflog" stopped upon seeing an entry that denotes a branch, creation event (aka "unborn"), which made it appear as if the, reflog was truncated. The git-prompt scriptlet (in contrib/) was not friendly with those, who uses "set -u", which has been. A codepath that used alloca(3) to place an unbounded amount of data, on the stack has been updated to avoid doing so. "git update-index --add --chmod=+x file" may be usable as an escape, hatch, but not a friendly thing to force for people who do need to, use it regularly. "git add --chmod=+x file" can be used instead. Build improvements for gnome-keyring (in contrib/), "git status" used to say "working directory" when it meant "working, tree". Comments about misb
2.9.014 Jun 2016 14:25 minor feature: Comes with git-multimail 1.3.1 (in contrib/). The end-user facing commands like "git diff" and "git log", now enable the rename detection by default. The credential.helper configuration variable is cumulative and, there is no good way to override it from the command line. As, a special case, giving an empty string as its value now serves, as the signal to clear the values specified in various files. A new "interactive.diffFilter" configuration can be used to, customize the diff shown in "git add -i" sessions. "git p4" now allows P4 author names to be mapped to Git author, names. "git rebase -x" can be used without passing "-i" option. "git -c credential.. =. submodule" can now be used to, propagate configuration variables related to credential helper, down to the submodules. "git tag" can create an annotated tag without explicitly given an, "-a" (or "-s") option (i.e. when a tag message is given). A new, configuration variable, tag.forceSignAnnotated, can be used to tell, the command to create signed tag in such a situation. "git merge" used to allow merging two branches that have no common, base by default, which led to a brand new history of an existing, project created and then get pulled by an unsuspecting maintainer, which allowed an unnecessary parallel history merged into the, existing project. The command has been taught not to allow this by, default, with an escape hatch "--allow-unrelated-histories" option, to be used in a rare event that merges histories of two projects, that started their lives independently. "git pull" has been taught to pass the "--allow-unrelated-histories", option to underlying "git merge". "git apply -v" learned to report paths in the patch that were, skipped via --include/--exclude mechanism or being outside the, current working directory. Shell completion (in contrib/) updates. The commit object name reported when "rebase -i" stops has been, shortened. "git worktree add" can be given "--no-checkout" option to only, c
2.8.408 Jun 2016 13:25 minor feature: Documentation for "git merge --verify-signatures" has been updated, to clarify that the signature of only the commit at the tip is, verified. Also the phrasing used for signature and key validity is, adjusted to align with that used by OpenPGP. On Windows.git and optionally any files whose name starts with a, dot are now marked as hidden, with a core.hideDotFiles knob to, customize this behaviour. Portability enhancement for "rebase -i" to help platforms whose, shell does not like "for i in. " (which is not POSIX-kosher). "git fsck" learned to catch NUL byte in a commit object as, potential error and warn. CI test was taught to build documentation pages. Many 'linkgit: ' references were broken, which are all with this. "git describe --contains" often made a hard-to-justify choice of, tag to give name to a given commit, because it tried to come up, with a name with smallest number of hops from a tag, causing an old, commit whose descendant that is recently tagged were not, described with respect to an old tag but with a newer tag. It did, not help that its computation of "hop" count was further tweaked to, penalize being on a side branch of a merge. The logic has been, updated to favor using the tag with the oldest tagger date, which, is a lot easier to explain to the end users: "We describe a commit, in terms of the (chronologically) oldest tag that contains the, commit.", Running tests with '-x' option to trace the individual command, executions is a useful way to detest scripts, but some tests, that capture the standard error stream and check what the command, said can be broken with the trace output mixed in. When running, our tests under "bash", however, we can redirect the trace output, to another file descriptor to keep the standard error of programs, being tested intact. "http.cookieFile" configuration variable clearly wants a pathname, but we forgot to treat it as such by e.g. applying tilde expansion. When de-initialising all submodules, "git submo
2.8.320 May 2016 22:06 minor feature: "git send-email" now uses a more readable timestamps when, formulating a message ID. The repository set-up sequence has been streamlined (the biggest, change is that there is no longer git_config_early()), so that we, do not attempt to look into refs/ when we know we do not have a, Git repository. When "git worktree" feature is in use, "git branch -d" allowed, deletion of a branch that is checked out in another worktree, When "git worktree" feature is in use, "git branch -m" renamed a, branch that is checked out in another worktree without adjusting, the HEAD symbolic ref for the worktree. "git format-patch --help" showed `-s` and `--no-patch` as if these, are valid options to the command. We already hide `--patch` option, from the documentation, because format-patch is about showing the, diff, and the documentation now hides these options as well. A change back in version 2.7 to "git branch" broke display of a, symbolic ref in a non-standard place in the refs/ hierarchy (we, expect symbolic refs to appear in refs/remotes/*/HEAD to point at, the primary branch the remote has, and as.git/HEAD to point at the, branch we locally checked out). A partial rewrite of "git submodule" in the 2.7 timeframe changed, the way the gitdir: pointer in the submodules point at the real, repository location to use absolute paths by accident. This has, been corrected. "git commit" misbehaved in a few minor ways when an empty message, is given via -m '', all of which has been corrected. Support for CRAM-MD5 authentication method in "git imap-send" did, not work well. The socks5:// proxy support added back in 2.6.4 days was not aware, that socks5h:// proxies behave differently. "git config" had a codepath that tried to pass a NULL to, printf(" s"), which nobody seems to have noticed.
2.8.201 May 2016 06:25 minor feature: The embedded args argv-array in the child process is used to build, the command line to run pack-objects instead of using a separate, array of strings. Bunch of tests on "git clone" has been renumbered for better, organization. The tests that involve running httpd leaked the system-wide, configuration in /etc/gitconfig to the tested environment. "index-pack --keep=. " was broken since v2.1.0 timeframe. "git config --get-urlmatch", unlike other variants of the "git, config --get" family, did not signal error with its exit status, when there was no matching configuration. The "--local-env-vars" and "--resolve-git-dir" options of "git, rev-parse" failed to work outside a repository when the command's, option parsing was rewritten in 1.8.5 era. Fetching of history by naming a commit object name directly didn't, work across remote-curl transport. A small memory leak in an error codepath has been plugged in xdiff, code. strbuf_getwholeline() did not NUL-terminate the buffer on certain, corner cases in its error codepath. The startup_info data, which records if we are working inside a, repository (among other things), are now uniformly available to Git, subcommand implementations, and Git avoids attempting to touch, references when we are not in a repository. "git mergetool" did not work well with conflicts that both sides, deleted. "git send-email" had trouble parsing alias file in mailrc format, when lines in it had trailing whitespaces on them. When "git merge --squash" stopped due to conflict, the concluding, "git commit" failed to read in the SQUASH_MSG that shows the log, messages from all the squashed commits. "git merge FETCH_HEAD" dereferenced NULL pointer when merging, nothing into an unborn history (which is arguably unusual usage, which perhaps was the reason why nobody noticed it). Build updates for MSVC. "git diff -M" used to work better when two originally identical, files A and B got renamed to X/A and X/B by pairing A to X/A and B, to X/B, b
2.8.106 Apr 2016 03:45 minor feature: make rpmbuild" target was broken as its input,, was, not updated to match a file it describes that has been renamed, recently. This has been.
2.8.029 Mar 2016 15:05 minor feature: It turns out "git clone" over rsync transport has been broken when, the source repository has packed references for a long time, and, nobody noticed nor complained about it. "push" learned that its "--delete" option can be shortened to, "-d", just like "branch --delete" and "branch -d" are the same, thing. "git blame" learned to produce the progress eye-candy when it takes, too much time before emitting the first line of the result. "git grep" can now be configured (or told from the command line), how many threads to use when searching in the working tree files. Some "git notes" operations, e.g. "git log --notes=. ", should, be able to read notes from any tree-ish that is shaped like a notes, tree, but the notes infrastructure required that the argument must, be a ref under refs/notes/. Loosen it to require a valid ref only, when the operation would update the notes (in which case we must, have a place to store the updated notes tree, iow, a ref). "git grep" by default does not fall back to its "--no-index", behavior outside a directory under Git's control (otherwise the, user may by mistake end up running a huge recursive search); with a, new configuration (set in HOME/.gitconfig--by definition this, cannot be set in the config file per project), this safety can be, disabled. "git pull --rebase" has been extended to allow invoking, "rebase -i". "git p4" learned to cope with the type of a file getting changed. "git format-patch" learned to notice format.outputDirectory, configuration variable. This allows "-o. " option to be, omitted on the command line if you always use the same directory in, your workflow. "interpret-trailers" has been taught to optionally update a file in, place, instead of always writing the result to the standard output. Many commands that read files that are expected to contain text, that is generated (or can be edited) by the end user to control, their behavior (e.g. "git grep -f. ") have been updated, to be more tolerant to lines
2.7.418 Mar 2016 17:25 minor feature: Patches were backported from the 'master' front to plug heap, corruption holes, to catch integer overflow in the computation of, pathname lengths, and to get rid of the name_path API. Both of, these would have resulted in writing over an under-allocated buffer, when formulating pathnames while tree traversal.
2.7.311 Mar 2016 14:25 minor feature: Traditionally, the tests that try commands that work on the, contents in the working tree were named with "worktree" in their, filenames, but with the recent addition of "git worktree", subcommand, whose tests are also named similarly, it has become, harder to tell them apart. The traditional tests have been renamed, to use "work-tree" instead in an attempt to differentiate them. Many codepaths forget to check return value from git_config_set(); the function is made to die() to make sure we do not proceed when, setting a configuration variable failed. Handling of errors while writing into our internal asynchronous, process has been made more robust, which reduces flakiness in our, tests. "git show 'HEAD:Foo BAR Baz'" did not interpret the argument as a, rev, i.e. the object named by the the pathname with wildcard, characters in a tree object. "git rev-parse --git-common-dir" used in the worktree feature, misbehaved when run from a subdirectory. The "v(iew)" subcommand of the interactive "git am -i" command was, broken in 2.6.0 timeframe when the command was rewritten in C. "git merge-tree" used to mishandle "both sides added" conflict with, its own "create a fake ancestor file that has the common parts of, what both sides have added and do a 3-way merge" logic; this has, been updated to use the usual "3-way merge with an empty blob as, the fake common ancestor file" approach used in the rest of the, system. The memory ownership rule of fill_textconv() API, which was a bit, tricky, has been documented a bit better. The documentation did not clearly state that the 'simple' mode is, now the default for "git push" when push.default configuration is, not set. Recent versions of GNU grep are pickier when their input contains, arbitrary binary data, which some of our tests uses. Rewrite the, tests to sidestep the problem. A helper function "git submodule" uses since v2.7.0 to list the, modules that match the pathspec argument given to its subcommands, (e.g. "subm
2.7.224 Feb 2016 00:25 minor feature: The low-level merge machinery has been taught to use CRLF line, termination when inserting conflict markers to merged contents that, are themselves CRLF line-terminated. "git worktree" had a broken code that attempted to auto-, possible inconsistency that results from end-users moving a, worktree to different places without telling Git (the original, repository needs to maintain backpointers to its worktrees, but, "mv" run by end-users who are not familiar with that fact will, obviously not adjust them), which actually made things worse, when triggered. "git push --force-with-lease" has been taught to report if the push, needed to force (or fast-forwarded). The emulated "yes" command used in our test scripts has been, tweaked not to spend too much time generating unnecessary output, that is not used, to help those who test on Windows where it would, not stop until it fills the pipe buffer due to lack of SIGPIPE. The vimdiff backend for "git mergetool" has been tweaked to arrange, and number buffers in the order that would match the expectation of, majority of people who read left to right, then top down and assign, buffers 1 2 3 4 "mentally" to local base remote merge windows based, on that order. The documentation for "git clean" has been corrected; it mentioned, that.git/modules/ are removed by giving two "-f", which has never, been the case. Paths that have been told the index about with "add -N" are not, quite yet in the index, but a few commands behaved as if they, already are in a harmful way.
2.7.005 Jan 2016 22:25 minor feature: The appearance of "gitk", particularly on high DPI monitors, have, been improved. "gitk" also comes with an undated translation for, Swedish and Japanese. "git remote" learned "get-url" subcommand to show the URL for a, given remote name used for fetching and pushing. There was no way to defeat a configured rebase.autostash variable, from the command line, as "git rebase --no-autostash" was missing. "git log --date=local" used to only show the normal (default), format in the local timezone. The command learned to take 'local', as an instruction to use the local timezone with other formats, The refs used during a "git bisect" session is now per-worktree so, that independent bisect sessions can be done in different worktrees, created with "git worktree add". Users who are too busy to type three extra keystrokes to ask for, "git stash show -p" can now set stash.showPatch configuration, variable to true to always see the actual patch, not just the list, of paths affected with feel for the extent of damage via diffstat. "quiltimport" allows to specify the series file by honoring the, QUILT_SERIES environment and also --series command line option. The use of 'good/bad' in "git bisect" made it confusing to use when, hunting for a state change that is not a regression (e.g. ). The command learned 'old/new' and then allows the end user to, say e.g. "bisect start --term-old=fast --term-new=slow" to find a, performance regression. "git interpret-trailers" can now run outside of a Git repository. "git p4" learned to reencode the pathname it uses to communicate, with the p4 depot with a new option. Give progress meter to "git filter-branch". Allow a later "!/abc/def" to override an earlier "/abc" that, appears in the same.gitignore file to make it easier to express, "everything in /abc directory is ignored, except for...". Teach "git p4" to send large blobs outside the repository by, talking to Git LFS. Prepare for Git on-disk repository representation to undergo,
2.6.409 Dec 2015 07:25 minor feature: The "configure" script did not test for -lpthread correctly, which, upset some linkers. Add support for talking http/https over socks proxy. Portability for Windows, which may rewrite SHELL variable using, non-POSIX paths. We now consistently allow all hooks to ignore their standard input, rather than having git complain of SIGPIPE. shell quoting in contrib script. Test portability for a topic in v2.6.1. Allow tilde-expansion in some http config variables. Give a useful special case "diff/show --word-diff-regex=." as an, example in the documentation. for a corner case in filter-branch. Make git-p4 work on a detached head. Documentation clarification for "check-ignore" without "--verbose". Just like the working tree is cleaned up when the user cancelled, submission in P4Submit.applyCommit(), clean up the mess if "p4, submit" fails. Having a leftover.idx file without corresponding.pack file in, the repository hurts performance; "git gc" learned to prune them. The code to prepare the working tree side of temporary directory, for the "dir-diff" feature forgot that symbolic links need not be, copied (or symlinked) to the temporary area, as the code already, special cases and overwrites them. Besides, it was wrong to try, computing the object name of the target of symbolic link, which may, not even exist or may be a directory. There was no way to defeat a configured rebase.autostash variable, from the command line, as "git rebase --no-autostash" was missing. Allow "git interpret-trailers" to run outside of a Git repository. Produce correct "dirty" marker for shell prompts, even when we, are on an orphan or an unborn branch. Some corner cases have been in string-matching done in "git, status". Apple's common crypto implementation of SHA1_Update() does not take, more than 4GB at a time, and we now have a compile-time workaround, for it.
2.6.307 Nov 2015 01:45 minor feature: The error message from "git blame --contents --reverse" incorrectly, talked about "--contents --children". "git merge-file" tried to signal how many conflicts it found, which, obviously would not work well when there are too many of them. The name-hash subsystem that is used to cope with case insensitive, filesystems keeps track of directories and their on-filesystem, cases for all the paths in the index by holding a pointer to a, randomly chosen cache entry that is inside the directory (for its, ce- ce_name component). This pointer was not updated even when the, cache entry was removed from the index, leading to use after free. This was by recording the path for each directory instead of, borrowing cache entries and restructuring the API somewhat. When the "git am" command was reimplemented in C, "git am -3" had a, small regression where it is aborted in its error handling codepath, when underlying merge-recursive failed in some ways. The synopsis text and the usage string of subcommands that read, list of things from the standard input are often shown as if they, only take input from a file on a filesystem, which was misleading. A couple of commands still showed " options " in their usage string, to note where options should come on their command line, but we, spell that " . " in most places these days. The submodule code has been taught to work better with separate, work trees created via "git worktree add". When "git gc --auto" is backgrounded, its diagnosis message is, lost. It now is saved to a file in GIT_DIR and is shown next time, the "gc --auto" is run. Work around "git p4" failing when the P4 depot records the contents, in UTF-16 without UTF-16 BOM. Recent update to "rebase -i" that tries to sanity check the edited, insn sheet before it uses it has become too picky on Windows where, CRLF left by the editor is turned into a trailing CR on the line, read via the "read" built-in command. "git clone --dissociate" runs a big "git repack" process at
2.6.218 Oct 2015 06:45 minor feature: There were some classes of errors that "git fsck" diagnosed to its, standard error that did not cause it to exit with non-zero status. A test script for the HTTP service had a timing dependent, which was. Performance-measurement tests did not work without an installed Git. On a case insensitive filesystems, setting GIT_WORK_TREE variable, using a random cases that does not agree with what the filesystem, thinks confused Git that it wasn't inside the working tree. When "git am" was rewritten as a built-in, it stopped paying, attention to user.signingkey, which was. After "git checkout --detach", "git status" reported a fairly, useless "HEAD detached at HEAD", instead of saying at which exact, commit. "git rebase -i" had a minor regression recently, which stopped, considering a line that begins with an indented '#' in its insn, sheet not a comment, which is now. Description of the "log.follow" configuration variable in "git log", documentation is now also copied to "git config" documentation. Allocation related functions and stdio are unsafe things to call, inside a signal handler, and indeed killing the pager can cause, glibc to deadlock waiting on allocation mutex as our signal handler, tries to free() some data structures in wait_for_pager(). Reduce, these unsafe calls. The way how --ref/--notes to specify the notes tree reference are, DWIMmed was not clearly documented. Customization to change the behaviour with "make -w" and "make -s", in our Makefile was broken when they were used together. The Makefile always runs the library archiver with hardcoded "crs", options, which was inconvenient for exotic platforms on which, people want to use programs with totally different set of command, line options. The ssh transport, just like any other transport over the network, did not clear GIT_ environment variables, but it is possible to, use SendEnv and AcceptEnv to leak them to the remote invocation of, Git, which is not a good idea at all. Explicitly clear t
2.6.106 Oct 2015 16:45 minor feature: Xdiff code we use to generate diffs is not prepared to handle, extremely large files. It uses "int" in many places, which can, overflow if we have a very large number of lines or even bytes in, our input files, for example. Cap the input size to soemwhere, around 1GB for now. Some protocols (like git-remote-ext) can execute arbitrary code, found in the URL. The URLs that submodules use may come from, arbitrary sources (e.g..gitmodules files in a remote, repository), and can hurt those who blindly enable recursive, fetch. Restrict the allowed protocols to well known and safe, ones.
2.6.030 Sep 2015 09:45 minor feature: An asterisk as a substring (as opposed to the entirety) of a path, component for both side of a refspec, e.g. "refs/heads/o*:refs/remotes/heads/i*", is now allowed. New userdiff pattern definition for fountain screenwriting markup, format has been added. "git log" and friends learned a new "--date=format:." option to, format timestamps using system's strftime(3). "git fast-import" learned to respond to the get-mark command via, its cat-blob-fd interface. "git rebase -i" learned "drop commit-object-name subject" command, as another way to skip replaying of a commit. A new configuration variable can enable "--follow" automatically, when "git log" is run with one pathspec argument. "git status" learned to show a more detailed information regarding, the "rebase -i" session in progress. "git cat-file" learned "--batch-all-objects" option to enumerate all, available objects in the repository more quickly than "rev-list, --all --objects" (the output includes unreachable objects, though). "git fsck" learned to ignore errors on a set of known-to-be-bad, objects, and also allows the warning levels of various kinds of, non-critical breakages to be tweaked. "git rebase -i"'s list of todo is made configurable. "git send-email" now performs alias-expansion on names that are, given via --cccmd, etc. An environment variable GIT_REPLACE_REF_BASE tells Git to look into, refs hierarchy other than refs/replace/ for the object replacement, data. Allow untracked cache (experimental) to be used when sparse, checkout (experimental) is also in use. "git pull --rebase" has been taught to pay attention to, rebase.autostash configuration. The command-line completion script (in contrib/) has been updated. A negative !ref entry in multi-value transfer.hideRefs, configuration can be used to say "don't hide this one". After "git am" without "-3" stops, running "git am -3" pays attention, to "-3" only for the patch that caused the original invocation, to stop. When linked worktree
2.5.319 Sep 2015 08:45 minor feature: The experimental untracked-cache feature were gy when paths with, a few levels of subdirectories are involved. Recent versions of scripted "git am" has a performance regression, in "git am --skip" codepath, which no longer exists in the, built-in version on the 'master' front. the regression in, the last scripted version that appear in 2.5.x maintenance track, and older.
2.5.212 Sep 2015 06:05 minor feature: git init empty git -C empty log" said "bad default revision 'HEAD'", which was found to be a bit confusing to new users. The "interpret-trailers" helper mistook a multi-paragraph title of, a commit log message with a colon in it as the end of the trailer, block. When re-priming the cache-tree opportunistically while committing, the in-core index as-is, we mistakenly invalidated the in-core, index too aggressively, causing the experimental split-index code, to unnecessarily rewrite the on-disk index file(s). "git archive" did not use zip64 extension when creating an archive, with more than 64k entries, which nobody should need, right ;-)?, The code in "multiple-worktree" support that attempted to recover, from an inconsistent state updated an incorrect file. "git rev-list" does not take "--notes" option, but did not complain, when one is given. Because the configuration system does not allow "alias.0foo" and, "pager.0foo" as the configuration key, the user cannot use '0foo', as a custom command name anyway, but "git 0foo" tried to look these, keys up and emitted useless warnings before saying '0foo is not a, git command'. These warning messages have been squelched. We recently rewrote one of the build scripts in Perl, which made it, necessary to have Perl to build Git. Reduced Perl dependency by, rewriting it again using sed. t1509 test that requires a dedicated VM environment had some, bitrot, which has been corrected. strbuf_read() used to have one extra iteration (and an unnecessary, strbuf_grow() of 8kB), which was eliminated. The codepath to produce error messages had a hard-coded limit to, the size of the message, primarily to avoid memory allocation while, calling die(). When trying to see that an object does not exist, a state errno, leaked from our "first try to open a packfile with O_NOATIME and, then if it fails retry without it" logic on a system that refuses, O_NOATIME. This confused us and caused us to die, saying that the, packfile is unre
2.5.129 Aug 2015 11:25 minor feature: Running an aliased command from a subdirectory when the.git thing, in the working tree is a gitfile pointing elsewhere did not work. Often a fast-import stream builds a new commit on top of the, previous commit it built, and it often unconditionally emits a, "from" command to specify the first parent, which can be omitted in, such a case. This caused fast-import to forget the tree of the, previous commit and then re-read it from scratch, which was, inefficient. Optimize for this common case. The "rev-parse --parseopt" mode parsed the option specification, and the argument hint in a strange way to allow '=' and other, special characters in the option name while forbidding them from, the argument hint. This made it impossible to define an option, like "--pair. =. " with "pair=key=value" specification, which instead would have defined a "--pair=key. " option. A "rebase" replays changes of the local branch on top of something, else, as such they are placed in stage #3 and referred to as, "theirs", while the changes in the new base, typically a foreign, work, are placed in stage #2 and referred to as "ours". Clarify, the "checkout --ours/--theirs". An experimental "untracked cache" feature used uname(2) in a, slightly unportable way. "sparse checkout" misbehaved for a path that is excluded from the, checkout when switching between branches that differ at the path. The low-level "git send-pack" did not honor 'user.signingkey', configuration variable when sending a signed-push. An attempt to delete a ref by pushing into a repository whose HEAD, symbolic reference points at an unborn branch that cannot be, created due to ref D/F conflict (e.g. refs/heads/a/b exists, HEAD, points at refs/heads/a) failed. "git subtree" (in contrib/) depended on "git log" output to be, stable, which was a no-no. Apply a workaround to force a, particular date format. "git clone URL" in recent releases of Git contains a regression in, the code that invents a new repository name incorre
2.5.028 Jul 2015 18:45 major feature: The bash completion script (in contrib/) learned a few options that, "git revert" takes. Whitespace breakages in deleted and context lines can also be, painted in the output of "git diff" and friends with the new, --ws-error-highlight option. List of commands shown by "git help" are grouped along the workflow, elements to help early learners. "git p4" now detects the filetype (e.g. binary) correctly even when, the files are opened exclusively. git p4 attempts to better handle branches in Perforce. "git p4" learned "--changes-block-size. " to read the changes in, chunks from Perforce, instead of making one call to "p4 changes", that may trigger "too many rows scanned" error from Perforce. More workaround for Perforce's row number limit in "git p4". Unlike " EDITOR" and " GIT_EDITOR" that can hold the path to the, command and initial options (e.g. "/path/to/emacs -nw"), 'git p4', did not let the shell interpolate the contents of the environment, variable that name the editor " P4EDITOR" (and " EDITOR", too). This release makes it in line with the rest of Git, as well as with, Perforce. A new short-hand. @ push denotes the remote-tracking branch, that tracks the branch at the remote the. would be pushed, to. "git show-branch --topics HEAD" (with no other arguments) did not, do anything interesting. Instead, contrast the given revision, against all the local branches by default. A replacement for contrib/workdir/git-new-workdir that does not, rely on symbolic links and make sharing of objects and refs safer, by making the borrowee and borrowers aware of each other. Consider this as still an experimental feature; its UI is still, likely to change. Tweak the sample "store" backend of the credential helper to honor, XDG configuration file locations when specified. A heuristic we use to catch mistyped paths on the command line, "git... " is to make sure that all the non-rev, parameters in the later part of the command line are names of the, files in the workin
2.4.617 Jul 2015 00:05 minor feature: git fetch --depth=. " and "git clone --depth=. " issued, a shallow transfer request even to an upload-pack that does not, support the capability. "git fsck" used to ignore missing or invalid objects recorded in reflog. The tcsh completion writes a bash scriptlet but that would have, failed for users with noclobber set. Recent Mac OS X updates breaks the logic to detect that the machine, is on the AC power in the sample pre-auto-gc script. "git format-patch --ignore-if-upstream A..B" did not like to be fed, tags as boundary commits.
2.4.526 Jun 2015 14:45 minor feature: 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).
2.4.417 Jun 2015 16:05 minor feature: 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.
2.4.306 Jun 2015 23:05 minor feature: 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" appear
2.4.115 May 2015 06:05 minor bugfix: 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 and, 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).
2.4.003 May 2015 01:25 major feature: The output from "git log --decorate" (and, more generally, the " d", format specifier used in the "--format=. " parameter to the, "git log" family of commands) has changed. It used to list "HEAD", just like other branches; e.g, git log --decorate -1 master, commit bdb0f6788fa5e3cacc4315e9ff318a27b2676ff4 (HEAD, master), . This release changes the output slightly when HEAD refers to a, branch whose name is also shown in the output. The above is now, shown as:, git log --decorate -1 master, commit bdb0f6788fa5e3cacc4315e9ff318a27b2676ff4 (HEAD - master), . * The phrasing "git branch" uses to describe a detached HEAD has been, updated to agree with the phrasing used by "git status":, - When HEAD is at the same commit as when it was originally, detached, they now both show "detached at ". - When HEAD has moved since it was originally detached, they now, both show "detached from ". Previously, "git branch" always used "from". * Our default I/O size (8 MiB) for large files was too large for some, platforms with smaller SSIZE_MAX, leading to read(2)/write(2), failures. * We did not check the curl library version before using the, CURLOPT_PROXYAUTH feature, which did not exist in older versions of, the library. * We now detect number of CPUs on older BSD-derived systems. * Portability fixes and workarounds for shell scripts have been added, to help BSD-derived systems. * The command usage info strings given by "git cmd -h" and in, documentation have been tweaked for consistency. * The "sync" subcommand of "git p4" now allows users to exclude, subdirectories like its "clone" subcommand does. * "git log --invert-grep --grep=WIP" will show only commits that do, not have the string "WIP" in their messages. * "git push" has been taught an "--atomic" option that makes a push, that updates more than one ref an "all-or-none" affair. * Extending the "push to deploy" feature that was added in 2.3, the, behaviour of "git push" when updating the branch that is checked, out can now
2.3.728 Apr 2015 09:05 minor feature: 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:// * 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.
2.3.622 Apr 2015 16:25 minor feature: 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).
2.3.501 Apr 2015 12:45 minor feature: 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.
2.3.424 Mar 2015 13:05 minor bugfix: 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.
2.3.208 Mar 2015 03:40 minor feature: update-index --refresh" used to leak when an entry cannot be, refreshed for whatever reason. * "git fast-import" used to crash when it could not close and, conclude the resulting packfile cleanly. * "git blame" died, trying to free an uninitialized piece of memory. * "git merge-file" did not work correctly in a subdirectory. * "git submodule add" failed to squash "path/to/././submodule" to, "path/to/submodule". * In v2.2.0, we broke "git prune" that runs in a repository that, borrows from an alternate object store. * Certain older vintages of cURL give irregular output from, "curl-config --vernum", which confused our build system. * An earlier workaround to squelch unhelpful deprecation warnings, from the complier on Mac OSX unnecessarily set minimum required, version of the OS, which the user might want to raise (or lower), for other reasons. * Longstanding configuration variable naming rules has been added to, the documentation. * The credential helper for Windows (in contrib/) used to mishandle, a user name with an at-sign in it. * Older GnuPG implementations may not correctly import the keyring, material we prepare for the tests to use. * Clarify in the documentation that "remote..pushURL" and, "remote..URL" are there to name the same repository accessed, via different transports, not two separate repositories. * The pack bitmap support did not build with older versions of GCC. * Reading configuration from a blob object, when it ends with a lone, CR, use to confuse the configuration parser. * We didn't format an integer that wouldn't fit in "int" but in, "uintmax_t" correctly. * "git push --signed" gave an incorrectly worded error message when, the other side did not support the capability. * "git fetch" over a remote-helper that cannot respond to "list", command could not fetch from a symbolic reference e.g. HEAD. * The insn sheet "git rebase -i" creates did not fully honor, core.abbrev settings. * The tests that wanted to see that file becomes unreadable after
2.3.126 Feb 2015 08:25 minor feature: 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".
2.3.006 Feb 2015 06:25 minor feature: 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. * 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
2.2.215 Jan 2015 00:05 minor feature: 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 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 fi
2.2.119 Dec 2014 17:05 minor feature: We used to allow committing a path ".Git/config" with Git that is, running on a case sensitive filesystem, but an attempt to check out, such a path with Git that runs on a case insensitive filesystem, would have clobbered ".git/config", which is definitely not what, the user would have expected. Git now prevents you from tracking, a path with ".Git" (in any case combination) as a path component. * On Windows, certain path components that are different from ".git", are mapped to ".git", e.g. "git 1/config" is treated as if it were, ".git/config". HFS+ has a similar issue, where certain unicode, codepoints are ignored, e.g. ".g u200cit/config" is treated as if, it were ".git/config". Pathnames with these potential issues are, rejected on the affected systems. Git on systems that are not, affected by this issue (e.g. Linux) can also be configured to, reject them to ensure cross platform interoperability of the hosted, projects. * "git fsck" notices a tree object that records such a path that can, be confused with ".git", and with receive.fsckObjects configuration, set to true, an attempt to "git push" such a tree object will be, rejected. Such a path may not be a problem on a well behaving, filesystem but in order to protect those on HFS+ and on case, insensitive filesystems, this check is enabled on all platforms.
2.2.028 Nov 2014 09:45 minor feature: 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. * "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-s
2.1.303 Nov 2014 02:05 minor bugfix: 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 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.