| Git 2.9 Release Notes | 
 | ===================== | 
 |  | 
 | Backward compatibility notes | 
 | ---------------------------- | 
 |  | 
 | The end-user facing Porcelain level commands in the "git diff" and | 
 | "git log" family by default enable the rename detection; you can still | 
 | use "diff.renames" configuration variable to disable this. | 
 |  | 
 | Merging two branches that have no common ancestor with "git merge" is | 
 | by default forbidden now to prevent creating such an unusual merge by | 
 | mistake. | 
 |  | 
 | The output formats of "git log" that indents the commit log message by | 
 | 4 spaces now expands HT in the log message by default.  You can use | 
 | the "--no-expand-tabs" option to disable this. | 
 |  | 
 | "git commit-tree" plumbing command required the user to always sign | 
 | its result when the user sets the commit.gpgsign configuration | 
 | variable, which was an ancient mistake, which this release corrects. | 
 | A script that drives commit-tree, if it relies on this mistake, now | 
 | needs to read commit.gpgsign and pass the -S option as necessary. | 
 |  | 
 |  | 
 | Updates since v2.8 | 
 | ------------------ | 
 |  | 
 | UI, Workflows & Features | 
 |  | 
 |  * 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.<var>=<value> 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 | 
 |    create an empty worktree without checking out the files. | 
 |  | 
 |  * "git mergetools" learned to drive ExamDiff. | 
 |  | 
 |  * "git pull --rebase" learned "--[no-]autostash" option, so that | 
 |    the rebase.autostash configuration variable set to true can be | 
 |    overridden from the command line. | 
 |  | 
 |  * When "git log" shows the log message indented by 4-spaces, the | 
 |    remainder of a line after a HT does not align in the way the author | 
 |    originally intended.  The command now expands tabs by default to help | 
 |    such a case, and allows the users to override it with a new option, | 
 |    "--no-expand-tabs". | 
 |  | 
 |  * "git send-email" now uses a more readable timestamps when | 
 |    formulating a message ID. | 
 |  | 
 |  * "git rerere" can encounter two or more files with the same conflict | 
 |    signature that have to be resolved in different ways, but there was | 
 |    no way to record these separate resolutions. | 
 |  | 
 |  * "git p4" learned to record P4 jobs in Git commit that imports from | 
 |    the history in Perforce. | 
 |  | 
 |  * "git describe --contains" often made a hard-to-justify choice of | 
 |    tag to name 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 close 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." | 
 |  | 
 |  * "git clone" learned the "--shallow-submodules" option. | 
 |  | 
 |  * HTTP transport clients learned to throw extra HTTP headers at the | 
 |    server, specified via http.extraHeader configuration variable. | 
 |  | 
 |  * The "--compaction-heuristic" option to "git diff" family of | 
 |    commands enables a heuristic to make the patch output more readable | 
 |    by using a blank line as a strong hint that the contents before and | 
 |    after it belong to logically separate units.  It is still | 
 |    experimental. | 
 |  | 
 |  * A new configuration variable core.hooksPath allows customizing | 
 |    where the hook directory is. | 
 |  | 
 |  * An earlier addition of "sanitize_submodule_env" with 14111fc4 (git: | 
 |    submodule honor -c credential.* from command line, 2016-02-29) | 
 |    turned out to be a convoluted no-op; implement what it wanted to do | 
 |    correctly, and stop filtering settings given via "git -c var=val". | 
 |  | 
 |  * "git commit --dry-run" reported "No, no, you cannot commit." in one | 
 |    case where "git commit" would have allowed you to commit, and this | 
 |    improves it a little bit ("git commit --dry-run --short" still does | 
 |    not give you the correct answer, for example).  This is a stop-gap | 
 |    measure in that "commit --short --dry-run" still gives an incorrect | 
 |    result. | 
 |  | 
 |  * The experimental "multiple worktree" feature gains more safety to | 
 |    forbid operations on a branch that is checked out or being actively | 
 |    worked on elsewhere, by noticing that e.g. it is being rebased. | 
 |  | 
 |  * "git format-patch" learned a new "--base" option to record what | 
 |    (public, well-known) commit the original series was built on in | 
 |    its output. | 
 |  | 
 |  * "git commit" learned to pay attention to the "commit.verbose" | 
 |    configuration variable and act as if the "--verbose" option | 
 |    was given from the command line. | 
 |  | 
 |  * Updated documentation gives hints to GMail users with two-factor | 
 |    auth enabled that they need app-specific-password when using | 
 |    "git send-email". | 
 |  | 
 |  * The manpage output of our documentation did not render well in | 
 |    terminal; typeset literals in bold by default to make them stand | 
 |    out more. | 
 |  | 
 |  * The mark-up in the top-level README.md file has been updated to | 
 |    typeset CLI command names differently from the body text. | 
 |  | 
 |  | 
 | Performance, Internal Implementation, Development Support etc. | 
 |  | 
 |  * 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. | 
 |  | 
 |  * A test for tags has been restructured so that more parts of it can | 
 |    easily be run on a platform without a working GnuPG. | 
 |  | 
 |  * 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. | 
 |  | 
 |  * The command line argument parser for "receive-pack" has been | 
 |    rewritten to use parse-options. | 
 |  | 
 |  * A major part of "git submodule update" has been ported to C to take | 
 |    advantage of the recently added framework to run download tasks in | 
 |    parallel.  Other updates to "git submodule" that move pieces of | 
 |    logic to C continues. | 
 |  | 
 |  * Rename bunch of tests on "git clone" for better organization. | 
 |  | 
 |  * The tests that involve running httpd leaked the system-wide | 
 |    configuration in /etc/gitconfig to the tested environment. | 
 |  | 
 |  * Build updates for MSVC. | 
 |  | 
 |  * 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. | 
 |  | 
 |  * Code restructuring around the "refs" API to prepare for pluggable | 
 |    refs backends. | 
 |  | 
 |  * Sources to many test helper binaries and the generated helpers | 
 |    have been moved to t/helper/ subdirectory to reduce clutter at the | 
 |    top level of the tree. | 
 |  | 
 |  * Unify internal logic between "git tag -v" and "git verify-tag" | 
 |    commands by making one directly call into the other. | 
 |  | 
 |  * "merge-recursive" strategy incorrectly checked if a path that is | 
 |    involved in its internal merge exists in the working tree. | 
 |  | 
 |  * The test scripts for "git p4" (but not "git p4" implementation | 
 |    itself) has been updated so that they would work even on a system | 
 |    where the installed version of Python is python 3. | 
 |  | 
 |  * As nobody maintains our in-tree git.spec.in and distros use their | 
 |    own spec file, we stopped pretending that we support "make rpm". | 
 |  | 
 |  * Move from "unsigned char[20]" to "struct object_id" continues. | 
 |  | 
 |  * The code for warning_errno/die_errno has been refactored and a new | 
 |    error_errno() reporting helper is introduced. | 
 |    (merge 1da045f nd/error-errno later to maint). | 
 |  | 
 |  * Running tests with '-x' option to trace the individual command | 
 |    executions is a useful way to debug test 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. | 
 |  | 
 |  * t0040 had too many unnecessary repetitions in its test data.  Teach | 
 |    test-parse-options program so that a caller can tell what it | 
 |    expects in its output, so that these repetitions can be cleaned up. | 
 |  | 
 |  * Add perf test for "rebase -i". | 
 |  | 
 |  * Common mistakes when writing gitlink: in our documentation are | 
 |    found by "make check-docs". | 
 |  | 
 |  * t9xxx series has been updated primarily for readability, while | 
 |    fixing small bugs in it.  A few scripted Porcelain commands have | 
 |    also been updated to fix possible bugs around their use of | 
 |    "test -z" and "test -n". | 
 |  | 
 |  * CI test was taught to run git-svn tests. | 
 |  | 
 |  * "git cat-file --batch-all" has been sped up, by taking advantage | 
 |    of the fact that it does not have to read a list of objects, in two | 
 |    ways. | 
 |  | 
 |  * test updates to make it more readable and maintainable. | 
 |    (merge e6273f4 es/t1500-modernize later to maint). | 
 |  | 
 |  * "make DEVELOPER=1" worked as expected; setting DEVELOPER=1 in | 
 |    config.mak didn't. | 
 |    (merge 51dd3e8 mm/makefile-developer-can-be-in-config-mak later to maint). | 
 |  | 
 |  * The way how "submodule--helper list" signals unmatch error to its | 
 |    callers has been updated. | 
 |  | 
 |  * A bash-ism "local" has been removed from "git submodule" scripted | 
 |    Porcelain. | 
 |  | 
 |  | 
 | Also contains various documentation updates and code clean-ups. | 
 |  | 
 |  | 
 | Fixes since v2.8 | 
 | ---------------- | 
 |  | 
 | Unless otherwise noted, all the fixes since v2.8 in the maintenance | 
 | track are contained in this release (see the maintenance releases' | 
 | notes for details). | 
 |  | 
 |  * "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. | 
 |  | 
 |  * "git index-pack --keep[=<msg>] pack-$name.pack" simply did not work. | 
 |  | 
 |  * 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. | 
 |  | 
 |  * "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). | 
 |  | 
 |  * When "git worktree" feature is in use, "git branch -d" allowed | 
 |    deletion of a branch that is checked out in another worktree, | 
 |    which was wrong. | 
 |  | 
 |  * 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 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, but this was broken in the 2.0 timeframe. | 
 |  | 
 |  * "git send-pack --all <there>" was broken when its command line | 
 |    option parsing was written in the 2.6 timeframe. | 
 |  | 
 |  * "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. | 
 |  | 
 |  * When running "git blame $path" with unnormalized data in the index | 
 |    for the path, the data in the working tree was blamed, even though | 
 |    "git add" would not have changed what is already in the index, due | 
 |    to "safe crlf" that disables the line-end conversion.  It has been | 
 |    corrected. | 
 |  | 
 |  * 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. | 
 |  | 
 |  * Upcoming OpenSSL 1.1.0 will break compilation by updating a few API | 
 |    elements we use in imap-send, which has been adjusted for the change. | 
 |  | 
 |  * The socks5:// proxy support added back in 2.6.4 days was not aware | 
 |    that socks5h:// proxies behave differently from socks5:// proxies. | 
 |  | 
 |  * "git config" had a codepath that tried to pass a NULL to | 
 |    printf("%s"), which nobody seems to have noticed. | 
 |  | 
 |  * On Cygwin, object creation uses the "create a temporary and then | 
 |    rename it to the final name" pattern, not "create a temporary, | 
 |    hardlink it to the final name and then unlink the temporary" | 
 |    pattern. | 
 |  | 
 |    This is necessary to use Git on Windows shared directories, and is | 
 |    already enabled for the MinGW and plain Windows builds.  It also | 
 |    has been used in Cygwin packaged versions of Git for quite a while. | 
 |    See https://lore.kernel.org/git/20160419091055.GF2345@dinwoodie.org/ | 
 |  | 
 |  * "merge-octopus" strategy did not ensure that the index is clean | 
 |    when merge begins. | 
 |  | 
 |  * When "git merge" notices that the merge can be resolved purely at | 
 |    the tree level (without having to merge blobs) and the resulting | 
 |    tree happens to already exist in the object store, it forgot to | 
 |    update the index, which left an inconsistent state that would | 
 |    break later operations. | 
 |  | 
 |  * "git submodule" reports the paths of submodules the command | 
 |    recurses into, but these paths were incorrectly reported when | 
 |    the command was not run from the root level of the superproject. | 
 |  | 
 |  * The "user.useConfigOnly" configuration variable makes it an error | 
 |    if users do not explicitly set user.name and user.email.  However, | 
 |    its check was not done early enough and allowed another error to | 
 |    trigger, reporting that the default value we guessed from the | 
 |    system setting was unusable.  This was a suboptimal end-user | 
 |    experience as we want the users to set user.name/user.email without | 
 |    relying on the auto-detection at all. | 
 |  | 
 |  * "git mv old new" did not adjust the path for a submodule that lives | 
 |    as a subdirectory inside old/ directory correctly. | 
 |  | 
 |  * "git replace -e" did not honour "core.editor" configuration. | 
 |  | 
 |  * "git push" from a corrupt repository that attempts to push a large | 
 |    number of refs deadlocked; the thread to relay rejection notices | 
 |    for these ref updates blocked on writing them to the main thread, | 
 |    after the main thread at the receiving end notices that the push | 
 |    failed and decides not to read these notices and return a failure. | 
 |  | 
 |  * mmap emulation on Windows has been optimized and work better without | 
 |    consuming paging store when not needed. | 
 |  | 
 |  * A question by "git send-email" to ask the identity of the sender | 
 |    has been updated. | 
 |  | 
 |  * UI consistency improvements for "git mergetool". | 
 |  | 
 |  * "git rebase -m" could be asked to rebase an entire branch starting | 
 |    from the root, but failed by assuming that there always is a parent | 
 |    commit to the first commit on the branch. | 
 |  | 
 |  * Fix a broken "p4 lfs" test. | 
 |  | 
 |  * Recent update to Git LFS broke "git p4" by changing the output from | 
 |    its "lfs pointer" subcommand. | 
 |  | 
 |  * "git fetch" test t5510 was flaky while running a (forced) automagic | 
 |    garbage collection. | 
 |  | 
 |  * Documentation updates to help contributors setting up Travis CI | 
 |    test for their patches. | 
 |  | 
 |  * Some multi-byte encoding can have a backslash byte as a later part | 
 |    of one letter, which would confuse "highlight" filter used in | 
 |    gitweb. | 
 |  | 
 |  * "git commit-tree" plumbing command required the user to always sign | 
 |    its result when the user sets the commit.gpgsign configuration | 
 |    variable, which was an ancient mistake.  Rework "git rebase" that | 
 |    relied on this mistake so that it reads commit.gpgsign and pass (or | 
 |    not pass) the -S option to "git commit-tree" to keep the end-user | 
 |    expectation the same, while teaching "git commit-tree" to ignore | 
 |    the configuration variable.  This will stop requiring the users to | 
 |    sign commit objects used internally as an implementation detail of | 
 |    "git stash". | 
 |  | 
 |  * "http.cookieFile" configuration variable clearly wants a pathname, | 
 |    but we forgot to treat it as such by e.g. applying tilde expansion. | 
 |  | 
 |  * Consolidate description of tilde-expansion that is done to | 
 |    configuration variables that take pathname to a single place. | 
 |  | 
 |  * Correct faulty recommendation to use "git submodule deinit ." when | 
 |    de-initialising all submodules, which would result in a strange | 
 |    error message in a pathological corner case. | 
 |  | 
 |  * Many 'linkgit:<git documentation page>' references were broken, | 
 |    which are all fixed with this. | 
 |  | 
 |  * "git rerere" can get confused by conflict markers deliberately left | 
 |    by the inner merge step, because they are indistinguishable from | 
 |    the real conflict markers left by the outermost merge which are | 
 |    what the end user and "rerere" need to look at.  This was fixed by | 
 |    making the conflict markers left by the inner merges a bit longer. | 
 |    (merge 0f9fd5c jc/ll-merge-internal later to maint). | 
 |  | 
 |  * CI test was taught to build documentation pages. | 
 |  | 
 |  * "git fsck" learned to catch NUL byte in a commit object as | 
 |    potential error and warn. | 
 |  | 
 |  * Portability enhancement for "rebase -i" to help platforms whose | 
 |    shell does not like "for i in <empty>" (which is not POSIX-kosher). | 
 |  | 
 |  * 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. | 
 |  | 
 |  * 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. | 
 |  | 
 |  * A couple of bugs around core.autocrlf have been fixed. | 
 |  | 
 |  * Many commands normalize command line arguments from NFD to NFC | 
 |    variant of UTF-8 on OSX, but commands in the "diff" family did | 
 |    not, causing "git diff $path" to complain that no such path is | 
 |    known to Git.  They have been taught to do the normalization. | 
 |  | 
 |  * "git difftool" learned to handle unmerged paths correctly in | 
 |    dir-diff mode. | 
 |  | 
 |  * The "are we talking with TTY, doing an interactive session?" | 
 |    detection has been updated to work better for "Git for Windows". | 
 |  | 
 |  * We forgot to add "git log --decorate=auto" to documentation when we | 
 |    added the feature back in v2.1.0 timeframe. | 
 |    (merge 462cbb4 rj/log-decorate-auto later to maint). | 
 |  | 
 |  * "git fast-import --export-marks" would overwrite the existing marks | 
 |    file even when it makes a dump from its custom die routine. | 
 |    Prevent it from doing so when we have an import-marks file but | 
 |    haven't finished reading it. | 
 |    (merge f4beed6 fc/fast-import-broken-marks-file later to maint). | 
 |  | 
 |  * "git rebase -i", after it fails to auto-resolve the conflict, had | 
 |    an unnecessary call to "git rerere" from its very early days, which | 
 |    was spotted recently; the call has been removed. | 
 |    (merge 7063693 js/rebase-i-dedup-call-to-rerere later to maint). | 
 |  | 
 |  * Other minor clean-ups and documentation updates | 
 |    (merge cd82b7a pa/cherry-pick-doc-typo later to maint). | 
 |    (merge 2bb73ae rs/patch-id-use-skip-prefix later to maint). | 
 |    (merge aa20cbc rs/apply-name-terminate later to maint). | 
 |    (merge fe17fc0 jc/t2300-setup later to maint). | 
 |    (merge e256eec jk/shell-portability later to maint). |