May 10th, 2013Fixes since v1.8.2.2:
· "rev-list --stdin" and friends kept bogus pointers into the input buffer around as human readable object names. This was not a huge problem but was exposed by a new change that uses these names in error output.
· When "git difftool" drove "kdiff3", it mistakenly passed --auto option that was meant while resolving merge conflicts.
· "git remote add" command did not diagnose extra command line arguments as an error and silently ignored them.
· Also contains a handful of trivial code clean-ups, documentation
· updates, updates to the test suite, etc.
April 27th, 2013UPDATES SINCE V1.8.2:
Foreign interface:
· remote-hg and remote-bzr helpers (in contrib/) have been updated.
UI, Workflows & Features:
· "git branch --vv" learned to paint the name of the branch it integrates with in a different color (color.branch.upstream, which defaults to blue).
· In a sparsely populated working tree, "git checkout " no longer unmarks paths that match the given pathspec that were originally ignored with "--sparse" (use --ignore-skip-worktree-bits option to resurrect these paths out of the index if you really want to).
· "git log --format" specifier learned %C(auto) token that tells Git to use color when interpolating %d (decoration), %h (short commit object name), etc. for terminal output.
· "git bisect" leaves the final outcome as a comment in its bisect log file.
· "git clone --reference" can now refer to a gitfile "textual symlink" that points at the real location of the repository.
· "git count-objects" learned "--human-readable" aka "-H" option to show various large numbers in Ki/Mi/GiB scaled as necessary.
· "git cherry-pick $blob" and "git cherry-pick $tree" are nonsense, and a more readable error message e.g. "can't cherry-pick a tree" is given (we used to say "expected exactly one commit").
· The "--annotate" option to "git send-email" can be turned on (or off) by default with sendemail.annotate configuration variable (you can use --no-annotate from the command line to override it).
· The "--cover-letter" option to "git format-patch" can be turned on (or off) by default with format.coverLetter configuration variable. By setting it to 'auto', you can turn it on only for a series with two or more patches.
· The bash completion support (in contrib/) learned that cherry-pick takes a few more options than it already knew about.
· "git help" learned "-g" option to show the list of guides just like list of commands are given with "-a".
· A triangular "pull from one place, push to another place" workflow is supported better by new remote.pushdefault (overrides the "origin" thing) and branch.*.pushremote (overrides the branch.*.remote) configuration variables.
· "git status" learned to report that you are in the middle of a revert session, just like it does for a cherry-pick and a bisect session.
· The handling by "git branch --set-upstream-to" against various forms of erroneous inputs was suboptimal and has been improved.
· When the interactive access to git-shell is not enabled, it issues a message meant to help the system administrator to enable it. An explicit way to help the end users who connect to the service by issuing custom messages to refuse such an access has been added.
· In addition to the case where the user edits the log message with the "e)dit" option of "am -i", replace the "Applying: this patch" message with the final log message contents after applymsg hook munges it.
· "git status" suggests users to look into using --untracked=no option when it takes too long.
· "git status" shows a bit more information to "git status" during a rebase/bisect session.
· "git fetch" learned to fetch a commit at the tip of an unadvertised ref by specifying a raw object name from the command line when the server side supports this feature.
· Output from "git log --graph" works better with submodule log output now.
· "git count-objects -v" learned to report leftover temporary packfiles and other garbage in the object store.
· A new read-only credential helper (in contrib/) to interact with the .netrc/.authinfo files has been added.
· "git send-email" can be used with the credential helper system.
· There was no Porcelain way to say "I no longer am interested in this submodule", once you express your interest in a submodule with "submodule init". "submodule deinit" is the way to do so.
· "git pull --rebase" learned to pass "-v/-q" options to underlying "git rebase".
· The new "--follow-tags" option tells "git push" to push relevant annotated tags when pushing branches out.
· "git merge" and "git pull" can optionally be told to inspect and reject when merging a commit that does not carry a trusted GPG signature.
· "git mergetool" now feeds files to the "p4merge" backend in the order that matches the p4 convention, where "theirs" is usually shown on the left side, which is the opposite from other backend expects.
· "show/log" now honors gpg.program configuration just like other parts of the code that use GnuPG.
· "git log" that shows the difference between the parent and the child has been optimized somewhat.
· "git difftool" allows the user to write into the temporary files being shown; if the user makes changes to the working tree at the same time, one of the changes has to be lost in such a case, but it tells the user what happened and refrains from overwriting the copy in the working tree.
· There was no good way to ask "I have a random string that came from outside world. I want to turn it into a 40-hex object name while making sure such an object exists". A new peeling suffix ^{object} can be used for that purpose, together with "rev-parse --verify".
Performance, Internal Implementation, etc:
· Updates for building under msvc.
· A handful of issues in the code to traverse working tree to find untracked and/or ignored files have been fixed, and the general codepath involved in "status -u" and "clean" have been cleaned up and optimized.
· The stack footprint of some codepaths that access an object from a pack has been shrunk.
· The logic to coalesce the same lines removed from the parents in the output from "diff -c/--cc" has been updated, but with an O(n^2) complexity, so this might turn out to be undesirable.
· The code to enforce permission bits on files in $GIT_DIR/ for shared repositories have been simplified.
· A few codepaths knew how much data they need to put in the hashtables they use upfront, but still started from a small table repeatedly growing and rehashing.
· The API to walk reflog entries from the latest to older, which was necessary for operations such as "git checkout -", was cumbersome to use correctly and also inefficient.
· Codepaths that inspect log-message-to-be and decide when to add a new Signed-off-by line in various commands have been consolidated.
· The pkt-line API, implementation and its callers have been cleaned up to make them more robust.
· Cygwin port has a faster-but-lying lstat(2) emulation whose incorrectness does not matter in practice except for a few codepaths, and setting permission bits to directories is a codepath that needs to use a more correct one.
· "git checkout" had repeated pathspec matches on the same paths, which have been consolidated. Also a bug in "git checkout dir/" that is started from an unmerged index has been fixed.
· A few bugfixes to "git rerere" working on corner case merge conflicts have been applied.
· Also contains various documentation updates and code clean-ups.
FIXES SINCE V1.8.2:
· When receive-pack detects error in the pack header it received in order to decide which of unpack-objects or index-pack to run, it returned without closing the error stream, which led to a hang sideband thread.
· Zsh completion forgot that '%' character used to signal untracked files needs to be escaped with another '%'.
· A commit object whose author or committer ident are malformed crashed some code that trusted that a name, an email and an timestamp can always be found in it.
· When "upload-pack" fails while generating a pack in response to "git fetch" (or "git clone"), the receiving side mistakenly said there was a programming error to trigger the die handler recursively.
· "rev-list --stdin" and friends kept bogus pointers into input buffer around as human readble object names. This was not a huge problem but was exposed by a new change that uses these names in error output. (merge 70d26c6 tr/copy-revisions-from-stdin later to maint).
· Smart-capable HTTP servers were not restricted via the GIT_NAMESPACE mechanism when talking with commit-walker clients, like they do when talking with smart HTTP clients. (merge 6130f86 jk/http-dumb-namespaces later to maint).
· "git merge-tree" did not omit a merge result that is identical to "our" side in certain cases. (merge aacecc3 jk/merge-tree-added-identically later to maint).
· Perl scripts like "git-svn" closed (not redirecting to /dev/null) the standard error stream, which is not a very smart thing to do. Later open may return file descriptor #2 for unrelated purpose, and error reporting code may write into them.
· "git show-branch" was not prepared to show a very long run of ancestor operators e.g. foobar^2~2^2^2^2...^2~4 correctly.
· "git diff --diff-algorithm algo" is also understood as "git diff --diff-algorithm=algo".
· The new core.commentchar configuration was not applied to a few places.
· "git bundle" did not like a bundle created using a commit without any message as its one of the prerequistes.
· "git log -S/-G" started paying attention to textconv filter, but there was no way to disable this. Make it honor --no-textconv option.
· When used with "-d temporary-directory" option, "git filter-branch" failed to come back to the original working tree to perform the final clean-up procedure.
· "git merge $(git rev-parse v1.8.2)" behaved quite differently from "git merge v1.8.2", as if v1.8.2 were written as v1.8.2^0 and did not pay much attention to the annotated tag payload. Make the code notice the type of the tag object, in addition to the dwim_ref() based classification the current code uses (i.e. the name appears in refs/tags/) to decide when to special case merging of tags.
· Fix 1.8.1.x regression that stopped matching "dir" (without trailing slash) to a directory "dir". (merge efa5f82 jc/directory-attrs-regression-fix later to maint-1.8.1).
· "git apply --whitespace=fix" was not prepared to see a line getting longer after fixing whitespaces (e.g. tab-in-indent aka Python). (merge 329b26e jc/apply-ws-fix-tab-in-indent later to maint-1.8.1).
· The prompt string generator (in contrib/completion/) did not notice when we are in a middle of a "git revert" session.
· "submodule summary --summary-limit" option did not support "--option=value" form.
· "index-pack --fix-thin" used an uninitialized value to compute delta depths of objects it appends to the resulting pack.
· "index-pack --verify-stat" used a few counters outside protection of mutex, possibly showing incorrect numbers.
· The code to keep track of what directory names are known to Git on platforms with case insensitive filesystems can get confused upon a hash collision between these pathnames and looped forever.
· Annotated tags outside refs/tags/ hierarchy were not advertised correctly to the ls-remote and fetch with recent version of Git.
· Recent optimization broke shallow clones.
· "git cmd -- ':(top'" was not diagnosed as an invalid syntax, and instead the parser kept reading beyond the end of the string.
· "git tag -f " always said "Updated tag ''" even when creating a new tag (i.e. not overwriting nor updating).
· "git p4" did not behave well when the path to the root of the P4 client was not its real path. (merge bbd8486 pw/p4-symlinked-root later to maint).
· "git archive" reports a failure when asked to create an archive out of an empty tree. It would be more intuitive to give an empty archive back in such a case.
· When "format-patch" quoted a non-ascii strings on the header files, it incorrectly applied rfc2047 and chopped a single character in the middle of it.
· An aliased command spawned from a bare repository that does not say it is bare with "core.bare = yes" is treated as non-bare by mistake.
· In "git reflog expire", REACHABLE bit was not cleared from the correct objects.
· The logic used by "git diff -M --stat" to shorten the names of files before and after a rename did not work correctly when the common prefix and suffix between the two filenames overlapped.
· The "--match=" option of "git describe", when used with "--all" to allow refs that are not annotated tags to be used as a base of description, did not restrict the output from the command to those that match the given pattern.
· Clarify in the documentation "what" gets pushed to "where" when the command line to "git push" does not say these explicitly.
· The "--color=" argument to the commands in the diff family was described poorly.
· The arguments given to pre-rebase hook were not documented.
· The v4 index format was not documented.
· The "--match=" argument "git describe" takes uses glob pattern but it wasn't obvious from the documentation.
· Some sources failed to compile on systems that lack NI_MAXHOST in their system header (e.g. z/OS).
· Add an example use of "--env-filter" in "filter-branch" documentation.
· "git bundle verify" did not say "records a complete history" for a bundle that does not have any prerequisites.
· In the v1.8.0 era, we changed symbols that do not have to be global to file scope static, but a few functions in graph.c were used by CGit from sideways bypassing the entry points of the API the in-tree users use.
· "git update-index -h" did not do the usual "-h(elp)" thing.
· "git index-pack" had a buffer-overflow while preparing an informational message when the translated version of it was too long.
· 'git commit -m "$msg"' used to add an extra newline even when $msg already ended with one.
· The SSL peer verification done by "git imap-send" did not ask for Server Name Indication (RFC 4366), failing to connect SSL/TLS sites that serve multiple hostnames on a single IP.
· perl/Git.pm::cat_blob slurped everything in core only to write it out to a file descriptor, which was not a very smart thing to do.
· "git branch" did not bother to check nonsense command line parameters and issue errors in many cases.
· Verification of signed tags were not done correctly when not in C or en/US locale.
· Some platforms and users spell UTF-8 differently; retry with the most official "UTF-8" when the system does not understand the user-supplied encoding name that are the common alternative spellings of UTF-8.
· When export-subst is used, "zip" output recorded incorrect size of the file.
· "git am $maildir/" applied messages in an unexpected order; sort filenames read from the maildir/ in a way that is more likely to sort messages in the order the writing MUA meant to, by sorting numeric segment in numeric order and non-numeric segment in alphabetical order.
· "git submodule update", when recursed into sub-submodules, did not accumulate the prefix paths.
April 27th, 2013Fixes since v1.8.2.1:
· Zsh completion forgot that '%' character used to signal untracked files needs to be escaped with another '%'.
· A commit object whose author or committer ident are malformed crashed some code that trusted that a name, an email and an timestamp can always be found in it.
· The new core.commentchar configuration was not applied to a few places.
· "git pull --rebase" did not pass "-v/-q" options to underlying "git rebase".
· When receive-pack detects error in the pack header it received in order to decide which of unpack-objects or index-pack to run, it returned without closing the error stream, which led to a hang sideband thread.
· "git diff --diff-algorithm=algo" was understood by the command line parser, but "git diff --diff-algorithm algo" was not.
· "git log -S/-G" started paying attention to textconv filter, but there was no way to disable this. Make it honor --no-textconv option.
· "git merge $(git rev-parse v1.8.2)" behaved quite differently from "git merge v1.8.2", as if v1.8.2 were written as v1.8.2^0 and did not pay much attention to the annotated tag payload. Make the code notice the type of the tag object, in addition to the dwim_ref() based classification the current code uses (i.e. the name appears in refs/tags/) to decide when to special case merging of tags.
· "git cherry-pick" and "git revert" can take more than one commit on the command line these days, but it was not mentioned on the usage text.
· Perl scripts like "git-svn" closed (not redirecting to /dev/null) the standard error stream, which is not a very smart thing to do. Later open may return file descriptor #2 for unrelated purpose, and error reporting code may write into them.
· "git apply --whitespace=fix" was not prepared to see a line getting longer after fixing whitespaces (e.g. tab-in-indent aka Python).
· "git diff/log --cc" did not work well with options that ignore whitespace changes.
· Documentation on setting up a http server that requires authentication only on the push but not fetch has been clarified.
· A few bugfixes to "git rerere" working on corner case merge conflicts have been applied.
· "git bundle" did not like a bundle created using a commit without any message as its one of the prerequistes.
April 8th, 2013Fixes since v1.8.2:
· An earlier change to the attribute system introduced at v1.8.1.2 by mistake stopped a pattern "dir" (without trailing slash) from matching a directory "dir" (it only wanted to allow pattern "dir/" to also match).
· Verification of signed tags were not done correctly when not in C or en/US locale.
· 'git commit -m "$msg"' used to add an extra newline even when $msg already ended with one.
· The "--match=" option of "git describe", when used with "--all" to allow refs that are not annotated tags to be used as a base of description, did not restrict the output from the command to those that match the given pattern.
· An aliased command spawned from a bare repository that does not say it is bare with "core.bare = yes" is treated as non-bare by mistake.
· When "format-patch" quoted a non-ascii strings on the header files, it incorrectly applied rfc2047 and chopped a single character in the middle of it.
· "git archive" reports a failure when asked to create an archive out of an empty tree. It would be more intuitive to give an empty archive back in such a case.
· "git tag -f " always said "Updated tag ''" even when creating a new tag (i.e. not overwriting nor updating).
· "git cmd -- ':(top'" was not diagnosed as an invalid syntax, and instead the parser kept reading beyond the end of the string.
· Annotated tags outside refs/tags/ hierarchy were not advertised correctly to the ls-remote and fetch with recent version of Git.
· The code to keep track of what directory names are known to Git on platforms with case insensitive filesystems can get confused upon a hash collision between these pathnames and looped forever.
· The logic used by "git diff -M --stat" to shorten the names of files before and after a rename did not work correctly when the common prefix and suffix between the two filenames overlapped.
· "git submodule update", when recursed into sub-submodules, did not acccumulate the prefix paths.
· "git am $maildir/" applied messages in an unexpected order; sort filenames read from the maildir/ in a way that is more likely to sort messages in the order the writing MUA meant to, by sorting numeric segment in numeric order and non-numeric segment in alphabetical order.
· When export-subst is used, "zip" output recorded incorrect size of the file.
· Some platforms and users spell UTF-8 differently; retry with the most official "UTF-8" when the system does not understand the user-supplied encoding name that are the common alternative spellings of UTF-8.
· "git branch" did not bother to check nonsense command line parameters and issue errors in many cases.
· "git update-index -h" did not do the usual "-h(elp)" thing.
· perl/Git.pm::cat_blob slurped everything in core only to write it out to a file descriptor, which was not a very smart thing to do.
· The SSL peer verification done by "git imap-send" did not ask for Server Name Indication (RFC 4366), failing to connect SSL/TLS sites that serve multiple hostnames on a single IP.
· "git index-pack" had a buffer-overflow while preparing an informational message when the translated version of it was too long.
· Clarify in the documentation "what" gets pushed to "where" when the command line to "git push" does not say these explicitly.
· In "git reflog expire", REACHABLE bit was not cleared from the correct objects.
· The "--color=" argument to the commands in the diff family was described poorly.
· The arguments given to pre-rebase hook were not documented.
· The v4 index format was not documented.
· The "--match=" argument "git describe" takes uses glob pattern but it wasn't obvious from the documentation.
· Some sources failed to compile on systems that lack NI_MAXHOST in their system header (e.g. z/OS).
· Add an example use of "--env-filter" in "filter-branch" documentation.
· "git bundle verify" did not say "records a complete history" for a bundle that does not have any prerequisites.
· In the v1.8.0 era, we changed symbols that do not have to be global to file scope static, but a few functions in graph.c were used by CGit from sideways bypassing the entry points of the API the in-tree users use.
· "git merge-tree" had a typo in the logic to detect d/f conflicts, which caused it to segfault in some cases.
March 14th, 2013UPDATES SINCE V1.8.1:
UI, Workflows & Features:
· Initial ports to QNX and z/OS UNIX System Services have started.
· Output from the tests is coloured using "green is okay, yellow is questionable, red is bad and blue is informative" scheme.
· Mention of "GIT/Git/git" in the documentation have been updated to be more uniform and consistent. The name of the system and the concept it embodies is "Git"; the command the users type is "git". All-caps "GIT" was merely a way to imitate "Git" typeset in small caps in our ASCII text only documentation and to be avoided.
· The completion script (in contrib/completion) used to let the default completer to suggest pathnames, which gave too many irrelevant choices (e.g. "git add" would not want to add an unmodified path). It learnt to use a more git-aware logic to enumerate only relevant ones.
· In bare repositories, "git shortlog" and other commands now read mailmap files from the tip of the history, to help running these tools in server settings.
· Color specifiers, e.g. "%C(blue)Hello%C(reset)", used in the "--format=" option of "git log" and friends can be disabled when the output is not sent to a terminal by prefixing them with "auto,", e.g. "%C(auto,blue)Hello%C(auto,reset)".
· Scripts can ask Git that wildcard patterns in pathspecs they give do not have any significance, i.e. take them as literal strings.
· The patterns in .gitignore and .gitattributes files can have **/, as a pattern that matches 0 or more levels of subdirectory. E.g. "foo/**/bar" matches "bar" in "foo" itself or in a subdirectory of "foo".
· When giving arguments without "--" disambiguation, object names that come earlier on the command line must not be interpretable as pathspecs and pathspecs that come later on the command line must not be interpretable as object names. This disambiguation rule has been tweaked so that ":/" (no other string before or after) is always interpreted as a pathspec; "git cmd -- :/" is no longer needed, you can just say "git cmd :/".
· Various "hint" lines Git gives when it asks the user to edit messages in the editor are commented out with '#' by default. The core.commentchar configuration variable can be used to customize this '#' to a different character.
· "git add -u" and "git add -A" without pathspec issues warning to make users aware that they are only operating on paths inside the subdirectory they are in. Use ":/" (everything from the top) or "." (everything from the $cwd) to disambiguate.
· "git blame" (and "git diff") learned the "--no-follow" option.
· "git branch" now rejects some nonsense combinations of command line arguments (e.g. giving more than one branch name to rename) with more case-specific error messages.
· "git check-ignore" command to help debugging .gitignore files has been added.
· "git cherry-pick" can be used to replay a root commit to an unborn branch.
· "git commit" can be told to use --cleanup=whitespace by setting the configuration variable commit.cleanup to 'whitespace'.
· "git diff" and other Porcelain commands can be told to use a non-standard algorithm by setting diff.algorithm configuration variable.
· "git fetch --mirror" and fetch that uses other forms of refspec with wildcard used to attempt to update a symbolic ref that match the wildcard on the receiving end, which made little sense (the real ref that is pointed at by the symbolic ref would be updated anyway). Symbolic refs no longer are affected by such a fetch.
· "git format-patch" now detects more cases in which a whole branch is being exported, and uses the description for the branch, when asked to write a cover letter for the series.
· "git format-patch" learned "-v $count" option, and prepends a string "v$count-" to the names of its output files, and also automatically sets the subject prefix to "PATCH v$count". This allows patches from rerolled series to be stored under different names and makes it easier to reuse cover letter messages.
· "git log" and friends can be told with --use-mailmap option to rewrite the names and email addresses of people using the mailmap mechanism.
· "git log --cc --graph" now shows the combined diff output with the ancestry graph.
· "git log --grep=" honors i18n.logoutputencoding to look for the pattern after fixing the log message to the specified encoding.
· "git mergetool" and "git difftool" learned to list the available tool backends in a more consistent manner.
· "git mergetool" is aware of TortoiseGitMerge now and uses it over TortoiseMerge when available.
· "git push" now requires "-f" to update a tag, even if it is a fast-forward, as tags are meant to be fixed points.
· Error messages from "git push" when it stops to prevent remote refs from getting overwritten by mistake have been improved to explain various situations separately.
· "git push" will stop without doing anything if the new "pre-push" hook exists and exits with a failure.
· When "git rebase" fails to generate patches to be applied (e.g. due to oom), it failed to detect the failure and instead behaved as if there were nothing to do. A workaround to use a temporary file has been applied, but we probably would want to revisit this later, as it hurts the common case of not failing at all.
· Input and preconditions to "git reset" has been loosened where appropriate. "git reset $fromtree Makefile" requires $fromtree to be any tree (it used to require it to be a commit), for example. "git reset" (without options or parameters) used to error out when you do not have any commits in your history, but it now gives you an empty index (to match non-existent commit you are not even on).
· "git status" says what branch is being bisected or rebased when able, not just "bisecting" or "rebasing".
· "git submodule" started learning a new mode to integrate with the tip of the remote branch (as opposed to integrating with the commit recorded in the superproject's gitlink).
· "git upload-pack" which implements the service "ls-remote" and "fetch" talk to can be told to hide ref hierarchies the server side internally uses (and that clients have no business learning about) with transfer.hiderefs configuration.
Foreign Interface:
· "git fast-export" has been updated for its use in the context of the remote helper interface.
· A new remote helper to interact with bzr has been added to contrib/.
· "git p4" got various bugfixes around its branch handling. It is also made usable with Python 2.4/2.5. In addition, its various portability issues for Cygwin have been addressed.
· The remote helper to interact with Hg in contrib/ has seen a few fixes.
Performance, Internal Implementation, etc:
· "git fsck" has been taught to be pickier about entries in tree objects that should not be there, e.g. ".", ".git", and "..".
· Matching paths with common forms of pathspecs that contain wildcard characters has been optimized further.
· We stopped paying attention to $GIT_CONFIG environment that points at a single configuration file from any command other than "git config" quite a while ago, but "git clone" internally set, exported, and then unexported the variable during its operation unnecessarily.
· "git reset" internals has been reworked and should be faster in general. We tried to be careful not to break any behaviour but there could be corner cases, especially when running the command from a conflicted state, that we may have missed.
· The implementation of "imap-send" has been updated to reuse xml quoting code from http-push codepath, and lost a lot of unused code.
· There is a simple-minded checker for the test scripts in t/ directory to catch most common mistakes (it is not enabled by default).
· You can build with USE_WILDMATCH=YesPlease to use a replacement implementation of pattern matching logic used for pathname-like things, e.g. refnames and paths in the repository. This new implementation is not expected change the existing behaviour of Git in this release, except for "git for-each-ref" where you can now say "refs/**/master" and match with both refs/heads/master and refs/remotes/origin/master. We plan to use this new implementation in wider places (e.g. "git ls-files '**/Makefile' may find Makefile at the top-level, and "git log '**/t*.sh'" may find commits that touch a shell script whose name begins with "t" at any level) in future versions of Git, but we are not there yet. By building with USE_WILDMATCH, using the resulting Git daily and reporting when you find breakages, you can help us get closer to that goal.
· Some reimplementations of Git do not write all the stat info back to the index due to their implementation limitations (e.g. jgit). A configuration option can tell Git to ignore changes to most of the stat fields and only pay attention to mtime and size, which these implementations can reliably update. This can be used to avoid excessive revalidation of contents.
· Some platforms ship with old version of expat where xmlparse.h needs to be included instead of expat.h; the build procedure has been taught about this.
· "make clean" on platforms that cannot compute header dependencies on the fly did not work with implementations of "rm" that do not like an empty argument list.
· Also contains minor documentation updates and code clean-ups.
FIXES SINCE V1.8.1:
· An element on GIT_CEILING_DIRECTORIES list that does not name the real path to a directory (i.e. a symbolic link) could have caused the GIT_DIR discovery logic to escape the ceiling.
· When attempting to read the XDG-style $HOME/.config/git/config and finding that $HOME/.config/git is a file, we gave a wrong error message, instead of treating the case as "a custom config file does not exist there" and moving on.
· The behaviour visible to the end users was confusing, when they attempt to kill a process spawned in the editor that was in turn launched by Git with SIGINT (or SIGQUIT), as Git would catch that signal and die. We ignore these signals now. (merge 0398fc34 pf/editor-ignore-sigint later to maint).
· A child process that was killed by a signal (e.g. SIGINT) was reported in an inconsistent way depending on how the process was spawned by us, with or without a shell in between.
· After failing to create a temporary file using mkstemp(), failing pathname was not reported correctly on some platforms.
· We used to stuff "user@" and then append what we read from /etc/mailname to come up with a default e-mail ident, but a bug lost the "user@" part.
· The attribute mechanism didn't allow limiting attributes to be applied to only a single directory itself with "path/" like the exclude mechanism does. The initial implementation of this that was merged to 'maint' and 1.8.1.2 was with a severe performance degradations and needs to merge a fix-up topic.
· The smart HTTP clients forgot to verify the content-type that comes back from the server side to make sure that the request is being handled properly.
· "git am" did not parse datestamp correctly from Hg generated patch, when it is run in a locale outside C (or en).
· "git apply" misbehaved when fixing whitespace breakages by removing excess trailing blank lines.
· "git apply --summary" has been taught to make sure the similarity value shown in its output is sensible, even when the input had a bogus value.
· A tar archive created by "git archive" recorded a directory in a way that made NetBSD's implementation of "tar" sometimes unhappy.
· "git archive" did not record uncompressed size in the header when streaming a zip archive, which confused some implementations of unzip.
· "git archive" did not parse configuration values in tar.* namespace correctly. (merge b3873c3 jk/config-parsing-cleanup later to maint).
· Attempt to "branch --edit-description" an existing branch, while being on a detached HEAD, errored out.
· "git clean" showed what it was going to do, but sometimes end up finding that it was not allowed to do so, which resulted in a confusing output (e.g. after saying that it will remove an untracked directory, it found an embedded git repository there which it is not allowed to remove). It now performs the actions and then reports the outcome more faithfully.
· When "git clone --separate-git-dir=$over_there" is interrupted, it failed to remove the real location of the $GIT_DIR it created. This was most visible when interrupting a submodule update.
· "git cvsimport" mishandled timestamps at DST boundary.
· We used to have an arbitrary 32 limit for combined diff input, resulting in incorrect number of leading colons shown when showing the "--raw --cc" output.
· "git fetch --depth" was broken in at least three ways. The resulting history was deeper than specified by one commit, it was unclear how to wipe the shallowness of the repository with the command, and documentation was misleading. (merge cfb70e1 nd/fetch-depth-is-broken later to maint).
· "git log --all -p" that walked refs/notes/textconv/ ref can later try to use the textconv data incorrectly after it gets freed.
· We forgot to close the file descriptor reading from "gpg" output, killing "git log --show-signature" on a long history.
· The way "git svn" asked for password using SSH_ASKPASS and GIT_ASKPASS was not in line with the rest of the system.
· The --graph code fell into infinite loop when asked to do what the code did not expect.
· http transport was wrong to ask for the username when the authentication is done by certificate identity.
· "git pack-refs" that ran in parallel to another process that created new refs had a nasty race.
· Rebasing the history of superproject with change in the submodule has been broken since v1.7.12.
· After "git add -N" and then writing a tree object out of the index, the cache-tree data structure got corrupted.
· "git clone" used to allow --bare and --separate-git-dir=$there options at the same time, which was nonsensical.
· "git rebase --preserve-merges" lost empty merges in recent versions of Git.
· "git merge --no-edit" computed who were involved in the work done on the side branch, even though that information is to be discarded without getting seen in the editor.
· "git merge" started calling prepare-commit-msg hook like "git commit" does some time ago, but forgot to pay attention to the exit status of the hook.
· A failure to push due to non-ff while on an unborn branch dereferenced a NULL pointer when showing an error message.
· When users spell "cc:" in lowercase in the fake "header" in the trailer part, "git send-email" failed to pick up the addresses from there. As e-mail headers field names are case insensitive, this script should follow suit and treat "cc:" and "Cc:" the same way.
· Output from "git status --ignored" showed an unexpected interaction with "--untracked".
· "gitweb", when sorting by age to show repositories with new activities first, used to sort repositories with absolutely nothing in it early, which was not very useful.
· "gitweb"'s code to sanitize control characters before passing it to "highlight" filter lost known-to-be-safe control characters by mistake.
· "gitweb" pages served over HTTPS, when configured to show picon or gravatar, referred to these external resources to be fetched via HTTP, resulting in mixed contents warning in browsers.
· When a line to be wrapped has a solid run of non space characters whose length exactly is the wrap width, "git shortlog -w" failed to add a newline after such a line.
· Command line completion leaked an unnecessary error message while looking for possible matches with paths in .
· Command line completion for "tcsh" emitted an unwanted space after completing a single directory name.
· Command line completion code was inadvertently made incompatible with older versions of bash by using a newer array notation.
· "git push" was taught to refuse updating the branch that is currently checked out long time ago, but the user manual was left stale. (merge 50995ed wk/man-deny-current-branch-is-default-these-days later to maint).
· Some shells do not behave correctly when IFS is unset; work it around by explicitly setting it to the default value.
· Some scripted programs written in Python did not get updated when PYTHON_PATH changed. (cherry-pick 96a4647fca54031974cd6ad1 later to maint).
· When autoconf is used, any build on a different commit always ran "config.status --recheck" even when unnecessary.
· A fix was added to the build procedure to work around buggy versions of ccache broke the auto-generation of dependencies, which unfortunately is still relevant because some people use ancient distros.
· The autoconf subsystem passed --mandir down to generated config.mak.autogen but forgot to do the same for --htmldir. (merge 55d9bf0 ct/autoconf-htmldir later to maint).
· A change made on v1.8.1.x maintenance track had a nasty regression to break the build when autoconf is used. (merge 7f1b697 jn/less-reconfigure later to maint).
· We have been carrying a translated and long-unmaintained copy of an old version of the tutorial; removed.
· t0050 had tests expecting failures from a bug that was fixed some time ago.
· t4014, t9502 and t0200 tests had various portability issues that broke on OpenBSD.
· t9020 and t3600 tests had various portability issues.
· t9200 runs "cvs init" on a directory that already exists, but a platform can configure this fail for the current user (e.g. you need to be in the cvsadmin group on NetBSD 6.0).
· t9020 and t9810 had a few non-portable shell script construct.
· Scripts to test bash completion was inherently flaky as it was affected by whatever random things the user may have on $PATH.
· An element on GIT_CEILING_DIRECTORIES could be a "logical" pathname that uses a symbolic link to point at somewhere else (e.g. /home/me that points at /net/host/export/home/me, and the latter directory is automounted). Earlier when Git saw such a pathname e.g. /home/me on this environment variable, the "ceiling" mechanism did not take effect. With this release (the fix has also been merged to the v1.8.1.x maintenance series), elements on GIT_CEILING_DIRECTORIES are by default checked for such aliasing coming from symbolic links. As this needs to actually resolve symbolic links for each element on the GIT_CEILING_DIRECTORIES, you can disable this mechanism for some elements by listing them after an empty element on the GIT_CEILING_DIRECTORIES. e.g. Setting /home/me::/home/him to GIT_CEILING_DIRECTORIES makes Git resolve symbolic links in /home/me when checking if the current directory is under /home/me, but does not do so for /home/him. (merge 7ec30aa mh/maint-ceil-absolute later to maint).
March 2nd, 2013Fixes since v1.8.1.4:
· Given a string with a multi-byte character that begins with '-' on the command line where an option is expected, the option parser used just one byte of the unknown letter when reporting an error.
· In v1.8.1, the attribute parser was tightened too restrictive to error out upon seeing an entry that begins with an ! (exclamation), which may confuse users to expect a "negative match", which does not exist. This has been demoted to a warning; such an entry is still ignored.
· "git apply --summary" has been taught to make sure the similarity value shown in its output is sensible, even when the input had a bogus value.
· "git clean" showed what it was going to do, but sometimes ended up finding that it was not allowed to do so, which resulted in a confusing output (e.g. after saying that it will remove an untracked directory, it found an embedded git repository there which it is not allowed to remove). It now performs the actions and then reports the outcome more faithfully.
· "git clone" used to allow --bare and --separate-git-dir=$there options at the same time, which was nonsensical.
· "git cvsimport" mishandled timestamps at DST boundary.
· We used to have an arbitrary 32 limit for combined diff input, resulting in incorrect number of leading colons shown when showing the "--raw --cc" output.
· The smart HTTP clients forgot to verify the content-type that comes back from the server side to make sure that the request is being handled properly.
· "git help remote-helpers" failed to find the documentation.
· "gitweb" pages served over HTTPS, when configured to show picon or gravatar, referred to these external resources to be fetched via HTTP, resulting in mixed contents warning in browsers.
· Also contains various documentation fixes.
February 20th, 2013Fixes since v1.8.1.3:
· "git imap-send" talking over imaps:// did make sure it received a valid certificate from the other end, but did not check if the certificate matched the host it thought it was talking to.
· Also contains various documentation fixes.
February 18th, 2013UPDATES SINCE V1.8.1:
UI, Workflows & Features:
· Initial ports to QNX and z/OS UNIX System Services have started.
· Output from the tests is coloured using "green is okay, yellow is questionable, red is bad and blue is informative" scheme.
· Mention of "GIT/Git/git" in the documentation have been updated to be more uniform and consistent. The name of the system and the concept it embodies is "Git"; the command the users type is "git". All-caps "GIT" was merely a way to imitate "Git" typeset in small caps in our ASCII text only documentation and to be avoided.
· The completion script (in contrib/completion) used to let the default completer to suggest pathnames, which gave too many irrelevant choices (e.g. "git add" would not want to add an unmodified path). It learnt to use a more git-aware logic to enumerate only relevant ones.
· In bare repositories, "git shortlog" and other commands now read mailmap files from the tip of the history, to help running these tools in server settings.
· Color specifiers, e.g. "%C(blue)Hello%C(reset)", used in the "--format=" option of "git log" and friends can be disabled when the output is not sent to a terminal by prefixing them with "auto,", e.g. "%C(auto,blue)Hello%C(auto,reset)".
· Scripts can ask Git that wildcard patterns in pathspecs they give do not have any significance, i.e. take them as literal strings.
· The patterns in .gitignore and .gitattributes files can have **/, as a pattern that matches 0 or more levels of subdirectory. E.g. "foo/**/bar" matches "bar" in "foo" itself or in a subdirectory of "foo".
· When giving arguments without "--" disambiguation, object names that come earlier on the command line must not be interpretable as pathspecs and pathspecs that come later on the command line must not be interpretable as object names. This disambiguation rule has been tweaked so that ":/" (no other string before or after) is always interpreted as a pathspec; "git cmd -- :/" is no longer needed, you can just say "git cmd :/".
· Various "hint" lines Git gives when it asks the user to edit messages in the editor are commented out with '#' by default. The core.commentchar configuration variable can be used to customize this '#' to a different character.
· "git add -u" and "git add -A" without pathspec issues warning to make users aware that they are only operating on paths inside the subdirectory they are in. Use ":/" (everything from the top) or "." (everything from the $cwd) to disambiguate.
· "git blame" (and "git diff") learned the "--no-follow" option.
· "git branch" now rejects some nonsense combinations of command line arguments (e.g. giving more than one branch name to rename) with more case-specific error messages.
· "git check-ignore" command to help debugging .gitignore files has been added.
· "git cherry-pick" can be used to replay a root commit to an unborn branch.
· "git commit" can be told to use --cleanup=whitespace by setting the configuration variable commit.cleanup to 'whitespace'.
· "git diff" and other Porcelain commands can be told to use a non-standard algorithm by setting diff.algorithm configuration variable.
· "git fetch --mirror" and fetch that uses other forms of refspec with wildcard used to attempt to update a symbolic ref that match the wildcard on the receiving end, which made little sense (the real ref that is pointed at by the symbolic ref would be updated anyway). Symbolic refs no longer are affected by such a fetch.
· "git format-patch" now detects more cases in which a whole branch is being exported, and uses the description for the branch, when asked to write a cover letter for the series.
· "git format-patch" learned "-v $count" option, and prepends a string "v$count-" to the names of its output files, and also automatically sets the subject prefix to "PATCH v$count". This allows patches from rerolled series to be stored under different names and makes it easier to reuse cover letter messsages.
· "git log" and friends can be told with --use-mailmap option to rewrite the names and email addresses of people using the mailmap mechanism.
· "git log --cc --graph" now shows the combined diff output with the ancestry graph.
· "git log --grep=" honors i18n.logoutputencoding to look for the pattern after fixing the log message to the specified encoding.
· "git mergetool" and "git difftool" learned to list the available tool backends in a more consistent manner.
· "git mergetool" is aware of TortoiseGitMerge now and uses it over TortoiseMerge when available.
· "git push" now requires "-f" to update a tag, even if it is a fast-forward, as tags are meant to be fixed points.
· Error messages from "git push" when it stops to prevent remote refs from getting overwritten by mistake have been improved to explain various situations separately.
· "git push" will stop without doing anything if the new "pre-push" hook exists and exits with a failure.
· When "git rebase" fails to generate patches to be applied (e.g. due to oom), it failed to detect the failure and instead behaved as if there were nothing to do. A workaround to use a temporary file has been applied, but we probably would want to revisit this later, as it hurts the common case of not failing at all.
· Input and preconditions to "git reset" has been loosened where appropriate. "git reset $fromtree Makefile" requires $fromtree to be any tree (it used to require it to be a commit), for example. "git reset" (without options or parameters) used to error out when you do not have any commits in your history, but it now gives you an empty index (to match non-existent commit you are not even on).
· "git status" says what branch is being bisected or rebased when able, not just "bisecting" or "rebasing".
· "git submodule" started learning a new mode to integrate with the tip of the remote branch (as opposed to integrating with the commit recorded in the superproject's gitlink).
· "git upload-pack" which implements the service "ls-remote" and "fetch" talk to can be told to hide ref hierarchies the server side internally uses (and that clients have no business learning about) with transfer.hiderefs configuration.
Foreign Interface:
· "git fast-export" has been updated for its use in the context of the remote helper interface.
· A new remote helper to interact with bzr has been added to contrib/.
· "git p4" got various bugfixes around its branch handling. It is also made usable with Python 2.4/2.5. In addition, its various portability issues for Cygwin have been addressed.
· The remote helper to interact with Hg in contrib/ has seen a few fixes.
Performance, Internal Implementation, etc:
· "git fsck" has been taught to be pickier about entries in tree objects that should not be there, e.g. ".", ".git", and "..".
· Matching paths with common forms of pathspecs that contain wildcard characters has been optimized further.
· We stopped paying attention to $GIT_CONFIG environment that points at a single configuration file from any command other than "git config" quite a while ago, but "git clone" internally set, exported, and then unexported the variable during its operation unnecessarily.
· "git reset" internals has been reworked and should be faster in general. We tried to be careful not to break any behaviour but there could be corner cases, especially when running the command from a conflicted state, that we may have missed.
· The implementation of "imap-send" has been updated to reuse xml quoting code from http-push codepath, and lost a lot of unused code.
· There is a simple-minded checker for the test scripts in t/ directory to catch most common mistakes (it is not enabled by default).
· You can build with USE_WILDMATCH=YesPlease to use a replacement implementation of pattern matching logic used for pathname-like things, e.g. refnames and paths in the repository. This new implementation is not expected change the existing behaviour of Git in this release, except for "git for-each-ref" where you can now say "refs/**/master" and match with both refs/heads/master and refs/remotes/origin/master. We plan to use this new implementation in wider places (e.g. "git ls-files '**/Makefile' may find Makefile at the top-level, and "git log '**/t*.sh'" may find commits that touch a shell script whose name begins with "t" at any level) in future versions of Git, but we are not there yet. By building with USE_WILDMATCH, using the resulting Git daily and reporting when you find breakages, you can help us get closer to that goal.
· Some reimplementations of Git do not write all the stat info back to the index due to their implementation limitations (e.g. jgit). A configuration option can tell Git to ignore changes to most of the stat fields and only pay attention to mtime and size, which these implementations can reliably update. This can be used to avoid excessive revalidation of contents.
· Some platforms ship with old version of expat where xmlparse.h needs to be included instead of expat.h; the build procedure has been taught about this.
· "make clean" on platforms that cannot compute header dependencies on the fly did not work with implementations of "rm" that do not like an empty argument list.
· Also contains minor documentation updates and code clean-ups.
FIXES SINCE V1.8.1:
· Unless otherwise noted, all the fixes since v1.8.1 in the maintenance track are contained in this release (see release notes to them for details).
· An element on GIT_CEILING_DIRECTORIES list that does not name the real path to a directory (i.e. a symbolic link) could have caused the GIT_DIR discovery logic to escape the ceiling.
· When attempting to read the XDG-style $HOME/.config/git/config and finding that $HOME/.config/git is a file, we gave a wrong error message, instead of treating the case as "a custom config file does not exist there" and moving on.
· The behaviour visible to the end users was confusing, when they attempt to kill a process spawned in the editor that was in turn launched by Git with SIGINT (or SIGQUIT), as Git would catch that signal and die. We ignore these signals now. (merge 0398fc34 pf/editor-ignore-sigint later to maint).
· A child process that was killed by a signal (e.g. SIGINT) was reported in an inconsistent way depending on how the process was spawned by us, with or without a shell in between.
· After failing to create a temporary file using mkstemp(), failing pathname was not reported correctly on some platforms.
· We used to stuff "user@" and then append what we read from /etc/mailname to come up with a default e-mail ident, but a bug lost the "user@" part.
· The attribute mechanism didn't allow limiting attributes to be applied to only a single directory itself with "path/" like the exclude mechanism does. The initial implementation of this that was merged to 'maint' and 1.8.1.2 was with a severe performance degradations and needs to merge a fix-up topic.
· The smart HTTP clients forgot to verify the content-type that comes back from the server side to make sure that the request is being handled properly. (merge 3443db5 sp/smart-http-content-type-check later to maint).
· "git am" did not parse datestamp correctly from Hg generated patch, when it is run in a locale outside C (or en).
· "git apply" misbehaved when fixing whitespace breakages by removing excess trailing blank lines.
· "git apply --summary" has been taught to make sure the similarity value shown in its output is sensible, even when the input had a bogus value. (merge afcb6ac jk/apply-similaritly-parsing later to maint).
· A tar archive created by "git archive" recorded a directory in a way that made NetBSD's implementation of "tar" sometimes unhappy.
· "git archive" did not record uncompressed size in the header when streaming a zip archive, which confused some implementations of unzip.
· "git archive" did not parse configuration values in tar.* namespace correctly. (merge b3873c3 jk/config-parsing-cleanup later to maint).
· Attempt to "branch --edit-description" an existing branch, while being on a detached HEAD, errored out.
· "git clean" showed what it was going to do, but sometimes end up finding that it was not allowed to do so, which resulted in a confusing output (e.g. after saying that it will remove an untracked directory, it found an embedded git repository there which it is not allowed to remove). It now performs the actions and then reports the outcome more faithfully. (merge f538a91 zk/clean-report-failure later to maint).
· When "git clone --separate-git-dir=$over_there" is interrupted, it failed to remove the real location of the $GIT_DIR it created. This was most visible when interrupting a submodule update.
· "git cvsimport" mishandled timestamps at DST boundary. (merge 48c9162 bw/get-tz-offset-perl later to maint).
· We used to have an arbitrary 32 limit for combined diff input, resulting in incorrect number of leading colons shown when showing the "--raw --cc" output. (merge edbc00e jc/combine-diff-many-parents later to maint).
· "git fetch --depth" was broken in at least three ways. The resulting history was deeper than specified by one commit, it was unclear how to wipe the shallowness of the repository with the command, and documentation was misleading. (merge cfb70e1 nd/fetch-depth-is-broken later to maint).
· "git log --all -p" that walked refs/notes/textconv/ ref can later try to use the textconv data incorrectly after it gets freed. (merge be5c9fb jk/read-commit-buffer-data-after-free later to maint).
· We forgot to close the file descriptor reading from "gpg" output, killing "git log --show-signature" on a long history.
· The way "git svn" asked for password using SSH_ASKPASS and GIT_ASKPASS was not in line with the rest of the system.
· The --graph code fell into infinite loop when asked to do what the code did not expect.
· http transport was wrong to ask for the username when the authentication is done by certificate identity.
· "git pack-refs" that ran in parallel to another process that created new refs had a nasty race.
· Rebasing the history of superproject with change in the submodule has been broken since v1.7.12.
· After "git add -N" and then writing a tree object out of the index, the cache-tree data structure got corrupted.
· "git clone" used to allow --bare and --separate-git-dir=$there options at the same time, which was nonsensical. (merge 95b63f1 nd/clone-no-separate-git-dir-with-bare later to maint).
· "git rebase --preserve-merges" lost empty merges in recent versions of Git.
· "git merge --no-edit" computed who were involved in the work done on the side branch, even though that information is to be discarded without getting seen in the editor.
· "git merge" started calling prepare-commit-msg hook like "git commit" does some time ago, but forgot to pay attention to the exit status of the hook.
· A failure to push due to non-ff while on an unborn branch dereferenced a NULL pointer when showing an error message.
· When users spell "cc:" in lowercase in the fake "header" in the trailer part, "git send-email" failed to pick up the addresses from there. As e-mail headers field names are case insensitive, this script should follow suit and treat "cc:" and "Cc:" the same way.
· Output from "git status --ignored" showed an unexpected interaction with "--untracked".
· "gitweb", when sorting by age to show repositories with new activities first, used to sort repositories with absolutely nothing in it early, which was not very useful.
· "gitweb"'s code to sanitize control characters before passing it to "highlight" filter lost known-to-be-safe control characters by mistake.
· "gitweb" pages served over HTTPS, when configured to show picon or gravatar, referred to these external resources to be fetched via HTTP, resulting in mixed contents warning in browsers. (merge 5748558 ab/gitweb-use-same-scheme later to maint).
· When a line to be wrapped has a solid run of non space characters whose length exactly is the wrap width, "git shortlog -w" failed to add a newline after such a line.
· Command line completion leaked an unnecessary error message while looking for possible matches with paths in .
· Command line completion for "tcsh" emitted an unwanted space after completing a single directory name.
· Command line completion code was inadvertently made incompatible with older versions of bash by using a newer array notation.
· "git push" was taught to refuse updating the branch that is currently checked out long time ago, but the user manual was left stale. (merge d9be248 wk/man-deny-current-branch-is-default-these-days later to maint).
· Some shells do not behave correctly when IFS is unset; work it around by explicitly setting it to the default value.
· Some scripted programs written in Python did not get updated when PYTHON_PATH changed. (cherry-pick 96a4647fca54031974cd6ad1 later to maint).
· When autoconf is used, any build on a different commit always ran "config.status --recheck" even when unnecessary.
· A fix was added to the build procedure to work around buggy versions of ccache broke the auto-generation of dependencies, which unfortunately is still relevant because some people use ancient distros.
· The autoconf subsystem passed --mandir down to generated config.mak.autogen but forgot to do the same for --htmldir. (merge fc1c541 ct/autoconf-htmldir later to maint).
· We have been carrying a translated and long-unmaintained copy of an old version of the tutorial; removed.
· t0050 had tests expecting failures from a bug that was fixed some time ago.
· t4014, t9502 and t0200 tests had various portability issues that broke on OpenBSD.
· t9020 and t3600 tests had various portability issues.
· t9200 runs "cvs init" on a directory that already exists, but a platform can configure this fail for the current user (e.g. you need to be in the cvsadmin group on NetBSD 6.0).
· t9020 and t9810 had a few non-portable shell script construct.
· Scripts to test bash completion was inherently flaky as it was affected by whatever random things the user may have on $PATH.
February 8th, 2013Fixes since v1.8.1.2:
· The attribute mechanism didn't allow limiting attributes to be applied to only a single directory itself with "path/" like the exclude mechanism does. The fix for this in 1.8.1.2 had performance degradations.
· Command line completion code was inadvertently made incompatible with older versions of bash by using a newer array notation.
· Scripts to test bash completion was inherently flaky as it was affected by whatever random things the user may have on $PATH.
· A fix was added to the build procedure to work around buggy versions of ccache broke the auto-generation of dependencies, which unfortunately is still relevant because some people use ancient distros.
· We used to stuff "user@" and then append what we read from /etc/mailname to come up with a default e-mail ident, but a bug lost the "user@" part.
· "git am" did not parse datestamp correctly from Hg generated patch, when it is run in a locale outside C (or en).
· Attempt to "branch --edit-description" an existing branch, while being on a detached HEAD, errored out.
· "git cherry-pick" did not replay a root commit to an unborn branch.
· We forgot to close the file descriptor reading from "gpg" output, killing "git log --show-signature" on a long history.
· "git rebase --preserve-merges" lost empty merges in recent versions of Git.
· Rebasing the history of superproject with change in the submodule has been broken since v1.7.12.
· A failure to push due to non-ff while on an unborn branch dereferenced a NULL pointer when showing an error message.
· Also contains various documentation fixes.
January 29th, 2013Fixes:
· An element on GIT_CEILING_DIRECTORIES list that does not name the real path to a directory (i.e. a symbolic link) could have caused the GIT_DIR discovery logic to escape the ceiling.
· Command line completion for "tcsh" emitted an unwanted space after completing a single directory name.
· Command line completion leaked an unnecessary error message while looking for possible matches with paths in .
· "git archive" did not record uncompressed size in the header when streaming a zip archive, which confused some implementations of unzip.
· When users spelled "cc:" in lowercase in the fake "header" in the trailer part, "git send-email" failed to pick up the addresses from there. As e-mail headers field names are case insensitive, this script should follow suit and treat "cc:" and "Cc:" the same way.
· Also contains various documentation fixes.
January 15th, 2013Fixes since v1.8.1:
· The attribute mechanism didn't allow limiting attributes to be applied to only a single directory itself with "path/" like the exclude mechanism does.
· When attempting to read the XDG-style $HOME/.config/git/config and finding that $HOME/.config/git is a file, we gave a wrong error message, instead of treating the case as "a custom config file does not exist there" and moving on.
· After failing to create a temporary file using mkstemp(), failing pathname was not reported correctly on some platforms.
· http transport was wrong to ask for the username when the authentication is done by certificate identity.
· The behaviour visible to the end users was confusing, when they attempt to kill a process spawned in the editor that was in turn launched by Git with SIGINT (or SIGQUIT), as Git would catch that signal and die. We ignore these signals now.
· A child process that was killed by a signal (e.g. SIGINT) was reported in an inconsistent way depending on how the process was spawned by us, with or without a shell in between.
· After "git add -N" and then writing a tree object out of the index, the cache-tree data structure got corrupted.
· "git apply" misbehaved when fixing whitespace breakages by removing excess trailing blank lines in some corner cases.
· A tar archive created by "git archive" recorded a directory in a way that made NetBSD's implementation of "tar" sometimes unhappy.
· When "git clone --separate-git-dir=$over_there" is interrupted, it failed to remove the real location of the $GIT_DIR it created. This was most visible when interrupting a submodule update.
· "git fetch --mirror" and fetch that uses other forms of refspec with wildcard used to attempt to update a symbolic ref that match the wildcard on the receiving end, which made little sense (the real ref that is pointed at by the symbolic ref would be updated anyway). Symbolic refs no longer are affected by such a fetch.
· The "log --graph" codepath fell into infinite loop in some corner cases.
· "git merge" started calling prepare-commit-msg hook like "git commit" does some time ago, but forgot to pay attention to the exit status of the hook.
· "git pack-refs" that ran in parallel to another process that created new refs had a race that can lose new ones.
· When a line to be wrapped has a solid run of non space characters whose length exactly is the wrap width, "git shortlog -w" failed to add a newline after such a line.
· The way "git svn" asked for password using SSH_ASKPASS and GIT_ASKPASS was not in line with the rest of the system.
· "gitweb", when sorting by age to show repositories with new activities first, used to sort repositories with absolutely nothing in it early, which was not very useful.
· "gitweb", when sorting by age to show repositories with new activities first, used to sort repositories with absolutely nothing in it early, which was not very useful.
· When autoconf is used, any build on a different commit always ran "config.status --recheck" even when unnecessary.
· Some scripted programs written in Python did not get updated when PYTHON_PATH changed.
· We have been carrying a translated and long-unmaintained copy of an old version of the tutorial; removed.
· Portability issues in many self-test scripts have been addressed.
· Also contains other minor fixes and documentation updates.
January 3rd, 2013UPDATES SINCE V1.8.0:
UI, Workflows & Features:
· Command-line completion scripts for tcsh and zsh have been added.
· "git-prompt" scriptlet (in contrib/completion) can be told to paint pieces of the hints in the prompt string in colors.
· Some documentation pages that used to ship only in the plain text format are now formatted in HTML as well.
· We used to have a workaround for a bug in ancient "less" that causes it to exit without any output when the terminal is resized. The bug has been fixed in "less" version 406 (June 2007), and the workaround has been removed in this release.
· When "git checkout" checks out a branch, it tells the user how far behind (or ahead) the new branch is relative to the remote tracking branch it builds upon. The message now also advises how to sync them up by pushing or pulling. This can be disabled with the advice.statusHints configuration variable.
· "git config --get" used to diagnose presence of multiple definitions of the same variable in the same configuration file as an error, but it now applies the "last one wins" rule used by the internal configuration logic. Strictly speaking, this may be an API regression but it is expected that nobody will notice it in practice.
· A new configuration variable "diff.context" can be used to give the default number of context lines in the patch output, to override the hardcoded default of 3 lines.
· "git format-patch" learned the "--notes=" option to give notes for the commit after the three-dash lines in its output.
· "git log -p -S" now looks for the after applying the textconv filter (if defined); earlier it inspected the contents of the blobs without filtering.
· "git log --grep=" learned to honor the "grep.patterntype" configuration set to "perl".
· "git replace -d " now interprets as an extended SHA-1 (e.g. HEAD~4 is allowed), instead of only accepting full hex object name.
· "git rm $submodule" used to punt on removing a submodule working tree to avoid losing the repository embedded in it. Because recent git uses a mechanism to separate the submodule repository from the submodule working tree, "git rm" learned to detect this case and removes the submodule working tree when it is safe to do so.
· "git send-email" used to prompt for the sender address, even when the committer identity is well specified (e.g. via user.name and user.email configuration variables). The command no longer gives this prompt when not necessary.
· "git send-email" did not allow non-address garbage strings to appear after addresses on Cc: lines in the patch files (and when told to pick them up to find more recipients). The command now strips " # for v3.2 and up" part before adding the remainder of this line to the list of recipients.
· "git submodule add" learned to add a new submodule at the same path as the path where an unrelated submodule was bound to in an existing revision via the "--name" option.
· "git submodule sync" learned the "--recursive" option.
· "diff.submodule" configuration variable can be used to give custom default value to the "git diff --submodule" option.
· "git symbolic-ref" learned the "-d $symref" option to delete the named symbolic ref, which is more intuitive way to spell it than "update-ref -d --no-deref $symref".
Foreign Interface:
· "git cvsimport" can be told to record timezones (other than GMT) per-author via its author info file.
· The remote helper interface to interact with subversion repositories (one of the GSoC 2012 projects) has been merged.
· A new remote-helper interface for Mercurial has been added to contrib/remote-helpers.
· The documentation for git(1) was pointing at a page at an external site for the list of authors that no longer existed. The link has been updated to point at an alternative site.
Performance, Internal Implementation, etc:
· Compilation on Cygwin with newer header files are supported now.
· A couple of low-level implementation updates on MinGW.
· The logic to generate the initial advertisement from "upload-pack" (i.e. what is invoked by "git fetch" on the other side of the connection) to list what refs are available in the repository has been optimized.
· The logic to find set of attributes that match a given path has been optimized.
· Use preloadindex in "git diff-index" and "git update-index", which has a nice speedup on systems with slow stat calls (and even on Linux).
· Also contains minor documentation updates and code clean-ups.
FIXES SINCE V1.8.0:
· The configuration parser had an unnecessary hardcoded limit on variable names that was not checked consistently.
· The "say" function in the test scaffolding incorrectly allowed "echo" to interpret "\a" as if it were a C-string asking for a BEL output.
· "git mergetool" feeds /dev/null as a common ancestor when dealing with an add/add conflict, but p4merge backend cannot handle it. Work it around by passing a temporary empty file.
· "git log -F -E --grep=''" failed to use the given pattern as extended regular expression, and instead looked for the string literally.
· "git grep -e pattern " asked the attribute system to read ":.gitattributes" file in the working tree, which was nonsense.
· A symbolic ref refs/heads/SYM was not correctly removed with "git branch -d SYM"; the command removed the ref pointed by SYM instead.
· Update "remote tracking branch" in the documentation to "remote-tracking branch".
· "git pull --rebase" run while the HEAD is detached tried to find the upstream branch of the detached HEAD (which by definition does not exist) and emitted unnecessary error messages.
· The refs/replace hierarchy was not mentioned in the repository-layout docs.
· Various rfc2047 quoting issues around a non-ASCII name on the From: line in the output from format-patch have been corrected.
· Sometimes curl_multi_timeout() function suggested a wrong timeout value when there is no file descriptor to wait on and the http transport ended up sleeping for minutes in select(2) system call. A workaround has been added for this.
· For a fetch refspec (or the result of applying wildcard on one), we always want the RHS to map to something inside "refs/" hierarchy, but the logic to check it was not exactly right. (merge 5c08c1f jc/maint-fetch-tighten-refname-check later to maint).
· "git diff -G" did not honor textconv filter when looking for changes.
· Some HTTP servers ask for auth only during the actual packing phase (not in ls-remote phase); this is not really a recommended configuration, but the clients used to fail to authenticate with such servers. (merge 2e736fd jk/maint-http-half-auth-fetch later to maint).
· "git p4" used to try expanding malformed "$keyword$" that spans across multiple lines.
· Syntax highlighting in "gitweb" was not quite working.
· RSS feed from "gitweb" had a xss hole in its title output.
· "git config --path $key" segfaulted on "[section] key" (a boolean "true" spelled without "=", not "[section] key = true").
· "git checkout -b foo" while on an unborn branch did not say "Switched to a new branch 'foo'" like other cases.
· Various codepaths have workaround for a common misconfiguration to spell "UTF-8" as "utf8", but it was not used uniformly. Most notably, mailinfo (which is used by "git am") lacked this support.
· We failed to mention a file without any content change but whose permission bit was modified, or (worse yet) a new file without any content in the "git diff --stat" output.
· When "--stat-count" hides a diffstat for binary contents, the total number of added and removed lines at the bottom was computed incorrectly.
· When "--stat-count" hides a diffstat for unmerged paths, the total number of affected files at the bottom of the "diff --stat" output was computed incorrectly.
· "diff --shortstat" miscounted the total number of affected files when there were unmerged paths.
· "update-ref -d --deref SYM" to delete a ref through a symbolic ref that points to it did not remove it correctly.
December 28th, 2012Fixes since v1.8.0.2:
· "git log -p -S" did not apply the textconv filter while looking for the .
· In the documentation, some invalid example e-mail addresses were formatted into mailto: links.
· Also contains many documentation updates backported from the 'master' branch that is preparing for the upcoming 1.8.1 release.
December 11th, 2012Fixes since v1.8.0.1:
· Various codepaths have workaround for a common misconfiguration to spell "UTF-8" as "utf8", but it was not used uniformly. Most notably, mailinfo (which is used by "git am") lacked this support.
· We failed to mention a file without any content change but whose permission bit was modified, or (worse yet) a new file without any content in the "git diff --stat" output.
· When "--stat-count" hides a diffstat for binary contents, the total number of added and removed lines at the bottom was computed incorrectly.
· When "--stat-count" hides a diffstat for unmerged paths, the total number of affected files at the bottom of the "diff --stat" output was computed incorrectly.
· "diff --shortstat" miscounted the total number of affected files when there were unmerged paths.
· "git p4" used to try expanding malformed "$keyword$" that spans across multiple lines.
· "git update-ref -d --deref SYM" to delete a ref through a symbolic ref that points to it did not remove it correctly.
· Syntax highlighting in "gitweb" was not quite working.
· Also contains other minor fixes and documentation updates.
December 8th, 2012UPDATES SINCE 1.8.0:
UI, Workflows & Features:
· Command-line completion scripts for tcsh and zsh have been added.
· A new remote-helper interface for Mercurial has been added to contrib/remote-helpers.
· We used to have a workaround for a bug in ancient "less" that causes it to exit without any output when the terminal is resized. The bug has been fixed in "less" version 406 (June 2007), and the workaround has been removed in this release.
· Some documentation pages that used to ship only in the plain text format are now formatted in HTML as well.
· "git-prompt" scriptlet (in contrib/completion) can be told to paint pieces of the hints in the prompt string in colors.
· A new configuration variable "diff.context" can be used to give the default number of context lines in the patch output, to override the hardcoded default of 3 lines.
· When "git checkout" checks out a branch, it tells the user how far behind (or ahead) the new branch is relative to the remote tracking branch it builds upon. The message now also advises how to sync them up by pushing or pulling. This can be disabled with the advice.statusHints configuration variable.
· "git config --get" used to diagnose presence of multiple definitions of the same variable in the same configuration file as an error, but it now applies the "last one wins" rule used by the internal configuration logic. Strictly speaking, this may be an API regression but it is expected that nobody will notice it in practice.
· "git log -p -S" now looks for the after applying the textconv filter (if defined); earlier it inspected the contents of the blobs without filtering.
· "git format-patch" learned the "--notes=" option to give notes for the commit after the three-dash lines in its output.
· "git log --grep=" learned to honor the "grep.patterntype" configuration set to "perl".
· "git replace -d " now interprets as an extended SHA-1 (e.g. HEAD~4 is allowed), instead of only accepting full hex object name.
· "git rm $submodule" used to punt on removing a submodule working tree to avoid losing the repository embedded in it. Because recent git uses a mechanism to separate the submodule repository from the submodule working tree, "git rm" learned to detect this case and removes the submodule working tree when it is safe to do so.
· "git send-email" used to prompt for the sender address, even when the committer identity is well specified (e.g. via user.name and user.email configuration variables). The command no longer gives this prompt when not necessary.
· "git send-email" did not allow non-address garbage strings to appear after addresses on Cc: lines in the patch files (and when told to pick them up to find more recipients).
· "git submodule add" learned to add a new submodule at the same path as the path where an unrelated submodule was bound to in an existing revision via the "--name" option.
· "git submodule sync" learned the "--recursive" option.
· "diff.submodule" configuration variable can be used to give custom default value to the "git diff --submodule" option.
· "git symbolic-ref" learned the "-d $symref" option to delete the named symbolic ref, which is more intuitive way to spell it than "update-ref -d --no-deref $symref".
Foreign Interface:
· "git cvsimport" can be told to record timezones (other than GMT) per-author via its author info file.
· The remote helper interface to interact with subversion repositories (one of the GSoC 2012 projects) has been merged.
Performance, Internal Implementation, etc:
· Compilation on Cygwin with newer header files are supported now.
· The logic to generate the initial advertisement from "upload-pack" (i.e. what is invoked by "git fetch" on the other side of the connection) to list what refs are available in the repository has been optimized.
· The logic to find set of attributes that match a given path has been optimized.
· Use preloadindex in "git diff-index" and "git update-index", which has a nice speedup on systems with slow stat calls (and even on Linux).
· Also contains minor documentation updates and code clean-ups.
FIXES SINCE 1.8.0:
· The configuration parser had an unnecessary hardcoded limit on variable names that was not checked consistently. (merge 0971e99 bw/config-lift-variable-name-length-limit later to maint).
· The "say" function in the test scaffolding incorrectly allowed "echo" to interpret "\a" as if it were a C-string asking for a BEL output. (merge 7bc0911 jc/test-say-color-avoid-echo-escape later to maint).
· "git mergetool" feeds /dev/null as a common ancestor when dealing with an add/add conflict, but p4merge backend cannot handle it. Work it around by passing a temporary empty file. (merge 3facc60 da/mergetools-p4 later to maint).
· "git log -F -E --grep=''" failed to use the given pattern as extended regular expression, and instead looked for the string literally. (merge 727b6fc jc/grep-pcre-loose-ends~1 later to maint).
· "git grep -e pattern " asked the attribute system to read ":.gitattributes" file in the working tree, which was nonsense. (merge 55c6168 nd/grep-true-path later to maint).
· A symbolic ref refs/heads/SYM was not correctly removed with "git branch -d SYM"; the command removed the ref pointed by SYM instead. (merge 13baa9f rs/branch-del-symref later to maint).
· Update "remote tracking branch" in the documentation to "remote-tracking branch". (merge a6d3bde mm/maint-doc-remote-tracking later to maint).
· "git pull --rebase" run while the HEAD is detached tried to find the upstream branch of the detached HEAD (which by definition does not exist) and emitted unnecessary error messages. (merge e980765 ph/pull-rebase-detached later to maint).
· The refs/replace hierarchy was not mentioned in the repository-layout docs. (merge 11fbe18 po/maint-refs-replace-docs later to maint).
· Various rfc2047 quoting issues around a non-ASCII name on the From: line in the output from format-patch have been corrected. (merge 25dc8da js/format-2047 later to maint).
· Sometimes curl_multi_timeout() function suggested a wrong timeout value when there is no file descriptor to wait on and the http transport ended up sleeping for minutes in select(2) system call. A workaround has been added for this. (merge 7202b81 sz/maint-curl-multi-timeout later to maint).
· For a fetch refspec (or the result of applying wildcard on one), we always want the RHS to map to something inside "refs/" hierarchy, but the logic to check it was not exactly right. (merge 5c08c1f jc/maint-fetch-tighten-refname-check later to maint).
· "git diff -G" did not honor textconv filter when looking for changes. (merge b1c2f57 jk/maint-diff-grep-textconv later to maint).
· Some HTTP servers ask for auth only during the actual packing phase (not in ls-remote phase); this is not really a recommended configuration, but the clients used to fail to authenticate with such servers. (merge 2e736fd jk/maint-http-half-auth-fetch later to maint).
· "git p4" used to try expanding malformed "$keyword$" that spans across multiple lines. (merge 6b2bf41 pw/maint-p4-rcs-expansion-newline later to maint).
· Syntax highlighting in "gitweb" was not quite working. (merge 048b399 rh/maint-gitweb-highlight-ext later to maint).
· RSS feed from "gitweb" had a xss hole in its title output. (merge 0f0ecf6 jk/maint-gitweb-xss later to maint).
· "git config --path $key" segfaulted on "[section] key" (a boolean "true" spelled without "=", not "[section] key = true"). (merge 962c38e cn/config-missing-path later to maint).
· "git checkout -b foo" while on an unborn branch did not say "Switched to a new branch 'foo'" like other cases. (merge afa8c07 jk/checkout-out-of-unborn later to maint).
· We failed to mention a file without any content change but whose permission bit was modified, or (worse yet) a new file without any content in the "git diff --stat" output. (merge de9095955 lt/diff-stat-show-0-lines later to maint).
· When "--stat-count" hides a diffstat for binary contents, the total number of added and removed lines at the bottom was computed incorrectly. (merge de9095955 lt/diff-stat-show-0-lines later to maint).
· When "--stat-count" hides a diffstat for unmerged paths, the total number of affected files at the bottom of the "diff --stat" output was computed incorrectly. (merge de9095955 lt/diff-stat-show-0-lines later to maint).
· "diff --shortstat" miscounted the total number of affected files when there were unmerged paths. (merge de9095955 lt/diff-stat-show-0-lines later to maint).
· "update-ref -d --deref SYM" to delete a ref through a symbolic ref that points to it did not remove it correctly. (merge b274a71 jh/update-ref-d-through-symref later to maint).
November 26th, 2012Fixes:
· The configuration parser had an unnecessary hardcoded limit on variable names that was not checked consistently.
· The "say" function in the test scaffolding incorrectly allowed "echo" to interpret "\a" as if it were a C-string asking for a BEL output.
· "git mergetool" feeds /dev/null as a common ancestor when dealing with an add/add conflict, but p4merge backend cannot handle it. Work it around by passing a temporary empty file.
· "git log -F -E --grep=''" failed to use the given pattern as extended regular expression, and instead looked for the string literally.
· "git grep -e pattern " asked the attribute system to read ":.gitattributes" file in the working tree, which was nonsense.
· A symbolic ref refs/heads/SYM was not correctly removed with "git branch -d SYM"; the command removed the ref pointed by SYM instead.
· Earlier we fixed documentation to hyphenate "remote-tracking branch" to clarify that these are not a remote entity, but unhyphenated spelling snuck in to a few places since then.
· "git pull --rebase" run while the HEAD is detached tried to find the upstream branch of the detached HEAD (which by definition does not exist) and emitted unnecessary error messages.
· The refs/replace hierarchy was not mentioned in the repository-layout docs.
· Sometimes curl_multi_timeout() function suggested a wrong timeout value when there is no file descriptors to wait on and the http transport ended up sleeping for minutes in select(2) system call. A workaround has been added for this.
· Various rfc2047 quoting issues around a non-ASCII name on the From: line in the output from format-patch have been corrected.
· "git diff -G" did not honor textconv filter when looking for changes.
· Bash completion script (in contrib/) did not correctly complete a lazy "git checkout $name_of_remote_tracking_branch_that_is_unique" command line.
· RSS feed from "gitweb" had a xss hole in its title output.
· "git config --path $key" segfaulted on "[section] key" (a boolean "true" spelled without "=", not "[section] key = true").
· "git checkout -b foo" while on an unborn branch did not say "Switched to a new branch 'foo'" like other cases.
· Also contains other minor fixes and documentation updates.
October 22nd, 2012UPDATES SINCE V1.7.12:
UI, Workflows & Features:
· A credential helper for Win32 to allow access to the keychain of the logged-in user has been added.
· An initial port to HP NonStop.
· A credential helper to allow access to the Gnome keyring has been added.
· When "git am" sanitizes the "Subject:" line, we strip the prefix from "Re: subject" and also from a less common "re: subject", but left the even less common "RE: subject" intact. Now we strip that too.
· It was tempting to say "git branch --set-upstream origin/master", but that tells Git to arrange the local branch "origin/master" to integrate with the currently checked out branch, which is highly unlikely what the user meant. The option is deprecated; use the new "--set-upstream-to" (with a short-and-sweet "-u") option instead.
· "git cherry-pick" learned the "--allow-empty-message" option to allow it to replay a commit without any log message.
· After "git cherry-pick -s" gave control back to the user asking help to resolve conflicts, concluding "git commit" used to need to be run with "-s" if the user wants to sign it off; now the command leaves the sign-off line in the log template.
· "git daemon" learned the "--access-hook" option to allow an external command to decline service based on the client address, repository path, etc.
· "git difftool --dir-diff" learned to use symbolic links to prepare a temporary copy of the working tree when available.
· "git grep" learned to use a non-standard pattern type by default if a configuration variable tells it to.
· Accumulated updates to "git gui" has been merged.
· "git log -g" learned the "--grep-reflog=" option to limit its output to commits with a reflog message that matches the given pattern.
· "git merge-base" learned the "--is-ancestor A B" option to tell if A is an ancestor of B. The result is indicated by its exit status code.
· "git mergetool" now allows users to override the actual command used with the mergetool.$name.cmd configuration variable even for built-in mergetool backends.
· "git rebase -i" learned the "--edit-todo" option to open an editor to edit the instruction sheet.
Foreign Interface:
· "git svn" has been updated to work with SVN 1.7.
· "git p4" learned the "--conflicts" option to specify what to do when encountering a conflict during "p4 submit".
Performance, Internal Implementation, etc.:
· Git ships with a fall-back regexp implementation for platforms with buggy regexp library, but it was easy for people to keep using their platform regexp by mistake. A new test has been added to check this.
· The "check-docs" build target has been updated and greatly simplified.
· The test suite is run under MALLOC_CHECK_ when running with a glibc that supports the feature.
· The documentation in the TeXinfo format was using indented output for materials meant to be examples that are better typeset in monospace.
· Compatibility wrapper around some mkdir(2) implementations that reject parameters with trailing slash has been introduced.
· Compatibility wrapper for systems that lack usable setitimer() has been added.
· The option parsing of "git checkout" had error checking, dwim and defaulting missing options, all mixed in the code, and issuing an appropriate error message with useful context was getting harder. The code has been reorganized to allow giving a proper diagnosis when the user says "git checkout -b -t foo bar" (e.g. "-t" is not a good name for a branch).
· Many internal uses of a "git merge-base" equivalent were only to see if one commit fast-forwards to the other, which did not need the full set of merge bases to be computed. They have been updated to use less expensive checks.
· The heuristics to detect and silently convert latin1 to utf8 when we were told to use utf-8 in the log message has been transplanted from "mailinfo" to "commit" and "commit-tree".
· Messages given by "git -h" from many subcommands have been marked for translation.
· Also contains minor documentation updates and code clean-ups.
FIXES SINCE V1.7.12:
· Unless otherwise noted, all the fixes since v1.7.12 in the
· maintenance track are contained in this release (see release notes
· to them for details).
· The attribute system may be asked for a path that itself or its leading directories no longer exists in the working tree, and it is fine if we cannot open .gitattribute file in such a case. Failure to open per-directory .gitattributes with error status other than ENOENT and ENOTDIR should be diagnosed, but it wasn't.
· When looking for $HOME/.gitconfig etc., it is OK if we cannot read them because they do not exist, but we did not diagnose existing files that we cannot read.
· When "git am" is fed an input that has multiple "Content-type: ..." header, it did not grok charset= attribute correctly.
· "git am" mishandled a patch attached as application/octet-stream (e.g. not text/*); Content-Transfer-Encoding (e.g. base64) was not honored correctly.
· "git blame MAKEFILE" run in a history that has "Makefile" but not "MAKEFILE" should say "No such file MAKEFILE in HEAD", but got confused on a case insensitive filesystem and failed to do so.
· Even during a conflicted merge, "git blame $path" always meant to blame uncommitted changes to the "working tree" version; make it more useful by showing cleanly merged parts as coming from the other branch that is being merged.
· It was unclear in the documentation for "git blame" that it is unnecessary for users to use the "--follow" option.
· Output from "git branch -v" contains "(no branch)" that could be localized, but the code to align it along with the names of branches was counting in bytes, not in display columns.
· "git cherry-pick A C B" used to replay changes in A and then B and then C if these three commits had committer timestamps in that order, which is not what the user who said "A C B" naturally expects.
· A repository created with "git clone --single" had its fetch refspecs set up just like a clone without "--single", leading the subsequent "git fetch" to slurp all the other branches, defeating the whole point of specifying "only this branch".
· Documentation talked about "first line of commit log" when it meant the title of the commit. The description was clarified by defining how the title is decided and rewording the casual mention of "first line" to "title".
· "git cvsimport" did not thoroughly cleanse tag names that it inferred from the names of the tags it obtained from CVS, which caused "git tag" to barf and stop the import in the middle.
· Earlier we made the diffstat summary line that shows the number of lines added/deleted localizable, but it was found irritating having to see them in various languages on a list whose discussion language is English, and this change has been reverted.
· "git fetch --all", when passed "--no-tags", did not honor the "--no-tags" option while fetching from individual remotes (the same issue existed with "--tags", but the combination "--all --tags" makes much less sense than "--all --no-tags").
· "git fetch" over http had an old workaround for an unlikely server misconfiguration; it turns out that this hurts debuggability of the configuration in general, and has been reverted.
· "git fetch" over http advertised that it supports "deflate", which is much less common, and did not advertise the more common "gzip" on its Accept-Encoding header.
· "git fetch" over the dumb-http revision walker could segfault when curl's multi interface was used.
· "git gc --auto" notified the user that auto-packing has triggered even under the "--quiet" option.
· After "gitk" showed the contents of a tag, neither "Reread references" nor "Reload" updated what is shown as the contents of it when the user overwrote the tag with "git tag -f".
· "git log --all-match --grep=A --grep=B" ought to show commits that mention both A and B, but when these three options are used with --author or --committer, it showed commits that mention either A or B (or both) instead.
· The "-Xours" backend option to "git merge -s recursive" was ignored for binary files.
· "git p4", when "--use-client-spec" and "--detect-branches" are used together, misdetected branches.
· "git receive-pack" (the counterpart to "git push") did not give progress output while processing objects it received to the puser when run over the smart-http protocol.
· When you misspell the command name you give to the "exec" action in the "git rebase -i" instruction sheet you were told that 'rebase' is not a git subcommand from "git rebase --continue".
· The subcommand in "git remote" to remove a defined remote was "rm" and the command did not take a fully-spelled "remove".
· The interactive prompt that "git send-email" gives was error prone. It asked "What e-mail address do you want to use?" with the address it guessed (correctly) the user would want to use in its prompt, tempting the user to say "y". But the response was taken as "No, please use 'y' as the e-mail address instead", which is most certainly not what the user meant.
· "git show --format='%ci'" did not give the timestamp correctly for commits created without human readable name on the "committer" line.
· "git show --quiet" ought to be a synonym for "git show -s", but wasn't.
· "git submodule frotz" was not diagnosed as "frotz" being an unknown subcommand to "git submodule"; the user instead got a complaint that "git submodule status" was run with an unknown path "frotz".
· "git status" honored the ignore=dirty settings in .gitmodules but "git commit" didn't.
· "gitweb" did not give the correct committer timezone in its feed output due to a typo.
October 18th, 2012Fixes since v1.7.12.3:
· "git fetch" over the dumb-http revision walker could segfault when curl's multi interface was used.
· It was possible to give specific paths for "asciidoc" and other tools in the documentation toolchain, but not for "xmlto".
· "gitweb" did not give the correct committer timezone in its feed output due to a typo.
· The "-Xours" (and similarly -Xtheirs) backend option to "git merge -s recursive" was ignored for binary files. Now it is honored.
· The "binary" synthetic attribute made "diff" to treat the path as binary, but not "merge".
· Also contains many documentation updates.
October 12th, 2012· In the next major release (not the 1.8.0 release, but the one that follows it, perhaps 1.9 or 2.0), we will change the behavior of the "git push" command. When "git push [$there]" does not say what to push, we have traditionally used the "matching" semantics (all your branches were sent to the remote as long as there already are branches of the same name over there). We will use the "simple" semantics, that pushes the current branch to the branch with the same name but only when the current branch is set to integrate with that remote branch.
· There is a user preference configuration variable "push.default" to change this, and in 1.8.0 release, "git push" will start warning qabout the upcoming change until you set this variable.
· When "git am" is fed an input that has multiple "Content-type: ..." header, it did not grok charset= attribute correctly. It also mishandled a patch attached as application/octet-stream (e.g. not text/*); Content-Transfer-Encoding (e.g. base64) was not honored correctly.
· Even during a conflicted merge, "git blame $path" always meant to blame uncommitted changes to the working tree version. The command has been updated to show cleanly merged parts as coming from the other branch that is being merged.
· "git branch --set-upstream" is deprecated and may be removed in a relatively distant future. "git branch [-u|--set-upstream-to]" has been introduced with a saner order of arguments.
· "git cherry-pick A C B" used to replay changes in A and then B and then C if these three commits had committer timestamps in that order; now it replays them in the order the user told it to, i.e. "A C B", which is what the user naturally expects.
· A repository created with "git clone --single" had its fetch refspecs set up just like a clone without "--single", leading the subsequent "git fetch" to slurp all the other branches, defeating the whole point of specifying "only this branch" in the first place.
· "git log --all-match --grep=A --grep=B" ought to show commits that mention both A and B but when these three options are used with --author or --committer, it showed commits that mention either A or B (or both) instead; this has been fixed.
· "git log -g" can be given "--grep-reflog=pattern" option to look for entries with strings that match the given pattern.
· The "-Xours" (and "-Xtheirs") backend option to "git merge -s recursive" now takes effect even on binary files.
· The sub-command in "git remote" to remove a defined remote was "rm" and the command did not take a fully-spelled "remove".
· The interactive prompt "git send-email" gives was error prone. It asked "What e-mail address do you want to use?" with the address it guessed (correctly) the user would want to use in its prompt, tempting the user to say "y". But the response was taken as "No, please use 'y' as my e-mail address instead", which is most certainly not what the user meant; the command asks for confirmation in such a case now.
October 9th, 2012Fixes since v1.7.12.2:
· "git am" mishandled a patch attached as application/octet-stream (e.g. not text/*); Content-Transfer-Encoding (e.g. base64) was not honored correctly.
· It was unclear in the documentation for "git blame" that it is unnecessary for users to use the "--follow" option.
· A repository created with "git clone --single" had its fetch refspecs set up just like a clone without "--single", leading the subsequent "git fetch" to slurp all the other branches, defeating the whole point of specifying "only this branch".
· "git fetch" over http had an old workaround for an unlikely server misconfiguration; it turns out that this hurts debuggability of the configuration in general, and has been reverted.
· "git fetch" over http advertised that it supports "deflate", which is much less common, and did not advertise the more common "gzip" on its Accept-Encoding header.
· "git receive-pack" (the counterpart to "git push") did not give progress output while processing objects it received to the puser when run over the smart-http protocol.
· "git status" honored the ignore=dirty settings in .gitmodules but "git commit" didn't.
· Also contains a handful of documentation updates.
October 2nd, 2012· In the next major release, we will change the behavior of the "git push" command. When "git push [$there]" does not say what to push, we have used the traditional "matching" semantics (all your branches were sent to the remote as long as there already are branches of the same name over there). We will use the "simple" semantics, that pushes the current branch to the branch with the same name only when the current branch is set to integrate with that remote branch. There is a user preference configuration variable "push.default" to change this, and "git push" will warn about the upcoming change until you set this variable.
· "git branch --set-upstream" is deprecated and may be removed in a relatively distant future. "git branch [-u|--set-upstream-to]" has been introduced with a saner order of arguments.
· The "-Xours" (and "-Xtheirs") backend option to "git merge -s recursive" now takes effect even on binary files.
· Even during a conflicted merge, "git blame $path" always meant to blame uncommitted changes to the working tree version. The command has been updated to show cleanly merged parts as coming from the other branch that is being merged.
· "git cherry-pick A C B" used to replay changes in A and then B and then C if these three commits had committer timestamps in that order; now it replays them in the order the user told it to, i.e. "A C B", which is what the user naturally expects.
· "git log --all-match --grep=A --grep=B" ought to show commits that mention both A and B but when these three options are used with --author or --committer, it showed commits that mention either A or B (or both) instead; this has been fixed.
· The interactive prompt "git send-email" gives was error prone. It asked "What e-mail address do you want to use?" with the address it guessed (correctly) the user would want to use in its prompt, tempting the user to say "y". But the response was taken as "No, please use 'y' as my e-mail address instead", which is most certainly not what the user meant; the command asks for confirmation in such a case now.
October 1st, 2012Fixes since v1.7.12.1:
· When "git am" is fed an input that has multiple "Content-type: ..." header, it did not grok charset= attribute correctly.
· Even during a conflicted merge, "git blame $path" always meant to blame uncommitted changes to the "working tree" version; make it more useful by showing cleanly merged parts as coming from the other branch that is being merged.
· "git blame MAKEFILE" run in a history that has "Makefile" but not "MAKEFILE" should say "No such file MAKEFILE in HEAD", but got confused on a case insensitive filesystem and failed to do so.
· "git fetch --all", when passed "--no-tags", did not honor the "--no-tags" option while fetching from individual remotes (the same issue existed with "--tags", but combination "--all --tags" makes much less sense than "--all --no-tags").
· "git log/diff/format-patch --stat" showed the "N line(s) added" comment in user's locale and caused careless submitters to send patches with such a line in them to projects whose project language is not their language, mildly irritating others. Localization to the line has been disabled for now.
· "git log --all-match --grep=A --grep=B" ought to show commits that mention both A and B, but when these three options are used with --author or --committer, it showed commits that mention either A or B (or both) instead.
· The subcommand to remove the definition of a remote in "git remote" was named "rm" even though all other subcommands were spelled out. Introduce "git remote remove" to remove confusion, and keep "rm" as a backward compatible synonym.
· Also contains a handful of documentation updates.
September 19th, 2012Fixes since v1.7.12:
· "git apply -p0" did not parse pathnames on "diff --git" line correctly. This caused patches that had pathnames in no other places to be mistakenly rejected (most notably, binary patch that does not rename nor change mode). Textual patches, renames or mode changes have preimage and postimage pathnames in different places in a form that can be parsed unambiguously and did not suffer from this problem.
· "git cherry-pick A C B" used to replay changes in A and then B and then C if these three commits had committer timestamps in that order, which is not what the user who said "A C B" naturally expects.
· "git commit --amend" let the user edit the log message and then died when the human-readable committer name was given insufficiently by getpwent(3).
· Some capabilities were asked by fetch-pack even when upload-pack did not advertise that they are available. fetch-pack has been fixed not to do so.
· "git diff" had a confusion between taking data from a path in the working tree and taking data from an object that happens to have name 0{40} recorded in a tree.
· "git for-each-ref" did not correctly support more than one --sort option.
· "git log .." errored out saying it is both rev range and a path when there is no disambiguating "--" is on the command line. Update the command line parser to interpret ".." as a path in such a case.
· The "--topo-order", "--date-order" (and the lack of either means the default order) options to "rev-list" and "log" family of commands were poorly described in the documentation.
· "git prune" without "-v" used to warn about leftover temporary files (which is an indication of an earlier aborted operation).
· Pushing to smart HTTP server with recent Git fails without having the username in the URL to force authentication, if the server is configured to allow GET anonymously, while requiring authentication for POST.
· The reflog entries left by "git rebase" and "git rebase -i" were inconsistent (the interactive one gave an abbreviated object name).
· When "git push" triggered the automatic gc on the receiving end, a message from "git prune" that said it was removing cruft leaked to the standard output, breaking the communication protocol.
· "git show --quiet" ought to be a synonym for "git show -s", but wasn't.
· "git show --format='%ci'" did not give timestamp correctly for commits created without human readable name on "committer" line.
· "git send-email" did not unquote encoded words that appear on the header correctly, and lost "_" from strings.
· The interactive prompt "git send-email" gives was error prone. It asked "What e-mail address do you want to use?" with the address it guessed (correctly) the user would want to use in its prompt, tempting the user to say "y". But the response was taken as "No, please use 'y' as the e-mail address instead", which is most certainly not what the user meant.
· "gitweb" when used with PATH_INFO failed to notice directories with SP (and other characters that need URL-style quoting) in them.
· When the user gives an argument that can be taken as both a revision name and a pathname without disambiguating with "--", we used to give a help message "Use '--' to separate". The message has been clarified to show where that '--' goes on the command line.
· When the user exports a non-default IFS without HT, scripts that rely on being able to parse "ls-files -s | while read a b c..." started to fail. Protect them from such a misconfiguration.
· The attribute system may be asked for a path that itself or its leading directories no longer exists in the working tree, and it is fine if we cannot open .gitattribute file in such a case. Failure to open per-directory .gitattributes with error status other than ENOENT and ENOTDIR should be diagnosed, but it wasn't.
· After "gitk" showed the contents of a tag, neither "Reread references" nor "Reload" did not update what is shown as the contents of it, when the user overwrote the tag with "git tag -f".
· "ciabot" script (in contrib/) has been updated with extensive documentation.
· "git-jump" script (in contrib/) did not work well when diff.noprefix or diff.mnemonicprefix is in effect.
· Older parts of the documentation described as if having a regular file in .git/refs/ hierarchy were the only way to have branches and tags, which is not true for quite some time.
· A utility shell function test_seq has been added as a replacement for the 'seq' utility found on some platforms.
· Compatibility wrapper to learn the maximum number of file descriptors we can open around sysconf(_SC_OPEN_MAX) and getrlimit(RLIMIT_NO_FILE) has been introduced for portability.
· We used curl_easy_strerror() without checking version of cURL, breaking the build for versions before curl 7.12.0.
· Code to work around MacOS X UTF-8 gotcha has been cleaned up.
· Fallback 'getpass' implementation made unportable use of stdio API.
· The "--rebase" option to "git pull" can be abbreviated to "-r", but we didn't document it.
· It was generally understood that "--long-option"s to many of our subcommands can be abbreviated to the unique prefix, but it was not easy to find it described for new readers of the documentation set.
· The synopsis said "checkout [-B branch]" to make it clear the branch name is a parameter to the option, but the heading for the option description was "-B::", not "-B branch::", making the documentation misleading.
· Also contains numerous documentation updates.
August 30th, 2012Updates since v1.7.11:
UI, Workflows & Features:
· Git can be told to normalize pathnames it read from readdir(3) and all arguments it got from the command line into precomposed UTF-8 (assuming that they come as decomposed UTF-8), in order to work around issues on Mac OS.
· I think there still are other places that need conversion (e.g. paths that are read from stdin for some commands), but this should be a good first step in the right direction.
· Per-user $HOME/.gitconfig file can optionally be stored in $HOME/.config/git/config instead, which is in line with XDG.
· The value of core.attributesfile and core.excludesfile default to $HOME/.config/git/attributes and $HOME/.config/git/ignore respectively when these files exist.
· Logic to disambiguate abbreviated object names have been taught to take advantage of object types that are expected in the context, e.g. XXXXXX in the "git describe" output v1.2.3-gXXXXXX must be a commit object, not a blob nor a tree. This will help us prolong the lifetime of abbreviated object names.
· "git apply" learned to wiggle the base version and perform three-way merge when a patch does not exactly apply to the version you have.
· Scripted Porcelain writers now have access to the credential API via the "git credential" plumbing command.
· "git help" used to always default to "man" format even on platforms where "man" viewer is not widely available.
· "git clone --local $path" started its life as an experiment to optionally use link/copy when cloning a repository on the disk, but we didn't deprecate it after we made the option a no-op to always use the optimization. The command learned "--no-local" option to turn this off, as a more explicit alternative over use of file:// URL.
· "git fetch" and friends used to say "remote side hung up unexpectedly" when they failed to get response they expect from the other side, but one common reason why they don't get expected response is that the remote repository does not exist or cannot be read. The error message in this case was updated to give better hints to the user.
· "git help -w $cmd" can show HTML version of documentation for "git-$cmd" by setting help.htmlpath to somewhere other than the default location where the build procedure installs them locally; the variable can even point at a http:// URL.
· "git rebase [-i] --root $tip" can now be used to rewrite all the history leading to "$tip" down to the root commit.
· "git rebase -i" learned "-x " to insert "exec " after each commit in the resulting history.
· "git status" gives finer classification to various states of paths in conflicted state and offer advice messages in its output.
· "git submodule" learned to deal with nested submodule structure where a module is contained within a module whose origin is specified as a relative URL to its superproject's origin.
· A rather heavy-ish "git completion" script has been split to create a separate "git prompting" script, to help lazy-autoloading of the completion part while making prompting part always available.
· "gitweb" pays attention to various forms of credits that are similar to "Signed-off-by:" lines in the commit objects and highlights them accordingly.
Foreign Interface:
· "mediawiki" remote helper (in contrib/) learned to handle file attachments.
· "git p4" now uses "Jobs:" and "p4 move" when appropriate.
· vcs-svn has been updated to clean-up compilation, lift 32-bit limitations, etc.
Performance, Internal Implementation, etc. (please report possible regressions):
· Some tests showed false failures caused by a bug in ecryptofs.
· We no longer use AsciiDoc7 syntax in our documentation and favor a more modern style.
· "git am --rebasing" codepath was taught to grab authorship, log message and the patch text directly out of existing commits. This will help rebasing commits that have confusing "diff" output in their log messages.
· "git index-pack" and "git pack-objects" use streaming API to read from the object store to avoid having to hold a large blob object in-core while they are doing their thing.
· Code to match paths with exclude patterns learned to avoid calling fnmatch() by comparing fixed leading substring literally when possible.
· "git log -n 1 -- rarely-touched-path" was spending unnecessary cycles after showing the first change to find the next one, only to discard it.
· "git svn" got a large-looking code reorganization at the last minute before the code freeze.
· Also contains minor documentation updates and code clean-ups.
Fixes since v1.7.11:
· Unless otherwise noted, all the fixes since v1.7.11 in the maintenance
· releases are contained in this release (see release notes to them for
· details).
· "git submodule add" was confused when the superproject did not have its repository in its usual place in the working tree and GIT_DIR and GIT_WORK_TREE was used to access it.
· "git commit --amend" let the user edit the log message and then died when the human-readable committer name was given insufficiently by getpwent(3).
July 31st, 2012Fixes since v1.7.11.3:
· "$GIT_DIR/COMMIT_EDITMSG" file that is used to hold the commit log message user edits was not documented.
· The advise() function did not use varargs correctly to format its message.
· When "git am" failed, old timers knew to check .git/rebase-apply/patch to see what went wrong, but we never told the users about it.
· "git commit-tree" learned a more natural "-p " order of arguments long time ago, but recently forgot it by mistake.
· "git diff --no-ext-diff" did not output anything for a typechange filepair when GIT_EXTERNAL_DIFF is in effect.
· In 1.7.9 era, we taught "git rebase" about the raw timestamp format but we did not teach the same trick to "filter-branch", which rolled a similar logic on its own.
· When "git submodule add" clones a submodule repository, it can get confused where to store the resulting submodule repository in the superproject's .git/ directory when there is a symbolic link in the path to the current directory.
· Also contains minor typofixes and documentation updates.
July 24th, 2012UPDATES SINCE V1.7.11:
UI, Workflows & Features:
· Git can be told to normalize pathnames it read from readdir(3) and all arguments it got from the command line into precomposed UTF-8 (assuming that they come as decomposed UTF-8), in order to work around issues on Mac OS.
· I think there still are other places that need conversion (e.g. paths that are read from stdin for some commands), but this should be a good first step in the right direction.
· Per-user $HOME/.gitconfig file can optionally be stored in $HOME/.config/git/config instead, which is in line with XDG.
· The value of core.attributesfile and core.excludesfile default to $HOME/.config/attributes and $HOME/.config/ignore respectively when these files exist.
· Logic to disambiguate abbreviated object names have been taught to take advantage of object types that are expected in the context, e.g. XXXXXX in the "git describe" output v1.2.3-gXXXXXX must be a commit object, not a blob nor a tree. This will help us prolong the lifetime of abbreviated object names.
· "git apply" learned to wiggle the base version and perform three-way merge when a patch does not exactly apply to the version you have.
· Scripted Porcelain writers now have access to the credential API via the "git credential" plumbing command.
· "git help" used to always default to "man" format even on platforms where "man" viewer is not widely available.
· "git clone --local $path" started its life as an experiment to optionally use link/copy when cloning a repository on the disk, but we didn't deprecate it after we made the option a no-op to always use the optimization. The command learned "--no-local" option to turn this off, as a more explicit alternative over use of file:// URL.
· "git fetch" and friends used to say "remote side hung up unexpectedly" when they failed to get response they expect from the other side, but one common reason why they don't get expected response is that the remote repository does not exist or cannot be read. The error message in this case was updated to give better hints to the user.
· git native protocol agents learned to show software version over the wire, so that the server log can be examined to see the vintage distribution of clients.
· "git help -w $cmd" can show HTML version of documentation for "git-$cmd" by setting help.htmlpath to somewhere other than the default location where the build procedure installs them locally; the variable can even point at a http:// URL.
· "git rebase [-i] --root $tip" can now be used to rewrite all the history leading to "$tip" down to the root commit.
· "git rebase -i" learned "-x " to insert "exec " after each commit in the resulting history.
· "git status" gives finer classification to various states of paths in conflicted state and offer advice messages in its output.
· "git submodule" learned to deal with nested submodule structure where a module is contained within a module whose origin is specified as a relative URL to its superproject's origin.
· A rather heavy-ish "git completion" script has been split to create a separate "git prompting" script, to help lazy-autoloading of the completion part while making prompting part always available.
· "gitweb" pays attention to various forms of credits that are similar to "Signed-off-by:" lines in the commit objects and highlights them accordingly.
Foreign Interface:
· "mediawiki" remote helper (in contrib/) learned to handle file attachments.
· "git p4" now uses "Jobs:" and "p4 move" when appropriate.
· vcs-svn has been updated to clean-up compilation, lift 32-bit limitations, etc.
Performance, Internal Implementation, etc. (please report possible regressions):
· Some tests showed false failures caused by a bug in ecryptofs.
· We no longer use AsciiDoc7 syntax in our documentation and favor a more modern style.
· "git am --rebasing" codepath was taught to grab authorship, log message and the patch text directly out of existing commits. This will help rebasing commits that have confusing "diff" output in their log messages.
· "git index-pack" and "git pack-objects" use streaming API to read from the object store to avoid having to hold a large blob object in-core while they are doing their thing.
· Code to match paths with exclude patterns learned to avoid calling fnmatch() by comparing fixed leading substring literally when possible.
· "git log -n 1 -- rarely-touched-path" was spending unnecessary cycles after showing the first change to find the next one, only to discard it.
· Also contains minor documentation updates and code clean-ups.
FIXES SINCE V1.7.11:
· Unless otherwise noted, all the fixes since v1.7.11 in the maintenance
· releases are contained in this release (see release notes to them for
· details).
· "git commit-tree" learned a more natural "-p " order of arguments long time ago, but recently forgot it by mistake. (merge 4b7518a kk/maint-commit-tree later to maint).
· "git diff --no-ext-diff" did not output anything for a typechange filepair when GIT_EXTERNAL_DIFF is in effect. (merge c12f82a jv/maint-no-ext-diff later to maint).
· When "git am" failed, old timers knew to check .git/rebase-apply/patch to see what went wrong, but we never told the users about it. (merge 14bf2d5 pg/maint-1.7.9-am-where-is-patch later to maint).
· When "git submodule add" clones a submodule repository, it can get confused where to store the resulting submodule repository in the superproject's .git/ directory when there is a symbolic link in the path to the current directory. (merge 6eafa6d jl/maint-1.7.10-recurse-submodules-with-symlink later to maint).
· In 1.7.9 era, we taught "git rebase" about the raw timestamp format but we did not teach the same trick to "filter-branch", which rolled a similar logic on its own. (merge 44b85e89 jc/maint-filter-branch-epoch-date later to maint).
July 23rd, 2012Fixes since v1.7.11.3:
· The error message from "git push $there :bogo" (and its equivalent "git push $there --delete bogo") mentioned that we tried and failed to guess what ref is being deleted based on the LHS of the refspec, which we don't.
· A handful of files and directories we create had tighter than necessary permission bits when the user wanted to have group writability (e.g. by setting "umask 002").
· "commit --amend" used to refuse amending a commit with an empty log message, with or without "--allow-empty-message".
· "git commit --amend --only --" was meant to allow "Clever" people to rewrite the commit message without making any change even when they have already changes for the next commit added to their index, but it never worked as advertised since it was introduced in 1.3.0 era.
· Even though the index can record pathnames longer than 1
July 12th, 2012Fixes since v1.7.11.1:
· On Cygwin, the platform pread(2) is not thread safe, just like our own compat/ emulation, and cannot be used in the index-pack program. Makefile variable NO_THREAD_SAFE_PREAD can be defined to avoid use of this function in a threaded program.
· "git add" allows adding a regular file to the path where a submodule used to exist, but "git update-index" does not allow an equivalent operation to Porcelain writers.
· "git archive" incorrectly computed the header checksum; the symptom was observed only when using pathnames with hi-bit set.
· "git blame" did not try to make sure that the abbreviated commit object names in its output are unique.
· Running "git bundle verify" on a bundle that records a complete history said "it requires these 0 commits".
· "git clone --single-branch" to clone a single branch did not limit the cloning to the specified branch.
· "git diff --no-index" did not correctly handle relative paths and did not correctly give exit codes when run under "--quiet" option.
· "git diff --no-index" did not work with pagers correctly.
· "git diff COPYING HEAD:COPYING" gave a nonsense error message that claimed that the treeish HEAD did not have COPYING in it.
· When "git log" gets "--simplify-merges/by-decoration" together with "--first-parent", the combination of these options makes the simplification logic to use in-core commit objects that haven't been examined for relevance, either producing incorrect result or taking too long to produce any output. Teach the simplification logic to ignore commits that the first-parent traversal logic ignored when both are in effect to work around the issue.
· "git ls-files --exclude=t -i" did not consider anything under t/ as excluded, as it did not pay attention to exclusion of leading paths while walking the index. Other two users of excluded() are also updated.
· "git request-pull $url dev" when the tip of "dev" branch was tagged with "ext4-for-linus" used the contents from the tag in the output but still asked the "dev" branch to be pulled, not the tag.
· Also contains minor typofixes and documentation updates.
June 22nd, 2012Fixes since v1.7.11:
· The cross links in the HTML version of manual pages were broken.
· Also contains minor typo fixes and documentation updates.
June 18th, 2012UI, Workflows & Features:
· A new mode for push, "simple", which is a cross between "current" and "upstream", has been introduced. "git push" without any refspec will push the current branch out to the same name at the remote repository only when it is set to track the branch with the same name over there. The plan is to make this mode the new default value when push.default is not configured.
· A couple of commands learned the "--column" option to produce columnar output.
· A third-party tool "git subtree" is distributed in contrib/
· A remote helper that acts as a proxy and caches ssl session for the https:// transport is added to the contrib/ area.
· Error messages given when @{u} is used for a branch without its upstream configured have been clarified.
· Even with the "-q"uiet option, "checkout" used to report setting up tracking. Also "branch" learned the "-q"uiet option to squelch informational message.
· Your build platform may support hardlinks but you may prefer not to use them, e.g. when installing to DESTDIR to make a tarball and untarring on a filesystem that has poor support for hardlinks. There is a Makefile option NO_INSTALL_HARDLINKS for you.
· The smart-http backend used to always override GIT_COMMITTER_* variables with REMOTE_USER and REMOTE_ADDR, but these variables are now preserved when set.
· "git am" learned the "--include" option, which is an opposite of existing the "--exclude" option.
· When "git am -3" needs to fall back to an application of the patch to a synthesized preimage followed by a 3-way merge, the paths that needed such treatment are now reported to the end user, so that the result in them can be eyeballed with extra care.
· The output from "diff/log --stat" used to always allocate 4 columns to show the number of modified lines, but not anymore.
· "git difftool" learned the "--dir-diff" option to spawn external diff tools that can compare two directory hierarchies at a time after populating two temporary directories, instead of running an instance of the external tool once per a file pair.
· The "fmt-merge-msg" command learned to list the primary contributors involved in the side topic you are merging in a comment in the merge commit template.
· "git rebase" learned to optionally keep commits that do not introduce any change in the original history.
· "git push --recurse-submodules" learned to optionally look into the histories of submodules bound to the superproject and push them out.
· A 'snapshot' request to "gitweb" honors If-Modified-Since: header, based on the commit date.
· "gitweb" learned to highlight the patch it outputs even more.
Foreign Interface:
· "git svn" used to die with unwanted SIGPIPE when talking with an HTTP server that uses keep-alive.
· "git svn" learned to use platform specific authentication providers, e.g. gnome-keyring, kwallet, etc.
· "git p4" has been moved out of the contrib/ area and has seen more work on importing labels as tags from (and exporting tags as labels to) p4.
Performance and Internal Implementation (please report possible regressions):
· Bash completion script (in contrib/) have been cleaned up to make future work on it simpler.
· An experimental "version 4" format of the index file has been introduced to reduce on-disk footprint and I/O overhead.
· "git archive" learned to produce its output without reading the blob object it writes out in memory in its entirety.
· "git index-pack" that runs when fetching or pushing objects to complete the packfile on the receiving end learned to use multiple threads to do its job when available.
· The code to compute hash values for lines used by the internal diff engine was optimized on little-endian machines, using the same trick the kernel folks came up with.
· "git apply" had some memory leaks plugged.
· Setting up a revision traversal with many starting points was inefficient as these were placed in a date-order priority queue one-by-one. Now they are collected in the queue unordered first, and sorted immediately before getting used.
· More lower-level commands learned to use the streaming API to read from the object store without keeping everything in core.
· The weighting parameters to suggestion command name typo have been tweaked, so that "git tags" will suggest "tag?" and not "stage?".
· Because "sh" on the user's PATH may be utterly broken on some systems, run-command API now uses SHELL_PATH, not /bin/sh, when spawning an external command (not applicable to Windows port).
· The API to iterate over the refs/ hierarchy has been tweaked to allow walking only a subset of it more efficiently.
· Also contains minor documentation updates and code clean-ups.
Fixes since v1.7.10:
· "git submodule init" used to report "registered for path ..." even for submodules that were registered earlier. (cherry-pick c1c259e jl/submodule-report-new-path-once later to maint).
· "git diff --stat" used to fully count a binary file with modified execution bits whose contents is unmodified, which was not quite right.
June 4th, 2012Fixes since v1.7.10.3:
· The message file for Swedish translation has been updated a bit.
· A name taken from mailmap was copied into an internal buffer incorrectly and could overun the buffer if it is too long.
· A malformed commit object that has a header line chomped in the middle could kill git with a NULL pointer dereference.
· An author/committer name that is a single character was mishandled as an invalid name by mistake.
· The progress indicator for a large "git checkout" was sent to stderr even if it is not a terminal.
· "git grep -e '$pattern'", unlike the case where the patterns are read from a file, did not treat individual lines in the given pattern argument as separate regular expressions as it should.
· When "git rebase" was given a bad commit to replay the history on, its error message did not correctly give the command line argument it had trouble parsing.
· Also contains minor fixes and documentation updates.
May 30th, 2012UPDATES SINCE V1.7.10:
UI, Workflows & Features:
· A new mode for push, "simple", which is a cross between "current" and "upstream", has been introduced. "git push" without any refspec will push the current branch out to the same name at the remote repository only when it is set to track the branch with the same name over there. The plan is to make this mode the new default value when push.default is not configured.
· A couple of commands learned the "--column" option to produce columnar output.
· A third-party tool "git subtree" is distributed in contrib/
· Error messages given when @{u} is used for a branch without its upstream configured have been clatified.
· Even with "-q"uiet option, "checkout" used to report setting up tracking. Also "branch" learned the "-q"uiet option to squelch informational message.
· Your build platform may support hardlinks but you may prefer not to use them, e.g. when installing to DESTDIR to make a tarball and untarring on a filesystem that has poor support for hardlinks. There is a Makefile option NO_INSTALL_HARDLINKS for you.
· The smart-http backend used to always override GIT_COMMITTER_* variables with REMOTE_USER and REMOTE_ADDR, but these variables are now preserved when set.
· "git am" learned the "--include" option, which is an opposite of existing the "--exclude" option.
· When "git am -3" needs to fall back to an application to a synthesized preimage followed by a 3-way merge, the paths that needed such treatment are now reported to the end user, so that the result in them can be eyeballed with extra care.
· The output from "diff/log --stat" used to always allocate 4 columns to show the number of modified lines, but not anymore.
· "git difftool" learned the "--dir-diff" option to spawn external diff tools that can compare two directory hierarchies at a time after populating two temporary directories, instead of running an instance of the external tool once per a file pair.
· The "fmt-merge-msg" command learns to list the primary contributors involved in the side topic you are merging.
· "git rebase" learned to optionally keep commits that do not introduce any change in the original history.
· "git push --recurse-submodules" learned to optionally look into the histories of submodules bound to the superproject and push them out.
· A 'snapshot' request to "gitweb" honors If-Modified-Since: header, based on the commit date.
· "gitweb" learned to highlight the patch it outputs even more.
Foreign Interface:
· "git svn" used to die with unwanted SIGPIPE when talking with HTTP server that uses keep-alive.
· "git svn" learned to use platform specific authentication providers, e.g. gnome-keyring, kwallet, etc.
· "git p4" has been moved out of contrib/ area and has seen more work on importing labels as tags from (and exporting tags as labels to) p4.
Performance and Internal Implementation (please report possible regressions):
· Bash completion script (in contrib/) have been cleaned up to make future work on it simpler.
· An experimental "version 4" format of the index file has been introduced to reduce on-disk footprint and I/O overhead.
· "git archive" learned to produce its output without reading the blob object it writes out in memory in its entirety.
· "git index-pack" that runs when fetching or pushing objects to complete the packfile on the receiving end learned to use multiple threads to do its job when available.
· The code to compute hash values for lines used by the internal diff engine was optimized on little-endian machines, using the same trick the kernel folks came up with.
· "git apply" had some memory leaks plugged.
· Setting up a revision traversal with many starting points was inefficient as these were placed in a date-order priority queue one-by-one. Now they are collected in the queue unordered first, and sorted immediately before getting used.
· More lower-level commands learned to use the streaming API to read from the object store without keeping everything in core.
· Because "sh" on the user's PATH may be utterly broken on some systems, run-command API now uses SHELL_PATH, not /bin/sh, when spawning an external command (not applicable to Windows port).
· The API to iterate over refs/ hierarchy has been tweaked to allow walking only a subset of it more efficiently.
· Also contains minor documentation updates and code clean-ups.
FIXES SINCE V1.7.10:
· The progress indicator for a large "git checkout" was sent to stderr even if it is not a terminal. (merge e9fc64c ap/checkout-no-progress-for-non-tty later to maint).
· A name taken from mailmap was copied into an internal buffer incorrectly and could overun the buffer if it is too long. (merge c9b4e9e jk/format-person-part-buffer-limit later to maint).
· A malformed commit object that has a header line chomped in the middle could kill git with a NULL pointer dereference. (merge a9c7a8a jk/pretty-commit-header-incomplete-line later to maint).
· An author/committer name that is a single character was mishandled as an invalid name by mistake. (merge d9955fd jk/ident-split-fix later to maint).
· "git grep -e '$pattern'", unlike the case where the patterns are read from a file, did not treat individual lines in the given pattern argument as separate regular expressions as it should. (merge ec83061 rs/maint-grep-F later to maint).
· "git diff --stat" used to fully count a binary file with modified execution bits whose contents is unmodified, which was not quite right.
May 30th, 2012Fixes since v1.7.10.2:
· The message file for German translation has been updated a bit.
· Running "git checkout" on an unborn branch used to corrupt HEAD.
· When checking out another commit from an already detached state, we used to report all commits that are not reachable from any of the refs as lossage, but some of them might be reachable from the new HEAD, and there is no need to warn about them.
· Some time ago, "git clone" lost the progress output for its "checkout" phase; when run without any "--quiet" option, it should give progress to the lengthy operation.
· The directory path used in "git diff --no-index", when it recurses down, was broken with a recent update after v1.7.10.1 release.
· "log -z --pretty=tformat:..." did not terminate each record with NUL. The fix is not entirely correct when the output also asks for --patch and/or --stat, though.
· The DWIM behaviour for "log --pretty=format:%gd -g" was somewhat broken and gave undue precedence to configured log.date, causing "git stash list" to show "stash@{time stamp string}".
· "git status --porcelain" ignored "--branch" option by mistake. The output for "git status --branch -z" was also incorrect and did not terminate the record for the current branch name with NUL as asked.
· When a submodule repository uses alternate object store mechanism, some commands that were started from the superproject did not notice it and failed with "No such object" errors. The subcommands of "git submodule" command that recursed into the submodule in a separate process were OK; only the ones that cheated and peeked directly into the submodule's repository from the primary process were affected.
· Also contains minor fixes and documentation updates.
May 12th, 2012Fixes since v1.7.10.1:
· The test scaffolding for git-daemon was flaky.
· The test scaffolding for fast-import was flaky.
· The filesystem boundary was not correctly reported when .git directory discovery stopped at a mount point.
· HTTP transport that requires authentication did not work correctly when multiple connections are used simultaneously.
· Minor memory leak during unpack_trees (hence "merge" and "checkout" to check out another branch) has been plugged.
· In the older days, the header "Conflicts:" in "cherry-pick" and "merge" was separated by a blank line from the list of paths that follow for readability, but when "merge" was rewritten in C, we lost it by mistake. Remove the newline from "cherry-pick" to make them match again.
· The command line parser choked "git cherry-pick $name" when $name can be both revision name and a pathname, even though $name can never be a path in the context of the command.
· The "include.path" facility in the configuration mechanism added in 1.7.10 forgot to interpret "~/path" and "~user/path" as it should.
· "git config --rename-section" to rename an existing section into a bogus one did not check the new name.
· The "diff --no-index" codepath used limited-length buffers, risking pathnames getting truncated. Update it to use the strbuf API.
· The report from "git fetch" said "new branch" even for a non branch ref.
· The http-backend (the server side of the smart http transfer) used to overwrite GIT_COMMITTER_NAME and GIT_COMMITTER_EMAIL with the value obtained from REMOTE_USER unconditionally, making it impossible for the server side site-specific customization to use different identity sources to affect the names logged. It now uses REMOTE_USER only as a fallback value.
· "log --graph" was not very friendly with "--stat" option and its output had line breaks at wrong places.
· Octopus merge strategy did not reduce heads that are recorded in the final commit correctly.
· "git push" over smart-http lost progress output a few releases ago; this release resurrects it.
· The error and advice messages given by "git push" when it fails due to non-ff were not very helpful to new users; it has been broken into three cases, and each is given a separate advice message.
· The insn sheet given by "rebase -i" did not make it clear that the insn lines can be re-ordered to affect the order of the commits in the resulting history.
· "git repack" used to write out unreachable objects as loose objects when repacking, even if such loose objects will immediately pruned due to its age.
· A contrib script "rerere-train" did not work out of the box unless user futzed with her $PATH.
· "git rev-parse --show-prefix" used to emit nothing when run at the top-level of the working tree, but now it gives a blank line.
· The i18n of error message "git stash save" was not properly done.
· "git submodule" used a sed script that some platforms mishandled.
· When using a Perl script on a system where "perl" found on user's $PATH could be ancient or otherwise broken, we allow builders to specify the path to a good copy of Perl with $PERL_PATH. The gitweb test forgot to use that Perl when running its test.
· Also contains minor fixes and documentation updates.
May 2nd, 2012Additions since v1.7.10:
· Localization message files for Danish and German have been added.
Fixes since v1.7.10:
· "git add -p" is not designed to deal with unmerged paths but did not exclude them and tried to apply funny patches only to fail.
· "git blame" started missing quite a few changes from the origin since we stopped using the diff minimalization by default in v1.7.2 era.
· When PATH contains an unreadable directory, alias expansion code did not kick in, and failed with an error that said "git-subcmd" was not found.
· "git clean -d -f" (not "-d -f -f") is supposed to protect nested working trees of independent git repositories that exist in the current project working tree from getting removed, but the protection applied only to such working trees that are at the top-level of the current project by mistake.
· "git commit --author=$name" did not tell the name that was being recorded in the resulting commit to hooks, even though it does do so when the end user overrode the authorship via the "GIT_AUTHOR_NAME" environment variable.
· When "git commit --template F" errors out because the user did not touch the message, it claimed that it aborts due to "empty message", which was utterly wrong.
· The regexp configured with diff.wordregex was incorrectly reused across files.
· An age-old corner case bug in combine diff (only triggered with -U0 and the hunk at the beginning of the file needs to be shown) has been fixed.
· Rename detection logic used to match two empty files as renames during merge-recursive, leading to unnatural mismerges.
· The parser in "fast-import" did not diagnose ":9" style references that is not followed by required SP/LF as an error.
· When "git fetch" encounters repositories with too many references, the command line of "fetch-pack" that is run by a helper e.g. remote-curl, may fail to hold all of them. Now such an internal invocation can feed the references through the standard input of "fetch-pack".
· "git fetch" that recurses into submodules on demand did not check if it needs to go into submodules when non branches (most notably, tags) are fetched.
· "log -p --graph" used with "--stat" had a few formatting error.
· Running "notes merge --commit" failed to perform correctly when run from any directory inside $GIT_DIR/. When "notes merge" stops with conflicts, $GIT_DIR/NOTES_MERGE_WORKTREE is the place a user edits to resolve it.
· The 'push to upstream' implementation was broken in some corner cases. "git push $there" without refspec, when the current branch is set to push to a remote different from $there, used to push to $there using the upstream information to a remote unreleated to $there.
· Giving "--continue" to a conflicted "rebase -i" session skipped a commit that only results in changes to submodules.
· Also contains minor fixes and documentation updates.
April 7th, 2012Compatibility Notes:
· From this release on, the "git merge" command in an interactive session will start an editor when it automatically resolves the merge for the user to explain the resulting commit, just like the "git commit" command does when it wasn't given a commit message.
· If you have a script that runs "git merge" and keeps its standard input and output attached to the user's terminal, and if you do not want the user to explain the resulting merge commits, you can export GIT_MERGE_AUTOEDIT environment variable set to "no".
· To disable this behavior (if you want your users to explain their merge commits, you do not have to do anything). Alternatively, you can give the "--no-edit" option to individual invocations of the "git merge" command if you know everybody who uses your script has Git v1.7.8 or newer.
· The "--binary/-b" options to "git am" have been a no-op for quite a while and were deprecated in mid 2008 (v1.6.0). When you give these options to "git am", it will now warn and ask you not to use them.
· When you do not tell which branches and tags to push to the "git push" command in any way, the command used "matching refs" rule to update remote branches and tags with branches and tags with the same name you locally have. In future versions of Git, this will change to push out only your current branch according to either the "upstream" or the "current" rule. Although "upstream" may be more powerful once the user understands Git better, the semantics "current" gives is simpler and easier to understand for beginners and may be a safer and better default option. We haven't decided yet which one to switch to.
Updates since v1.7.9:
UI, Workflows & Features:
· various "gitk" updates. - show the path to the top level directory in the window title - update preference edit dialog - display file list correctly when directories are given on command line - make "git-describe" output in the log message into a clickable link - avoid matching the UNIX timestamp part when searching all fields - give preference to symbolic font names like sans & monospace - allow comparing two commits using a mark - "gitk" honors log.showroot configuration.
· Teams for localizing the messages from the Porcelain layer of commands are starting to form, thanks to Jiang Xin who volunteered to be the localization coordinator. Translated messages for simplified Chinese, Swedish and Portuguese are available.
· The configuration mechanism learned an "include" facility; an assignment to the include.path pseudo-variable causes the named file to be included in-place when Git looks up configuration variables.
· A content filter (clean/smudge) used to be just a way to make the recorded contents "more useful", and allowed to fail; a filter can now optionally be marked as "required".
· Options whose names begin with "--no-" (e.g. the "--no-verify" option of the "git commit" command) can be negated by omitting "no-" from its name, e.g. "git commit --verify".
· "git am" learned to pass "-b" option to underlying "git mailinfo", so that a bracketed string other than "PATCH" at the beginning can be kept.
· "git clone" learned "--single-branch" option to limit cloning to a single branch (surprise!); tags that do not point into the history of the branch are not fetched.
· "git clone" learned to detach the HEAD in the resulting repository when the user specifies a tag with "--branch" (e.g., "--branch=v1.0"). Clone also learned to print the usual "detached HEAD" advice in such a case, similar to "git checkout v1.0".
· When showing a patch while ignoring whitespace changes, the context lines are taken from the postimage, in order to make it easier to view the output.
· "git diff --stat" learned to adjust the width of the output on wider terminals, and give more columns to pathnames as needed.
· "diff-highlight" filter (in contrib/) was updated to produce more aesthetically pleasing output.
· "fsck" learned "--no-dangling" option to omit dangling object information.
· "git log -G" and "git log -S" learned to pay attention to the "-i" option. With "-i", "log -G" ignores the case when finding patch hunks that introduce or remove a string that matches the given pattern. Similarly with "-i", "log -S" ignores the case when finding the commit the given block of text appears or disappears from the file.
· "git merge" in an interactive session learned to spawn the editor by default to let the user edit the auto-generated merge message, to encourage people to explain their merges better. Legacy scripts can export GIT_MERGE_AUTOEDIT=no to retain the historical behavior. Both "git merge" and "git pull" can be given --no-edit from the command line to accept the auto-generated merge message.
· The advice message given when the user didn't give enough clue on what to merge to "git pull" and "git merge" has been updated to be more concise and easier to understand.
· "git push" learned the "--prune" option, similar to "git fetch".
· The whole directory that houses a top-level superproject managed by "git submodule" can be moved to another place.
· "git symbolic-ref" learned the "--short" option to abbreviate the refname it shows unambiguously.
· "git tag --list" can be given "--points-at " to limit its output to those that point at the given object.
· "gitweb" allows intermediate entries in the directory hierarchy that leads to a project to be clicked, which in turn shows the list of projects inside that directory.
· "gitweb" learned to read various pieces of information for the repositories lazily, instead of reading everything that could be needed (including the ones that are not necessary for a specific task).
· Project search in "gitweb" shows the substring that matched in the project name and description highlighted.
· HTTP transport learned to authenticate with a proxy if needed.
· A new script "diffall" is added to contrib/; it drives an external tool to perform a directory diff of two Git revisions in one go, unlike "difftool" that compares one file at a time.
Foreign Interface:
· Improved handling of views, labels and branches in "git-p4" (in contrib).
· "git-p4" (in contrib) suffered from unnecessary merge conflicts when p4 expanded the embedded $RCS$-like keywords; it can be now told to unexpand them.
· Some "git-svn" updates.
· "vcs-svn"/"svn-fe" learned to read dumps with svn-deltas and support incremental imports.
· "git difftool/mergetool" learned to drive DeltaWalker.
Performance:
· Unnecessary calls to parse_object() "git upload-pack" makes in response to "git fetch", have been eliminated, to help performance in repositories with excessive number of refs.
Internal Implementation (please report possible regressions):
· Recursive call chains in "git index-pack" to deal with long delta chains have been flattened, to reduce the stack footprint.
· Use of add_extra_ref() API is now gone, to make it possible to cleanly restructure the overall refs API.
· The command line parser of "git pack-objects" now uses parse-options API.
· The test suite supports the new "test_pause" helper function.
· Parallel to the test suite, there is a beginning of performance benchmarking framework.
· t/Makefile is adjusted to prevent newer versions of GNU make from running tests in seemingly random order.
· The code to check if a path points at a file beyond a symbolic link has been restructured to be thread-safe.
· When pruning directories that has become empty during "git prune" and "git prune-packed", call closedir() that iterates over a directory before rmdir() it.
· Also contains minor documentation updates and code clean-ups.
Fixes since v1.7.9:
· Build with NO_PERL_MAKEMAKER was broken and Git::I18N did not work with versions of Perl older than 5.8.3. (merge 5eb660e ab/perl-i18n later to maint).
· "git tag -s" honored "gpg.program" configuration variable since 1.7.9, but "git tag -v" and "git verify-tag" didn't. (merge a2c2506 az/verify-tag-use-gpg-config later to maint).
· "configure" script learned to take "--with-sane-tool-path" from the command line to record SANE_TOOL_PATH (used to avoid broken platform tools in /usr/bin) in config.mak.autogen. This may be useful for people on Solaris who have saner tools outside /usr/xpg[46]/bin.
· zsh port of bash completion script needed another workaround.
April 4th, 2012· A couple of rather embarrassing last-minute bugs were found and fixed in the updated gitk, and Portuguese translation of the messages has been added.
April 3rd, 2012Fixes since v1.7.9.5:
· "git merge $tag" to merge an annotated tag always opens the editor during an interactive edit session. v1.7.10 series introduced an environment variable GIT_MERGE_AUTOEDIT to help older scripts decline this behavior, but the maintenance track should also support it.
· Also contains minor fixes and documentation updates.
March 29th, 2012· Among the many improvements in the upcoming release is an update to the git merge command.
March 27th, 2012· When "git config" diagnoses an error in a configuration file and shows the line number for the offending line, it miscounted if the error was at the end of line.
· "git fast-import" accepted "ls" command with an empty path by mistake.
· Various new-ish output decoration modes of "git grep" were not documented in the manual's synopsis section.
· The "remaining" subcommand to "git rerere" was not documented.
· "gitweb" used to drop warnings in the log file when "heads" view is accessed in a repository whose HEAD does not point at a valid branch.
· Also contains minor fixes and documentation updates.
March 24th, 2012· From this release on, the "git merge" command in an interactive session will start an editor when it automatically resolves the merge for the user to explain the resulting commit, just like the "git commit" command does when it wasn't given a commit message.
· The "--binary/-b" options to "git am" have been a no-op for quite a while and were deprecated in mid 2008 (v1.6.0). When you give these options to "git am", it will now warn and ask you not to use them.
· When you do not tell which branches and tags to push to the "git push" command in any way, the command used "matching refs" rule to update remote branches and tags with branches and tags with the same name you locally have. In future versions of Git, this will change to use the "upstream" rule to update the branch at the remote you would "pull" from into your current branch with your local current branch. The release after 1.7.10 will start issuing a warning about this change, to encourage you to tell the command what to push out, e.g. by setting push.default configuration.
March 13th, 2012· The code to synthesize the fake ancestor tree used by 3-way merge fallback in "git am" was not prepared to read a patch created with a non-standard -p value.
· "git bundle" did not record boundary commits correctly when there are many of them.
· "git diff-index" and its friends at the plumbing level showed the "diff --git" header and nothing else for a path whose cached stat info is dirty without actual difference when asked to produce a patch. This was a longstanding bug that we could have fixed long time ago.
· "gitweb" did use quotemeta() to prepare search string when asked to do a fixed-string project search, but did not use it by mistake and used the user-supplied string instead.
March 6th, 2012Fixes:
· "git p4" (in contrib/) submit the changes to a wrong place when the "--use-client-spec" option is set.
· The config.mak.autogen generated by optional autoconf support tried to link the binary with -lintl even when libintl.h is missing from the system.
· When the filter driver exits before reading the content before the main git process writes the contents to be filtered to the pipe to it, the latter could be killed with SIGPIPE instead of ignoring such an event as an error.
· "git add --refresh " used to warn about unmerged paths outside the given pathspec.
· The bulk check-in codepath in "git add" streamed contents that needs smudge/clean filters without running them, instead of punting and delegating to the codepath to run filters after slurping everything to core.
· "git branch --with $that" assumed incorrectly that the user will never ask the question with nonsense value in $that.
· "git bundle create" produced a corrupt bundle file upon seeing commits with excessively long subject line.
· When a remote helper exits before reading the blank line from the main git process to signal the end of commands, the latter could be killed with SIGPIPE. Instead we should ignore such event as a non-error.
· The commit log template given with "git merge --edit" did not have a short instructive text like what "git commit" gives.
· "git rev-list --verify-objects -q" omitted the extra verification it needs to do over "git rev-list --objects -q" by mistake.
· "gitweb" used to drop warnings in the log file when "heads" view is accessed in a repository whose HEAD does not point at a valid branch.
· An invalid regular expression pattern given by an end user made "gitweb" to return garbled response.
· Also contains minor fixes and documentation updates.
February 23rd, 2012Fixes:
· Bash completion script (in contrib/) did not like a pattern that begins with a dash to be passed to __git_ps1 helper function.
· Adaptation of the bash completion script (in contrib/) for zsh incorrectly listed all subcommands when "git " was given to ask for list of porcelain subcommands.
· The build procedure for profile-directed optimized binary was not working very well.
· Some systems need to explicitly link -lcharset to get locale_charset().
· t5541 ignored user-supplied port number used for HTTP server testing.
· The error message emitted when we see an empty loose object was not phrased correctly.
· The code to ask for password did not fall back to the terminal input when GIT_ASKPASS is set but does not work (e.g. lack of X with GUI askpass helper).
· We failed to give the true terminal width to any subcommand when they are invoked with the pager, i.e. "git -p cmd".
· map_user() was not rewriting its output correctly, which resulted in the user visible symptom that "git blame -e" sometimes showed excess '>' at the end of email addresses.
· "git checkout -b" did not allow switching out of an unborn branch.
· When you have both .../foo and .../foo.git, "git clone .../foo" did not favor the former but the latter.
· "git commit" refused to create a commit when entries added with "add -N" remained in the index, without telling Git what their content in the next commit should be. We should have created the commit without these paths.
· "git diff --stat" said "files", "insertions", and "deletions" even when it is showing one "file", one "insertion" or one "deletion".
· The output from "git diff --stat" for two paths that have the same amount of changes showed graph bars of different length due to the way we handled rounding errors.
· "git grep" did not pay attention to -diff (hence -binary) attribute.
· The transport programs (fetch, push, clone)ignored --no-progress and showed progress when sending their output to a terminal.
· Sometimes error status detected by a check in an earlier phase of "git receive-pack" (the other end of "git push") was lost by later checks, resulting in false indication of success.
· "git rev-list --verify" sometimes skipped verification depending on the phase of the moon, which dates back to 1.7.8.x series.
· Search box in "gitweb" did not accept non-ASCII characters correctly.
· Search interface of "gitweb" did not show multiple matches in the same file correctly.
· Also contains minor fixes and documentation updates.
February 15th, 2012Fixes since v1.7.9:
· The makefile allowed environment variable X seep into it result in command names suffixed with unnecessary strings.
· The set of included header files in compat/inet-{ntop,pton} wrappers was updated for Windows some time ago, but in a way that broke Solaris build.
· rpmbuild noticed an unpackaged but installed *.mo file and failed.
· Subprocesses spawned from various git programs were often left running to completion even when the top-level process was killed.
· "git add -e" learned not to show a diff for an otherwise unmodified submodule that only has uncommitted local changes in the patch prepared by for the user to edit.
· Typo in "git branch --edit-description my-tpoic" was not diagnosed.
· Using "git grep -l/-L" together with options -W or --break may not make much sense as the output is to only count the number of hits and there is no place for file breaks, but the latter options made "-l/-L" to miscount the hits.
· "git log --first-parent $pathspec" did not stay on the first parent chain and veered into side branch from which the whole change to the specified paths came.
· "git merge --no-edit $tag" failed to honor the --no-edit option.
· "git merge --ff-only $tag" failed because it cannot record the required mergetag without creating a merge, but this is so common operation for branch that is used _only_ to follow the upstream, so it was changed to allow fast-forwarding without recording the mergetag.
· "git mergetool" now gives an empty file as the common base version to the backend when dealing with the "both sides added, differently" case.
· "git push -q" was not sufficiently quiet.
· When "git push" fails to update any refs, the client side did not report an error correctly to the end user.
· "rebase" and "commit --amend" failed to work on commits with ancient timestamps near year 1970.
· When asking for a tag to be pulled, "request-pull" did not show the name of the tag prefixed with "tags/", which would have helped older clients.
· "git submodule add $path" forgot to recompute the name to be stored in .gitmodules when the submodule at $path was once added to the superproject and already initialized.
· Many small corner case bugs on "git tag -n" was corrected.
· Also contains minor fixes and documentation updates.
February 3rd, 2012Updates:
· gitk updates accumulated since early 2011.
· git-gui updated to 0.16.0.
· git-p4 (in contrib/) updates.
· Git uses gettext to translate its most common interface messages into the user's language if translations are available and the locale is appropriately set. Distributors can drop new PO files in po/ to add new translations.
· The code to handle username/password for HTTP transactions used in "git push" & "git fetch" learned to talk "credential API" to external programs to cache or store them, to allow integration with platform native keychain mechanisms.
· The input prompts in the terminal use our own getpass() replacement when possible. HTTP transactions used to ask for the username without echoing back what was typed, but with this change you will see it as you type.
· The internals of "revert/cherry-pick" have been tweaked to prepare building more generic "sequencer" on top of the implementation that drives them.
· "git rev-parse FETCH_HEAD" after "git fetch" without specifying what to fetch from the command line will now show the commit that would be merged if the command were "git pull".
· "git add" learned to stream large files directly into a packfile instead of writing them into individual loose object files.
· "git checkout -B " is a more intuitive way to spell "git reset --keep ".
· "git checkout" and "git merge" learned "--no-overwrite-ignore" option to tell Git that untracked and ignored files are not expendable.
· "git commit --amend" learned "--no-edit" option to say that the user is amending the tree being recorded, without updating the commit log message.
· "git commit" and "git reset" re-learned the optimization to prime the cache-tree information in the index, which makes it faster to write a tree object out after the index entries are updated.
· "git commit" detects and rejects an attempt to stuff NUL byte in the commit log message.
· "git commit" learned "-S" to GPG-sign the commit; this can be shown with the "--show-signature" option to "git log".
· fsck and prune are relatively lengthy operations that still go silent while making the end-user wait. They learned to give progress output like other slow operations.
· The set of built-in function-header patterns for various languages knows MATLAB.
· "git log --format=''" learned new %g[nNeE] specifiers to show information from the reflog entries when walking the reflog (i.e. with "-g").
· "git pull" can be used to fetch and merge an annotated/signed tag, instead of the tip of a topic branch. The GPG signature from the signed tag is recorded in the resulting merge commit for later auditing.
· "git log" learned "--show-signature" option to show the signed tag that was merged that is embedded in the merge commit. It also can show the signature made on the commit with "git commit -S".
· "git branch --edit-description" can be used to add descriptive text to explain what a topic branch is about.
· "git fmt-merge-msg" learned to take the branch description into account when preparing a merge summary that "git merge" records when merging a local branch.
"git request-pull" has been updated to convey more information useful for integrators to decide if a topic is worth merging and what is pulled is indeed what the requestor asked to pull, including:
· - the tip of the branch being requested to be merged; - the branch description describing what the topic is about; - the contents of the annotated tag, when requesting to pull a tag.
· "git pull" learned to notice 'pull.rebase' configuration variable, which serves as a global fallback for setting 'branch..rebase' configuration variable per branch.
· "git tag" learned "--cleanup" option to control how the whitespaces and empty lines in tag message are cleaned up.
· "gitweb" learned to show side-by-side diff.
· Also contains minor documentation updates and code clean-ups.
January 19th, 2012Updates since v1.7.8:
· gitk updates accumulated since early 2011.
· git-gui updated to 0.16.0.
· git-p4 (in contrib/) updates.
· Git uses gettext to translate its most common interface messages into the user's language if translations are available and the locale is appropriately set. Distributors can drop in new PO files in po/ to add new translations.
· The code to handle username/password for HTTP transaction used in "git push" & "git fetch" learned to talk "credential API" to external programs to cache or store them, to allow integration with platform native keychain mechanisms.
· The prompted input in the terminal use our own getpass() replacement when possible. HTTP transactions used to ask username without echoing back what was typed, but with this change you will see it as you type.
· The internal of "revert/cherry-pick" has been tweaked to prepare building more generic "sequencer" on top of the implementation that drives them.
· "git add" learned to stream large files directly into a packfile instead of writing them into individual loose object files.
· "git checkout -B " is a more intuitive way to spell "git reset --keep ".
· "git checkout" and "git merge" learned "--no-overwrite-ignore" option to tell Git that untracked and ignored files are not expendable.
· "git commit --amend" learned "--no-edit" option to say that the user is amending the tree being recorded, without updating the commit log message.
· "git commit" and "git reset" re-learned the optimization to prime the cache-tree information in the index, which makes it faster to write a tree object out after the index entries are updated.
· "git commit" detects and rejects an attempt to stuff NUL byte in the commit log message.
· "git commit" learned "-S" to GPG-sign the commit; this can be shown with the "--show-signature" option to "git log".
· fsck and prune are relatively lengthy operations that still go silent while making the end-user wait. They learned to give progress output like other slow operations.
· The set of built-in function-header patterns for various languages knows MATLAB.
· "git log --format=''" learned new %g[nNeE] specifiers to show information from the reflog entries when warlking the reflog (i.e. with "-g").
· "git pull" can be used to fetch and merge an annotated/signed tag, instead of the tip of a topic branch. The GPG signature from the signed tag is recorded in the resulting merge commit for later auditing.
· "git log" learned "--show-signature" option to show the signed tag that was merged that is embedded in the merge commit. It also can show the signature made on the commit with "git commit -S".
· "git branch --edit-description" can be used to add descriptive text to explain what a topic branch is about.
· "git fmt-merge-msg" learned to take the branch description into account when preparing a merge summary that "git merge" records when merging a local branch.
· "git request-pull" has been updated to convey more information useful for integrators to decide if a topic is worth merging and what is pulled is indeed what the requestor asked to pull.
· "git pull" learned to notice 'pull.rebase' configuration variable, which serves as a global fallback for setting 'branch..rebase' configuration variable per branch.
· "git tag" learned "--cleanup" option to control how the whitespaces and empty lines in tag message are cleaned up.
· "gitweb" learned to show side-by-side diff.
· Also contains minor documentation updates and code clean-ups.
January 7th, 2012Fixes since v1.7.8.2:
· Attempt to fetch from an empty file pretending it to be a bundle did not error out correctly.
· gitweb did not correctly fall back to configured $fallback_encoding that is not 'latin1'.
· "git clone --depth $n" did not catch a non-number given as $n as an error.
· Also contains minor fixes and documentation updates.
December 29th, 2011Fixes since 1.7.8.1:
· Porcelain commands like "git reset" did not distinguish deletions and type-changes from ordinary modification, and reported them with the same 'M' moniker. They now use 'D' (for deletion) and 'T' (for type-change) to match "git status -s" and "git diff --name-status".
· The configuration file parser used for sizes (e.g. bigFileThreshold) did not correctly interpret 'g' suffix.
· The replacement implemention for snprintf used on platforms with native snprintf that is broken did not use va_copy correctly.
· LF-to-CRLF streaming filter replaced all LF with CRLF, which might be techinically correct but not friendly to people who are trying to recover from earlier mistakes of using CRLF in the repository data in the first place. It now refrains from doing so for LF that follows a CR.
· git native connection going over TCP (not over SSH) did not set SO_KEEPALIVE option which failed to receive link layer errors.
· "git branch -m HEAD" is an obvious no-op but was not allowed.
· "git checkout -m" did not recreate the conflicted state in a "both sides added, without any common ancestor version" conflict situation.
· "git cherry-pick $commit" (not a range) created an unnecessary sequencer state and interfered with valid workflow to use the command during a session to cherry-pick multiple commits.
· You could make "git commit" segfault by giving the "--no-message" option.
· "fast-import" did not correctly update an existing notes tree, possibly corrupting the fan-out.
· "git fetch-pack" accepted unqualified refs that do not begin with refs/ by mistake and compensated it by matching the refspec with tail-match, which was doubly wrong. This broke fetching from a repository with a funny named ref "refs/foo/refs/heads/master" and a 'master' branch with "git fetch-pack refs/heads/master", as the command incorrectly considered the former a "match".
· "git log --follow" did not honor the rename threshold score given with the -M option (e.g. "-M50%").
· "git mv" gave suboptimal error/warning messages when it overwrites target files. It also did not pay attention to "-v" option.
· Authenticated "git push" over dumb HTTP were broken with a recent change and failed without asking for password when username is given.
· "git push" to an empty repository over HTTP were broken with a recent change to the ref handling.
· "git push -v" forgot how to be verbose by mistake. It now properly becomes verbose when asked to.
· When a "reword" action in "git rebase -i" failed to run "commit --amend", we did not give the control back to the user to resolve the situation, and instead kept the original commit log message.
· Also contains minor fixes and documentation updates.
December 22nd, 2011Fixes:
· In some codepaths (notably, checkout and merge), the ignore patterns recorded in $GIT_DIR/info/exclude were not honored. They now are.
· "git apply --check" did not error out when given an empty input without any patch.
· "git archive" mistakenly allowed remote clients to ask for commits that are not at the tip of any ref.
· "git checkout" and "git merge" treated in-tree .gitignore and exclude file in $GIT_DIR/info/ directory inconsistently when deciding which untracked files are ignored and expendable.
· LF-to-CRLF streaming filter used when checking out a large-ish blob fell into an infinite loop with a rare input.
· The function header pattern for files with "diff=cpp" attribute did not consider "type *funcname(type param1,..." as the beginning of a function.
· The error message from "git diff" and "git status" when they fail to inspect changes in submodules did not report which submodule they had trouble with.
· After fetching from a remote that has very long refname, the reporting output could have corrupted by overrunning a static buffer.
· "git pack-objects" avoids creating cyclic dependencies among deltas when seeing a broken packfile that records the same object in both the deflated form and as a delta.
· Also contains minor fixes and documentation updates.
December 5th, 2011· Some git-svn, git-gui, git-p4 (in contrib) and msysgit updates.
· Updates to bash completion scripts.
· The build procedure has been taught to take advantage of computed dependency automatically when the complier supports it.
· The date parser now accepts timezone designators that lack minutes part and also has a colon between "hh:mm".
· The contents of the /etc/mailname file, if exists, is used as the default value of the hostname part of the committer/author e-mail.
· "git am" learned how to read from patches generated by Hg.
· "git archive" talking with a remote repository can report errors from the remote side in a more informative way.
· "git branch" learned an explicit --list option to ask for branches listed, optionally with a glob matching pattern to limit its output.
· "git check-attr" learned "--cached" option to look at .gitattributes files from the index, not from the working tree.
· Variants of "git cherry-pick" and "git revert" that take multiple commits learned to "--continue" and "--abort".
· "git daemon" gives more human readble error messages to clients using ERR packets when appropriate.
· Errors at the network layer is logged by "git daemon".
· "git diff" learned "--minimal" option to spend extra cycles to come up with a minimal patch output.
· "git diff" learned "--function-context" option to show the whole function as context that was affected by a change.
· "git difftool" can be told to skip launching the tool for a path by answering 'n' to its prompt.
· "git fetch" learned to honor transfer.fsckobjects configuration to validate the objects that were received from the other end, just like "git receive-pack" (the receiving end of "git push") does.
· "git fetch" makes sure that the set of objects it received from the other end actually completes the history before updating the refs. "git receive-pack" (the receiving end of "git push") learned to do the same.
· "git fetch" learned that fetching/cloning from a regular file on the filesystem is not necessarily a request to unpack a bundle file; the file could be ".git" with "gitdir: " in it.
· "git for-each-ref" learned "%(contents:subject)", "%(contents:body)" and "%(contents:signature)". The last one is useful for signed tags.
· "git grep" used to incorrectly pay attention to .gitignore files scattered in the directory it was working in even when "--no-index" option was used. It no longer does this. The "--exclude-standard" option needs to be given to explicitly activate the ignore mechanism.
· "git grep" learned "--untracked" option, where given patterns are searched in untracked (but not ignored) files as well as tracked files in the working tree, so that matches in new but not yet added files do not get missed.
· The recursive merge backend no longer looks for meaningless existing merges in submodules unless in the outermost merge.
· "git log" and friends learned "--children" option.
· "git ls-remote" learned to respond to "-h"(elp) requests.
· "mediawiki" remote helper can interact with (surprise!) MediaWiki with "git fetch" & "git push".
· "git merge" learned the "--edit" option to allow users to edit the merge commit log message.
· "git rebase -i" can be told to use special purpose editor suitable only for its insn sheet via sequence.editor configuration variable.
· "git send-email" learned to respond to "-h"(elp) requests.
· "git send-email" allows the value given to sendemail.aliasfile to begin with "~/" to refer to the $HOME directory.
· "git send-email" forces use of Authen::SASL::Perl to work around issues between Authen::SASL::Cyrus and AUTH PLAIN/LOGIN.
· "git stash" learned "--include-untracked" option to stash away untracked/ignored cruft from the working tree.
· "git submodule clone" does not leak an error message to the UI level unnecessarily anymore.
· "git submodule update" learned to honor "none" as the value for submodule..update to specify that the named submodule should not be checked out by default.
· When populating a new submodule directory with "git submodule init", the $GIT_DIR metainformation directory for submodules is created inside $GIT_DIR/modules// directory of the superproject and referenced via the gitfile mechanism. This is to make it possible to switch between commits in the superproject that has and does not have the submodule in the tree without re-cloning.
· "gitweb" leaked unescaped control characters from syntax hiliter outputs.
· "gitweb" can be told to give custom string at the end of the HTML HEAD element.
· "gitweb" now has its own manual pages.
July 21st, 2011· Various git-svn updates.
· Updates the way content tags are handled in gitweb. Also adds
· a UI to choose common timezone for displaying the dates.
· Similar to branch names, tagnames that begin with "-" are now
· disallowed.
· Clean-up of the C part of i18n (but not l10n---please wait)
· continues.
· The scripting part of the codebase is getting prepared for i18n/l10n.
· Pushing and pulling from a repository with large number of refs that
· point to identical commits are optimized by not listing the same commit
· during the common ancestor negotiation exchange with the other side.
· Adding a file larger than core.bigfilethreshold (defaults to 1/2 Gig)
· using "git add" will send the contents straight to a packfile without
· having to hold it and its compressed representation both at the same
· time in memory.
· Processes spawned by "[alias] = !process" in the configuration
· can inspect GIT_PREFIX environment variable to learn where in the
· working tree the original command was invoked.
· A magic pathspec ":/" tells a command that limits its operation to
· the current directory when ran from a subdirectory to work on the
· entire working tree. In general, ":/path/to/file" would be relative
· to the root of the working tree hierarchy.
· After "git reset --hard; edit Makefile; cd t/", "git add -u" would
· be a no-op, but "git add -u :/" would add the updated contents of
· the Makefile at the top level. If you want to name a path in the
· current subdirectory whose unusual name begins with ":/", you can
· name it by "./:/that/path" or by "\:/that/path".
· "git blame" learned "--abbrev[=]" option to control the minimum
· number of hexdigits shown for commit object names.
· "git blame" learned "--line-porcelain" that is less efficient but is
· easier to parse.
· Aborting "git commit --interactive" discards updates to the index
· made during the interactive session.
· "git commit" learned a "--patch" option to directly jump to the
· per-hunk selection UI of the interactive mode.
· "git diff" and its family of commands learned --dirstat=0 to show
· directories that contribute less than 0.1% of changes.
· "git diff" and its family of commands learned --dirstat=lines mode to
· assess damage to the directory based on number of lines in the patch
· output, not based on the similarity numbers.
· "git format-patch" learned "--quiet" option to suppress the output of
· the names of generated files.
· "git format-patch" quotes people's names when it has RFC822 special
· characters in it, e.g. "Junio C. Hamano" . Earlier
· it was up to the user to do this when using its output.
· "git format-patch" can take an empty --subject-prefix now.
· "git grep" learned the "-P" option to take pcre regular expressions.
· "git log" and friends learned a new "--notes" option to replace the
· "--show-notes" option. Unlike "--show-notes", "--notes=" does
· not imply showing the default notes.
· They also learned a log.abbrevCommit configuration variable to augment
· the --abbrev-commit command line option.
· "git ls-remote" learned "--exit-code" option to consider it a
· different kind of error when no remote ref to be shown.
· "git merge" learned "-" as a short-hand for "the previous branch", just
· like the way "git checkout -" works.
· "git merge" uses "merge.ff" configuration variable to decide to always
· create a merge commit (i.e. --no-ff, aka merge.ff=no), refuse to create
· a merge commit (i.e. --ff-only, aka merge.ff=only). Setting merge.ff=yes
· (or not setting it at all) restores the default behaviour of allowing
· fast-forward to happen when possible.
· p4-import (from contrib) learned a new option --preserve-user.
· "git read-tree -m" learned "--dry-run" option that reports if a merge
· would fail without touching the index nor the working tree.
· "git rebase" that does not specify on top of which branch to rebase
· the current branch now uses @{upstream} of the current branch.
· "git rebase" finished either normally or with --abort did not
· update the reflog for HEAD to record the event to come back to
· where it started from.
· "git remote add -t only-this-branch --mirror=fetch" is now allowed. Earlier
· a fetch-mode mirror meant mirror everything, but now it only means refs are
· not renamed.
· "git rev-list --count" used with "--cherry-mark" counts the cherry-picked
· commits separately, producing more a useful output.
· "git submodule update" learned "--force" option to get rid of local
· changes in submodules and replace them with the up-to-date version.
· "git status" and friends ignore .gitmodules file while the file is
· still in a conflicted state during a merge, to avoid using information
· that is not final and possibly corrupt with conflict markers.
February 26th, 2011· On Windows platform, the codepath to spawn a new child process forgot to first flush the output buffer.
· "git bundle" did not use OFS_DELTA encoding, making its output a few per-cent larger than necessarily.
· The option to tell "git clone" to recurse into the submodules was misspelled with an underscore "--recurse_submodules".
· "git diff --cached HEAD" before the first commit does what an end user would expect (namely, show what would be committed without further "git add").
· "git fast-import" didn't accept the command to ask for "notes" feature to be present in its input stream, even though it was capable of the feature.
· "git fsck" gave up scanning loose object files in directories with garbage files.
· And other minor fixes and documentation updates.
February 7th, 2011· The documentation Makefile now assumes by default asciidoc 8 and docbook-xsl >= 1.73. If you have older versions, you can set ASCIIDOC7 and ASCIIDOC_ROFF, respectively.
· The option parsers of various commands that create new branches (or rename existing ones to a new name) were too loose and users were allowed to give a branch a name that begins with a dash by creative abuse of their command line options, which only led to burning themselves. The name of a branch cannot begin with a dash now.
· System-wide fallback default attributes can be stored in /etc/gitattributes; the core.attributesfile configuration variable can be used to customize the path to this file.
· The thread structure generated by "git send-email" has changed slightly. Setting the cover letter of the latest series as a reply to the cover letter of the previous series with --in-reply-to used to make the new cover letter and all the patches replies to the cover letter of the previous series; this has been changed to make the patches in the new series replies to the new cover letter.
· The Bash completion script in contrib/ has been adjusted to be usable with Bash 4 (options with '=value' didn't complete). It has been also made usable with zsh.
· Different pagers can be chosen depending on which subcommand is being run under the pager, using the "pager." variable.
· The hardcoded tab-width of 8 that is used in whitespace breakage checks is now configurable via the attributes mechanism.
· Support of case insensitive filesystems (i.e. "core.ignorecase") has been improved. For example, the gitignore mechanism didn't pay attention to case insensitivity.
· The : syntax for naming a blob in a tree, and the : syntax for naming a blob in the index (e.g. "master:Makefile", ":hello.c") have been extended. You can start with "./" to implicitly have the (sub)directory you are in prefixed to the lookup. Similarly, ":../Makefile" from a subdirectory would mean "the Makefile of the parent directory in the index".
· "git blame" learned the --show-email option to display the e-mail addresses instead of the names of authors.
· "git commit" learned the --fixup and --squash options to help later invocation of interactive rebase.
· Command line options to "git cvsimport" whose names are in capital letters (-A, -M, -R and -S) can now be specified as the default in the .git/config file by their longer names (cvsimport.authorsFile, cvsimport.mergeRegex, cvsimport.trackRevisions, cvsimport.ignorePaths).
· "git daemon" can be built in the MinGW environment.
· "git daemon" can take more than one --listen option to listen to multiple addresses.
· "git describe --exact-match" was optimized not to read commit objects unnecessarily.
· "git diff" and "git grep" learned what functions and subroutines in Fortran, Pascal and Perl look like.
· "git fetch" learned the "--recurse-submodules" option.
· "git mergetool" tells vim/gvim to show a three-way diff by default (use vimdiff2/gvimdiff2 as the tool name for old behavior).
· "git log -G" limits the output to commits whose change has added or deleted lines that match the given pattern.
· "git read-tree" with no argument as a way to empty the index is deprecated; we might want to remove it in the future. Users can use the new --empty option to be more explicit instead.
· "git repack -f" does not spend cycles to recompress objects in the non-delta representation anymore (use -F if you really mean it e.g. after you changed the core.compression variable setting).
· "git merge --log" used to limit the resulting merge log to 20 entries; this is now customizable by giving e.g. "--log=47".
· "git merge" may work better when all files were moved out of a directory in one branch while a new file is created in place of that directory in the other branch.
· "git merge" learned the "--abort" option, synonymous to "git reset --merge" when a merge is in progress.
· "git notes" learned the "merge" subcommand to merge notes refs. In addition to the default manual conflict resolution, there are also several notes merge strategies for automatically resolving notes merge conflicts.
· "git rebase --autosquash" can use SHA-1 object names to name the commit which is to be fixed up (e.g. "fixup! e83c5163").
· The default "recursive" merge strategy learned the --rename-threshold option to influence the rename detection, similar to the -M option of "git diff". From the "git merge" frontend, the "-X" interface, e.g. "git merge -Xrename-threshold=50% ...", can be used to trigger this.
· The "recursive" strategy also learned to ignore various whitespace changes; the most notable is -Xignore-space-at-eol.
· "git send-email" learned "--to-cmd", similar to "--cc-cmd", to read the recipient list from a command output.
· "git send-email" learned to read and use "To:" from its input files.
· you can extend "git shell", which is often used on boxes that allow git-only login over ssh as login shell, with a custom set of commands.
· The current branch name in "git status" output can be colored differently from the generic header color by setting the "color.status.branch" variable.
· "git submodule sync" updates metainformation for all submodules, not just the ones that have been checked out.
· gitweb can use a custom 'highlight' command with its configuration file.
· other gitweb updates.
January 6th, 2011· Smart HTTP transport used to incorrectly retry redirected POST
· request with GET request.
· "git apply" did not correctly handle patches that only change modes
· if told to apply while stripping leading paths with -p option.
· "git apply" can deal with patches with timezone formatted with a
· colon between the hours and minutes part (e.g. "-08:00" instead of
· "-0800").
· "git checkout" removed an untracked file "foo" from the working
· tree when switching to a branch that contains a tracked path
· "foo/bar". Prevent this, just like the case where the conflicting
· path were "foo" (c752e7f..7980872d).
· "git cherry-pick" or "git revert" refused to work when a path that
· would be modified by the operation was stat-dirty without a real
· difference in the contents of the file.
· "git diff --check" reported an incorrect line number for added
· blank lines at the end of file.
· "git imap-send" failed to build under NO_OPENSSL.
· Setting log.decorate configuration variable to "0" or "1" to mean
· "false" or "true" did not work.
· "git push" over dumb HTTP protocol did not work against WebDAV
· servers that did not terminate a collection name with a slash.
· "git tag -v" did not work with GPG signatures in rfc1991 mode.
· The post-receive-email sample hook was accidentally broken in 1.7.3.3
· update.
· "gitweb" can sometimes be tricked into parrotting a filename argument
· given in a request without properly quoting.
December 11th, 2010· "git apply" segfaulted when a bogus input is fed to it.
· Running "git cherry-pick --ff" on a root commit segfaulted.
· "diff", "blame" and friends incorrectly applied textconv filters to symlinks.
· Highlighting of whitespace breakage in "diff" output was showing incorrect amount of whitespaces when blank-at-eol is set and the line consisted only of whitespaces and a TAB.
· "diff" was overly inefficient when trying to find the line to use for the function header (i.e. equivalent to --show-c-function of GNU diff).
· "git imap-send" depends on libcrypto but our build rule relied on the linker to implicitly link it via libssl, which was wrong.
· "git merge-file" can be called from within a subdirectory now.
· "git repack -f" expanded and recompressed non-delta objects in the existing pack, which was wasteful. Use new "-F" option if you really want to (e.g. when changing the pack.compression level).
· "git rev-list --format="...%x00..." incorrectly chopped its output at NUL.
· "git send-email" did not correctly remove duplicate mail addresses from the Cc: header that appear on the To: header.
· The completion script (in contrib/completion) ignored lightweight tags in __git_ps1().
· "git-blame" mode (in contrib/emacs) didn't say (require 'format-spec) even though it depends on it; it didn't work with Emacs 22 or older unless Gnus is used.
· "git-p4" (in contrib/) did not correctly handle deleted files.
July 29th, 2010· "git instaweb" wasn't useful when your Apache was installed under a name other than apache2 (e.g. "httpd").
· Similarly, "git web--browse" (invoked by "git help -w") learned that chrome browser is sometimes called google-chrome.
· An overlong line after ".gitdir: " in a git file caused out of bounds access to an array on the stack.
· "git config --path conf.var" to attempt to expand a variable conf.var that uses "~/" short-hand segfaulted when $HOME environment variable was not set.
· Documentation on Cygwin failed to build.
· The error message from "git pull blarg" when 'blarg' is an unknown remote name has been improved.
June 11th, 2010· Eric Raymond is the maintainer of updated CIAbot scripts, in contrib/.
· gitk updates.
· Some commands (e.g. svn and http interfaces) that interactively ask for a password can be told to use an external program given via GIT_ASKPASS.
· Conflict markers that lead the common ancestor in diff3-style output now have a label, which hopefully would help third-party tools that expect one.
· Comes with an updated bash-completion script.
· "git am" learned "--keep-cr" option to handle inputs that are a mixture of changes to files with and without CRLF line endings.
· "git cvsimport" learned -R option to leave revision mapping between CVS revisions and resulting git commits.
· "git diff --submodule" notices and describes dirty submodules.
· "git for-each-ref" learned %(symref), %(symref:short) and %(flag) tokens.
· "git hash-object --stdin-paths" can take "--no-filters" option now.
· "git init" can be told to look at init.templatedir configuration variable (obviously that has to come from either /etc/gitconfig or $HOME/.gitconfig).
· "git grep" learned "--no-index" option, to search inside contents that are not managed by git.
· "git grep" learned --color=auto/always/never.
· "git grep" learned to paint filename and line-number in colors.
· "git log -p --first-parent -m" shows one-parent diff for merge commits, instead of showing combined diff.
· "git merge-file" learned to use custom conflict marker size and also to use the "union merge" behaviour.
· "git notes" command has been rewritten in C and learned many commands and features to help you carry notes forward across rebases and amends.
· "git request-pull" identifies the commit the request is relative to in a more readable way.
· "git reset" learned "--keep" option that lets you discard commits near the tip while preserving your local changes in a way similar to how "git checkout branch" does.
· "git status" notices and describes dirty submodules.
· "git svn" should work better when interacting with repositories with CRLF line endings.
· "git imap-send" learned to support CRAM-MD5 authentication.
· "gitweb" installation procedure can use "minified" js/css files better.
· Various documentation updates.
April 30th, 2010· git diff --stat" used "int" to count the size of differences, which could result in overflowing.
· "git rev-list --abbrev-commit" defaulted to 40-byte abbreviations, unlike newer tools in the git toolset.
February 10th, 2010· git blame" did not work well when commit lacked the author name.
· "git branch -a name" wasn't diagnosed as an error.
· "git count-objects" did not handle packfiles that are bigger than 4G on platforms with 32-bit off_t.
· "git checkout -m other" while on a branch that does not have any commit segfaulted, instead of failing.
· "git fast-import" choked when fed a tag that do not point at a commit.
· "git grep" finding from work tree files could have fed garbage to the underlying regexec(3).
· "git grep -L" didn't show empty files (they should never match, and they should always appear in -L output as unmatching).
· "git rebase -i" did not abort cleanly if it failed to launch the editor.
· "git reset --hard" did not work correctly when GIT_WORK_TREE environment variable is used to point at the root of the true work tree.
· http-backend was not listed in the command list in the documentation.
· Building on FreeBSD (both 7 and 8) needs OLD_ICONV set in the Makefile
· "git checkout -m some-branch" while on an unborn branch crashed.
· Other minor documentation updates are included.
January 5th, 2010· * various gitk updates including use of themed widgets under Tk 8.5,
· Japanese translation, a fix to a bug when running "gui blame" from
· a subdirectory, etc.
· * various git-gui updates including new translations, wm states fixes,
· Tk bug workaround after quitting, improved heuristics to trigger gc,
· etc.
· * various git-svn updates.
· * "git fetch" over http learned a new mode that is different from the
· traditional "dumb commit walker".
· (portability)
· * imap-send can be built on mingw port.
· (performance)
· * "git diff -B" has smaller memory footprint.
· (usability, bells and whistles)
· * The object replace mechanism can be bypassed with --no-replace-objects
· global option given to the "git" program.
· * In configuration files, a few variables that name paths can begin with ~/
· and ~username/ and they are expanded as expected.
· "git subcmd -h" now shows short usage help for many more subcommands.
· "git bisect reset" can reset to an arbitrary commit.
· "git checkout frotz" when there is no local branch "frotz" but there
· is only one remote tracking branch "frotz" is taken as a request to
· start the named branch at the corresponding remote tracking branch.
· "git commit -c/-C/--amend" can be told with a new "--reset-author" option
· to ignore authorship information in the commit it is taking the message
· from.
· "git describe" can be told to add "-dirty" suffix with "--dirty" option.
· "git diff" learned --submodule option to show a list of one-line logs
· instead of differences between the commit object names.
· "git diff" learned to honor diff.color.func configuration to paint
· function name hint printed on the hunk header "@@ -j,k +l,m @@" line
· in the specified color.
· "git fetch" learned --all and --multiple options, to run fetch from
· many repositories, and --prune option to remove remote tracking
· branches that went stale. These make "git remote update" and "git
· remote prune" less necessary (there is no plan to remove "remote
· update" nor "remote prune", though).
· "git fsck" by default checks the packfiles (i.e. "--full" is the
· default); you can turn it off with "git fsck --no-full".
· "git grep" can use -F (fixed strings) and -i (ignore case) together.
· import-tars contributed fast-import frontend learned more types of
· compressed tarballs.
· "git instaweb" knows how to talk with mod_cgid to apache2.
December 11th, 2009· "git add -p" had a regression since v1.6.5.3 that broke deletion of non-empty files.
· "git archive -o o.zip -- Makefile" produced an archive in o.zip but in POSIX tar format.
· Error message given to "git pull --rebase" when the user didn't give enough clue as to what branch to integrate with still talked about "merging with" the branch.
· Error messages given by "git merge" when the merge resulted in a fast-forward still were in plumbing lingo, even though in v1.6.5 we reworded messages in other cases.
· The post-upload-hook run by upload-pack in response to "git fetch" has been removed, due to security concerns (the hook first appeared in 1.6.5).
December 9th, 2009· Manual pages can be formatted with older xmlto again.
· GREP_OPTIONS exported from user's environment could have broken
· our scripted commands.
· In configuration files, a few variables that name paths can begin with
· ~/ and ~username/ and they are expanded as expected. This is not a
· bugfix but 1.6.6 will have this and without backporting users cannot
· easily use the same ~/.gitconfig across versions.
· "git diff -B -M" did the same computation to hash lines of contents
· twice, and held onto memory after it has used the data in it
· unnecessarily before it freed.
· "git diff -B" and "git diff --dirstat" was not counting newly added
· contents correctly.
· "git format-patch revisions... -- path" issued an incorrect error
· message that suggested to use "--" on the command line when path
· does not exist in the current work tree (it is a separate matter if
· it makes sense to limit format-patch with pathspecs like that
· without using the --full-diff option).
· "git grep -F -i StRiNg" did not work as expected.
· Enumeration of available merge strategies iterated over the list of
· commands in a wrong way, sometimes producing an incorrect result.
· "git shortlog" did not honor the "encoding" header embedded in the
· commit object like "git log" did.
· Reading progress messages that come from the remote side while running
· "git pull" is given precedence over reading the actual pack data to
· prevent garbled progress message on the user's terminal.
· "git rebase" got confused when the log message began with certain
· strings that looked like Subject:, Date: or From: header.
· "git reset" accidentally run in .git/ directory checked out the
· work tree contents in there.
September 18th, 2009· The workaround for Github server that sometimes gave 500 (Internal server error) response to HEAD requests in 1.6.4.3 introduced a regression that caused re-fetching projects over http to segfault in certain cases due to uninitialized pointer being freed.
· "git pull" on an unborn branch used to consider anything in the work tree and the index discardable.
· "git diff -b/w" did not work well on the incomplete line at the end of the file, due to an incorrect hashing of lines in the low-level xdiff routines.
· "git checkout-index --prefix=$somewhere" used to work when $somewhere is a symbolic link to a directory elsewhere, but v1.6.4.2 broke it.
· "git unpack-objects --strict", invoked when receive.fsckobjects configuration is set in the receiving repository of "git push", did not properly check the objects, especially the submodule links, it received.
September 4th, 2009· --date=relative output between 1 and 5 years ago rounded the number of years when saying X years Y months ago, instead of rounding it down.
· "git add -p" did not handle changes in executable bits correctly (a regression around 1.6.3).
· "git apply" did not honor GNU diff's convention to mark the creation/deletion event with UNIX epoch timestamp on missing side.
· "git checkout" incorrectly removed files in a directory pointed by a symbolic link during a branch switch that replaces a directory with a symbolic link.
· "git clean -d -f" happily descended into a subdirectory that is managed by a separate git repository. It now requires two -f options for safety.
· "git fetch/push" over http transports had two rather grave bugs.
· "git format-patch --cover-letter" did not prepare the cover letter file for use with non-ASCII strings when there are the series contributors with non-ASCII names.
· "git pull origin branch" and "git fetch origin && git merge origin/branch" left different merge messages in the resulting commit.
August 24th, 2009· An unquoted value in the configuration file, when it contains more than one whitespaces in a row, got them replaced with a single space.
· "git am" used to accept a single piece of e-mail per file (not a mbox) as its input, but multiple input format support in v1.6.4 broke it. Apparently many people have been depending on this feature.
· The short help text for "git filter-branch" command was a single long line, wrapped by terminals, and was hard to read.
· The "recursive" strategy of "git merge" segfaulted when a merge has more than one merge-bases, and merging of these merge-bases involves a rename/rename or a rename/add conflict.
· "git pull --rebase" did not use the right fork point when the repository has already fetched from the upstream that rewinds the branch it is based on in an earlier fetch.
· Explain the concept of fast-forward more fully in "git push" documentation, and hint to refer to it from an error message when the command refuses an update to protect the user.
· The default value for pack.deltacachesize, used by "git repack", is now 256M, instead of unbounded. Otherwise a repack of a moderately sized repository would needlessly eat into swap.
· Document how "git repack" (hence "git gc") interacts with a repository that borrows its objects from other repositories (e.g. ones created by "git clone -s").
· "git show" on an annotated tag lacked a delimiting blank line between the tag itself and the contents of the object it tags.
· "git verify-pack -v" erroneously reported number of objects with too deep delta depths as "chain length 0" objects.
· Long names of authors and committers outside US-ASCII were sometimes incorrectly shown in "gitweb".