RelNotes

1.5.0.1
1.5.0.2
1.5.0.3
1.5.0.4
1.5.0.5
1.5.0.6
1.5.0.7
used to refuse to commit if was different between HEAD and the index (i.e. update-index was used on it earlier). This check was removed. - git-rm is much saner and safer. It is used to remove paths from both the index file and the working tree, and makes sure you are not losing any local modification before doing so. - git-reset ... can be used to revert index entries for selected paths. - git-update-index is much less visible. Many suggestions to use the command in git output and documentation have now been replaced by simpler commands such as "git add" or "git rm". * Repository layout and objects transfer - The data for origin repository is stored in the configuration file $GIT_DIR/config, not in $GIT_DIR/remotes/, for newly created clones. The latter is still supported and there is no need to convert your existing repository if you are already comfortable with your workflow with the layout. - git-clone always uses what is known as "separate remote" layout for a newly created repository with a working tree. A repository with the separate remote layout starts with only one default branch, 'master', to be used for your own development. Unlike the traditional layout that copied all the upstream branches into your branch namespace (while renaming their 'master' to your 'origin'), the new layout puts upstream branches into local "remote-tracking branches" with their own namespace. These can be referenced with names such as "origin/$upstream_branch_name" and are stored in .git/refs/remotes rather than .git/refs/heads where normal branches are stored. This layout keeps your own branch namespace less cluttered, avoids name collision with your upstream, makes it possible to automatically track new branches created at the remote after you clone from it, and makes it easier to interact with more than one remote repository (you can use "git remote" to add other repositories to track). There might be some surprises: * 'git branch' does not show the remote tracking branches. It only lists your own branches. Use '-r' option to view the tracking branches. * If you are forking off of a branch obtained from the upstream, you would have done something like 'git branch my-next next', because traditional layout dropped the tracking branch 'next' into your own branch namespace. With the separate remote layout, you say 'git branch next origin/next', which allows you to use the matching name 'next' for your own branch. It also allows you to track a remote other than 'origin' (i.e. where you initially cloned from) and fork off of a branch from there the same way (e.g. "git branch mingw j6t/master"). Repositories initialized with the traditional layout continue to work. - New branches that appear on the origin side after a clone is made are also tracked automatically. This is done with an wildcard refspec "refs/heads/*:refs/remotes/origin/*", which older git does not understand, so if you clone with 1.5.0, you would need to downgrade remote.*.fetch in the configuration file to specify each branch you are interested in individually if you plan to fetch into the repository with older versions of git (but why would you?). - Similarly, wildcard refspec "refs/heads/*:refs/remotes/me/*" can be given to "git-push" command to update the tracking branches that is used to track the repository you are pushing from on the remote side. - git-branch and git-show-branch know remote tracking branches (use the command line switch "-r" to list only tracked branches). - git-push can now be used to delete a remote branch or a tag. This requires the updated git on the remote side (use "git push :refs/heads/" to delete "branch"). - git-push more aggressively keeps the transferred objects packed. Earlier we recommended to monitor amount of loose objects and repack regularly, but you should repack when you accumulated too many small packs this way as well. Updated git-count-objects helps you with this. - git-fetch also more aggressively keeps the transferred objects packed. This behavior of git-push and git-fetch can be tweaked with a single configuration transfer.unpacklimit (but usually there should not be any need for a user to tweak it). - A new command, git-remote, can help you manage your remote tracking branch definitions. - You may need to specify explicit paths for upload-pack and/or receive-pack due to your ssh daemon configuration on the other end. This can now be done via remote.*.uploadpack and remote.*.receivepack configuration. * Bare repositories - Certain commands change their behavior in a bare repository (i.e. a repository without associated working tree). We use a fairly conservative heuristic (if $GIT_DIR is ".git", or ends with "/.git", the repository is not bare) to decide if a repository is bare, but "core.bare" configuration variable can be used to override the heuristic when it misidentifies your repository. - git-fetch used to complain updating the current branch but this is now allowed for a bare repository. So is the use of 'git-branch -f' to update the current branch. - Porcelain-ish commands that require a working tree refuses to work in a bare repository. * Reflog - Reflog records the history from the view point of the local repository. In other words, regardless of the real history, the reflog shows the history as seen by one particular repository (this enables you to ask "what was the current revision in _this_ repository, yesterday at 1pm?"). This facility is enabled by default for repositories with working trees, and can be accessed with the "branch@{time}" and "branch@{Nth}" notation. - "git show-branch" learned showing the reflog data with the new -g option. "git log" has -g option to view reflog entries in a more verbose manner. - git-branch knows how to rename branches and moves existing reflog data from the old branch to the new one. - In addition to the reflog support in v1.4.4 series, HEAD reference maintains its own log. "HEAD@{5.minutes.ago}" means the commit you were at 5 minutes ago, which takes branch switching into account. If you want to know where the tip of your current branch was at 5 minutes ago, you need to explicitly say its name (e.g. "master@{5.minutes.ago}") or omit the refname altogether i.e. "@{5.minutes.ago}". - The commits referred to by reflog entries are now protected against pruning. The new command "git reflog expire" can be used to truncate older reflog entries and entries that refer to commits that have been pruned away previously with older versions of git. Existing repositories that have been using reflog may get complaints from fsck-objects and may not be able to run git-repack, if you had run git-prune from older git; please run "git reflog expire --stale-fix --all" first to remove reflog entries that refer to commits that are no longer in the repository when that happens. * Crufts removal - We used to say "old commits are retrievable using reflog and 'master@{yesterday}' syntax as long as you haven't run git-prune". We no longer have to say the latter half of the above sentence, as git-prune does not remove things reachable from reflog entries. - There is a toplevel garbage collector script, 'git-gc', that runs periodic cleanup functions, including 'git-repack -a -d', 'git-reflog expire', 'git-pack-refs --prune', and 'git-rerere gc'. - The output from fsck ("fsck-objects" is called just "fsck" now, but the old name continues to work) was needlessly alarming in that it warned missing objects that are reachable only from dangling objects. This has been corrected and the output is much more useful. * Detached HEAD - You can use 'git-checkout' to check out an arbitrary revision or a tag as well, instead of named branches. This will dissociate your HEAD from the branch you are currently on. A typical use of this feature is to "look around". E.g. $ git checkout v2.6.16 ... compile, test, etc. $ git checkout v2.6.17 ... compile, test, etc. - After detaching your HEAD, you can go back to an existing branch with usual "git checkout $branch". Also you can start a new branch using "git checkout -b $newbranch" to start a new branch at that commit. - You can even pull from other repositories, make merges and commits while your HEAD is detached. Also you can use "git reset" to jump to arbitrary commit, while still keeping your HEAD detached. Remember that a detached state is volatile, i.e. it will be forgotten as soon as you move away from it with the checkout or reset command, unless a branch is created from it as mentioned above. It is also possible to rescue a lost detached state from the HEAD reflog. * Packed refs - Repositories with hundreds of tags have been paying large overhead, both in storage and in runtime, due to the traditional one-ref-per-file format. A new command, git-pack-refs, can be used to "pack" them in more efficient representation (you can let git-gc do this for you). - Clones and fetches over dumb transports are now aware of packed refs and can download from repositories that use them. * Configuration - configuration related to color setting are consolidated under color.* namespace (older diff.color.*, status.color.* are still supported). - 'git-repo-config' command is accessible as 'git-config' now. * Updated features - git-describe uses better criteria to pick a base ref. It used to pick the one with the newest timestamp, but now it picks the one that is topologically the closest (that is, among ancestors of commit C, the ref T that has the shortest output from "git-rev-list T..C" is chosen). - git-describe gives the number of commits since the base ref between the refname and the hash suffix. E.g. the commit one before v2.6.20-rc6 in the kernel repository is: v2.6.20-rc5-306-ga21b069 which tells you that its object name begins with a21b069, v2.6.20-rc5 is an ancestor of it (meaning, the commit contains everything -rc5 has), and there are 306 commits since v2.6.20-rc5. - git-describe with --abbrev=0 can be used to show only the name of the base ref. - git-blame learned a new option, --incremental, that tells it to output the blames as they are assigned. A sample script to use it is also included as contrib/blameview. - git-blame starts annotating from the working tree by default. * Less external dependency - We no longer require the "merge" program from the RCS suite. All 3-way file-level merges are now done internally. - The original implementation of git-merge-recursive which was in Python has been removed; we have a C implementation of it now. - git-shortlog is no longer a Perl script. It no longer requires output piped from git-log; it can accept revision parameters directly on the command line. * I18n - We have always encouraged the commit message to be encoded in UTF-8, but the users are allowed to use legacy encoding as appropriate for their projects. This will continue to be the case. However, a non UTF-8 commit encoding _must_ be explicitly set with i18n.commitencoding in the repository where a commit is made; otherwise git-commit-tree will complain if the log message does not look like a valid UTF-8 string. - The value of i18n.commitencoding in the originating repository is recorded in the commit object on the "encoding" header, if it is not UTF-8. git-log and friends notice this, and reencodes the message to the log output encoding when displaying, if they are different. The log output encoding is determined by "git log --encoding=", i18n.logoutputencoding configuration, or i18n.commitencoding configuration, in the decreasing order of preference, and defaults to UTF-8. - Tools for e-mailed patch application now default to -u behavior; i.e. it always re-codes from the e-mailed encoding to the encoding specified with i18n.commitencoding. This unfortunately forces projects that have happily been using a legacy encoding without setting i18n.commitencoding to set the configuration, but taken with other improvement, please excuse us for this very minor one-time inconvenience. * e-mailed patches - See the above I18n section. - git-format-patch now enables --binary without being asked. git-am does _not_ default to it, as sending binary patch via e-mail is unusual and is harder to review than textual patches and it is prudent to require the person who is applying the patch to explicitly ask for it. - The default suffix for git-format-patch output is now ".patch", not ".txt". This can be changed with --suffix=.txt option, or setting the config variable "format.suffix" to ".txt". * Foreign SCM interfaces - git-svn now requires the Perl SVN:: libraries, the command-line backend was too slow and limited. - the 'commit' subcommand of git-svn has been renamed to 'set-tree', and 'dcommit' is the recommended replacement for day-to-day work. - git fast-import backend. * User support - Quite a lot of documentation updates. - Bash completion scripts have been updated heavily. - Better error messages for often used Porcelainish commands. - Git GUI. This is a simple Tk based graphical interface for common Git operations. * Sliding mmap - We used to assume that we can mmap the whole packfile while in use, but with a large project this consumes huge virtual memory space and truly huge ones would not fit in the userland address space on 32-bit platforms. We now mmap huge packfile in pieces to avoid this problem. * Shallow clones - There is a partial support for 'shallow' repositories that keeps only recent history. A 'shallow clone' is created by specifying how deep that truncated history should be (e.g. "git clone --depth 5 git://some.where/repo.git"). Currently a shallow repository has number of limitations: - Cloning and fetching _from_ a shallow clone are not supported (nor tested -- so they might work by accident but they are not expected to). - Pushing from nor into a shallow clone are not expected to work. - Merging inside a shallow repository would work as long as a merge base is found in the recent history, but otherwise it will be like merging unrelated histories and may result in huge conflicts. but this would be more than adequate for people who want to look at near the tip of a big project with a deep history and send patches in e-mail format. ">
1.5.0
for "diff --git" formatted patches. - "git rerere" recorded a conflict that had one side empty (the other side adds) incorrectly; this made merging in the other direction fail to use previously recorded resolution. - t4200 test was broken where "wc -l" pads its output with spaces. - "git branch -m old new" to rename branch did not work without a configuration file in ".git/config". - The sample hook for notification e-mail was misnamed. - gitweb did not show type-changing patch correctly in the blobdiff view. - git-svn did not error out with incorrect command line options. - git-svn fell into an infinite loop when insanely long commit message was found. - git-svn dcommit and rebase was confused by patches that were merged from another branch that is managed by git-svn. - git-svn used to get confused when globbing remote branch/tag spec (e.g. "branches = proj/branches/*:refs/remotes/origin/*") is used and there was a plain file that matched the glob. ">
1.5.1.1
1.5.1.2
1.5.1.3
1.5.1.4
1.5.1.5
1.5.1.6
" to allow more flexible custom log output. - "git diff" learned --ignore-space-at-eol. This is a weaker form of --ignore-space-change. - "git diff --no-index pathA pathB" can be used as diff replacement with git specific enhancements. - "git diff --no-index" can read from '-' (standard input). - "git diff" also learned --exit-code to exit with non-zero status when it found differences. In the future we might want to make this the default but that would be a rather big backward incompatible change; it will stay as an option for now. - "git diff --quiet" is --exit-code with output turned off, meant for scripted use to quickly determine if there is any tree-level difference. - Textual patch generation with "git diff" without -w/-b option has been significantly optimized. "git blame" got faster because of the same change. - "git log" and "git rev-list" has been optimized significantly when they are used with pathspecs. - "git branch --track" can be used to set up configuration variables to help it easier to base your work on branches you track from a remote site. - "git format-patch --attach" now emits attachments. Use --inline to get an inlined multipart/mixed. - "git name-rev" learned --refs=, to limit the tags used for naming the given revisions only to the ones matching the given pattern. - "git remote update" is to run "git fetch" for defined remotes to update tracking branches. - "git cvsimport" can now take '-d' to talk with a CVS repository different from what are recorded in CVS/Root (overriding it with environment CVSROOT does not work). - "git bundle" can help sneaker-netting your changes between repositories. - "git mergetool" can help 3-way file-level conflict resolution with your favorite graphical merge tools. - A new configuration "core.symlinks" can be used to disable symlinks on filesystems that do not support them; they are checked out as regular files instead. - You can name a commit object with its first line of the message. The syntax to use is ':/message text'. E.g. $ git show ":/object name: introduce ':/' notation" means the same thing as: $ git show 28a4d940443806412effa246ecc7768a21553ec7 - "git bisect" learned a new command "run" that takes a script to run after each revision is checked out to determine if it is good or bad, to automate the bisection process. - "git log" family learned a new traversal option --first-parent, which does what the name suggests. * Updated behavior of existing commands. - "git-merge-recursive" used to barf when there are more than one common ancestors for the merge, and merging them had a rename/rename conflict. This has been fixed. - "git fsck" does not barf on corrupt loose objects. - "git rm" does not remove newly added files without -f. - "git archimport" allows remapping when coming up with git branch names from arch names. - git-svn got almost a rewrite. - core.autocrlf configuration, when set to 'true', makes git to convert CRLF at the end of lines in text files to LF when reading from the filesystem, and convert in reverse when writing to the filesystem. The variable can be set to 'input', in which case the conversion happens only while reading from the filesystem but files are written out with LF at the end of lines. Currently, which paths to consider 'text' (i.e. be subjected to the autocrlf mechanism) is decided purely based on the contents, but the plan is to allow users to explicitly override this heuristic based on paths. - The behavior of 'git-apply', when run in a subdirectory, without --index nor --cached were inconsistent with that of the command with these options. This was fixed to match the behavior with --index. A patch that is meant to be applied with -p1 from the toplevel of the project tree can be applied with any custom -p option. A patch that is not relative to the toplevel needs to be applied with -p option with or without --index (or --cached). - "git diff" outputs a trailing HT when pathnames have embedded SP on +++/--- header lines, in order to help "GNU patch" to parse its output. "git apply" was already updated to accept this modified output format since ce74618d (Sep 22, 2006). - "git cvsserver" runs hooks/update and honors its exit status. - "git cvsserver" can be told to send everything with -kb. - "git diff --check" also honors the --color output option. - "git name-rev" used to stress the fact that a ref is a tag too much, by saying something like "v1.2.3^0~22". It now says "v1.2.3~22" in such a case (it still says "v1.2.3^0" if it does not talk about an ancestor of the commit that is tagged, which makes sense). - "git rev-list --boundary" now shows boundary markers for the commits omitted by --max-age and --max-count condition. - The configuration mechanism now reads $(prefix)/etc/gitconfig. - "git apply --verbose" shows what preimage lines were wanted when it couldn't find them. - "git status" in a read-only repository got a bit saner. - "git fetch" (hence "git clone" and "git pull") are less noisy when the output does not go to tty. - "git fetch" between repositories with many refs were slow even when there are not many changes that needed transferring. This has been sped up by partially rewriting the heaviest parts in C. - "git mailinfo" which splits an e-mail into a patch and the meta-information was rewritten, thanks to Don Zickus. It handles nested multipart better. The command was broken for a brief period on 'master' branch since 1.5.0 but the breakage is fixed now. - send-email learned configurable bcc and chain-reply-to. - "git remote show $remote" also talks about branches that would be pushed if you run "git push remote". - Using objects from packs is now seriously optimized by clever use of a cache. This should be most noticeable in git-log family of commands that involve reading many tree objects. In addition, traversing revisions while filtering changes with pathspecs is made faster by terminating the comparison between the trees as early as possible. * Hooks - The part to send out notification e-mails was removed from the sample update hook, as it was not an appropriate place to do so. The proper place to do this is the new post-receive hook. An example hook has been added to contrib/hooks/. * Others - git-revert, git-gc and git-cherry-pick are now built-ins. Fixes since v1.5.0 ------------------ These are all in v1.5.0.x series. * Documentation updates - Clarifications and corrections to 1.5.0 release notes. - The main documentation did not link to git-remote documentation. - Clarified introductory text of git-rebase documentation. - Converted remaining mentions of update-index on Porcelain documents to git-add/git-rm. - Some i18n.* configuration variables were incorrectly described as core.*; fixed. - added and clarified core.bare, core.legacyheaders configurations. - updated "git-clone --depth" documentation. - user-manual updates. - Options to 'git remote add' were described insufficiently. - Configuration format.suffix was not documented. - Other formatting and spelling fixes. - user-manual has better cross references. - gitweb installation/deployment procedure is now documented. * Bugfixes - git-upload-pack closes unused pipe ends; earlier this caused many zombies to hang around. - git-rerere was recording the contents of earlier hunks duplicated in later hunks. This prevented resolving the same conflict when performing the same merge the other way around. - git-add and git-update-index on a filesystem on which executable bits are unreliable incorrectly reused st_mode bits even when the path changed between symlink and regular file. - git-daemon marks the listening sockets with FD_CLOEXEC so that it won't be leaked into the children. - segfault from git-blame when the mandatory pathname parameter was missing was fixed; usage() message is given instead. - git-rev-list did not read $GIT_DIR/config file, which means that did not honor i18n.logoutputencoding correctly. - Automated merge conflict handling when changes to symbolic links conflicted were completely broken. The merge-resolve strategy created a regular file with conflict markers in it in place of the symbolic link. The default strategy, merge-recursive was even more broken. It removed the path that was pointed at by the symbolic link. Both of these problems have been fixed. - 'git diff maint master next' did not correctly give combined diff across three trees. - 'git fast-import' portability fix for Solaris. - 'git show-ref --verify' without arguments did not error out but segfaulted. - 'git diff :tracked-file `pwd`/an-untracked-file' gave an extra slashes after a/ and b/. - 'git format-patch' produced too long filenames if the commit message had too long line at the beginning. - Running 'make all' and then without changing anything running 'make install' still rebuilt some files. This was inconvenient when building as yourself and then installing as root (especially problematic when the source directory is on NFS and root is mapped to nobody). - 'git-rerere' failed to deal with two unconflicted paths that sorted next to each other. - 'git-rerere' attempted to open(2) a symlink and failed if there was a conflict. Since a conflicting change to a symlink would not benefit from rerere anyway, the command now ignores conflicting changes to symlinks. - 'git-repack' did not like to pass more than 64 arguments internally to underlying 'rev-list' logic, which made it impossible to repack after accumulating many (small) packs in the repository. - 'git-diff' to review the combined diff during a conflicted merge were not reading the working tree version correctly when changes to a symbolic link conflicted. It should have read the data using readlink(2) but read from the regular file the symbolic link pointed at. - 'git-remote' did not like period in a remote's name. - 'git.el' honors the commit coding system from the configuration. - 'blameview' in contrib/ correctly digs deeper when a line is clicked. - 'http-push' correctly makes sure the remote side has leading path. Earlier it started in the middle of the path, and incorrectly. - 'git-merge' did not exit with non-zero status when the working tree was dirty and cannot fast forward. It does now. - 'cvsexportcommit' does not lose yet-to-be-used message file. - int-vs-size_t typefix when running combined diff on files over 2GB long. - 'git apply --whitespace=strip' should not touch unmodified lines. - 'git-mailinfo' choke when a logical header line was too long. - 'git show A..B' did not error out. Negative ref ("not A" in this example) does not make sense for the purpose of the command, so now it errors out. - 'git fmt-merge-msg --file' without file parameter did not correctly error out. - 'git archimport' barfed upon encountering a commit without summary. - 'git index-pack' did not protect itself from getting a short read out of pread(2). - 'git http-push' had a few buffer overruns. - Build dependency fixes to rebuild fetch.o when other headers change. - git.el does not add duplicate sign-off lines. - git-commit shows the full stat of the resulting commit, not just about the files in the current directory, when run from a subdirectory. - "git-checkout -m '@{8 hours ago}'" had a funny failure from eval; fixed. - git-merge (hence git-pull) did not refuse fast-forwarding when the working tree had local changes that would have conflicted with it. - a handful small fixes to gitweb. - build procedure for user-manual is fixed not to require locally installed stylesheets. - "git commit $paths" on paths whose earlier contents were already updated in the index were failing out. * Tweaks - sliding mmap() inefficiently mmaped the same region of a packfile with an access pattern that used objects in the reverse order. This has been made more efficient. ">
1.5.1
1.5.2.1
1.5.2.2
1.5.2.3
xyzzy" symlink and file "xyzzy/filfre", while the other one has a file "frotz/filfre". - "git prune" used to segfault upon seeing a commit that is referred to by a tree object (aka "subproject"). - "git diff --name-status --no-index" mishandled an added file. - "git apply --reverse --whitespace=warn" still complained about whitespaces that a forward application would have introduced. * Documentation Fixes and Updates - A handful documentation updates. ">
1.5.2.4
" did not work from a subdirectory. - "git apply" left an empty directory after all its files are renamed away. - "git $anycmd foo/bar", when there is a file 'foo' in the working tree, complained that "git $anycmd foo/bar --" form should be used to disambiguate between revs and files, which was completely bogus. - "git checkout-index" and other commands that checks out files to the work tree tried unlink(2) on directories, which is a sane thing to do on sane systems, but not on Solaris when you are root. * Documentation Fixes and Updates - A handful documentation fixes. ">
1.5.2.5
option, to override the built-in "[PATCH]". - "git add -u" is a quick way to do the first stage of "git commit -a" (i.e. update the index to match the working tree); it obviously does not make a commit. - "git clean" honors a new configuration, "clean.requireforce". When set to true, this makes "git clean" a no-op, preventing you from losing files by typing "git clean" when you meant to say "make clean". You can still say "git clean -f" to override this. - "git log" family of commands learned --date={local,relative,default} option. --date=relative is synonym to the --relative-date. --date=local gives the timestamp in local timezone. * Updated behavior of existing commands. - When $GIT_COMMITTER_EMAIL or $GIT_AUTHOR_EMAIL is not set but $EMAIL is set, the latter is used as a substitute. - "git diff --stat" shows size of preimage and postimage blobs for binary contents. Earlier it only said "Bin". - "git lost-found" shows stuff that are unreachable except from reflogs. - "git checkout branch^0" now detaches HEAD at the tip commit on the named branch, instead of just switching to the branch (use "git checkout branch" to switch to the branch, as before). - "git bisect next" can be used after giving only a bad commit without giving a good one (this starts bisection half-way to the root commit). We used to refuse to operate without a good and a bad commit. - "git push", when pushing into more than one repository, does not stop at the first error. - "git archive" does not insist you to give --format parameter anymore; it defaults to "tar". - "git cvsserver" can use backends other than sqlite. - "gitview" (in contrib/ section) learned to better support "git-annotate". - "git diff $commit1:$path2 $commit2:$path2" can now report mode changes between the two blobs. - Local "git fetch" from a repository whose object store is one of the alternates (e.g. fetching from the origin in a repository created with "git clone -l -s") avoids downloading objects unnecessarily. - "git blame" uses .mailmap to canonicalize the author name just like "git shortlog" does. - "git pack-objects" pays attention to pack.depth configuration variable. - "git cherry-pick" and "git revert" does not use .msg file in the working tree to prepare commit message; instead it uses $GIT_DIR/MERGE_MSG as other commands do. * Builds - git-p4import has never been installed; now there is an installation option to do so. - gitk and git-gui can be configured out. - Generated documentation pages automatically get version information from GIT_VERSION. - Parallel build with "make -j" descending into subdirectory was fixed. * Performance Tweaks - Optimized "git-rev-list --bisect" (hence "git-bisect"). - Optimized "git-add $path" in a large directory, most of whose contents are ignored. - Optimized "git-diff-tree" for reduced memory footprint. - The recursive merge strategy updated a worktree file that was changed identically in two branches, when one of them renamed it. We do not do that when there is no rename, so match that behaviour. This avoids excessive rebuilds. - The default pack depth has been increased to 50, as the recent addition of delta_base_cache makes deeper delta chains much less expensive to access. Depending on the project, it was reported that this reduces the resulting pack file by 10% or so. Fixes since v1.5.1 ------------------ All of the fixes in v1.5.1 maintenance series are included in this release, unless otherwise noted. * Bugfixes - Switching branches with "git checkout" refused to work when a path changes from a file to a directory between the current branch and the new branch, in order not to lose possible local changes in the directory that is being turned into a file with the switch. We now allow such a branch switch after making sure that there is no locally modified file nor un-ignored file in the directory. This has not been backported to 1.5.1.x series, as it is rather an intrusive change. - Merging branches that have a file in one and a directory in another at the same path used to get quite confused. We handle such a case a bit more carefully, even though that is still left as a conflict for the user to sort out. This will not be backported to 1.5.1.x series, as it is rather an intrusive change. - git-fetch had trouble with a remote with insanely large number of refs. - "git clean -d -X" now does not remove non-excluded directories. - rebasing (without -m) a series that changes a symlink to a directory in the middle of a path confused git-apply greatly and refused to operate. ">
1.5.2
1.5.3.1
1.5.3.2
1.5.3.3
1.5.3.4
.remote configuration settings. * Building with NO_PERL_MAKEMAKER excessively rebuilt contents of perl/ subdirectory by rewriting perl.mak. * http.sslVerify configuration settings were not used in scripted Porcelains. * "git-add" leaked a bit of memory while scanning for files to add. * A few workarounds to squelch false warnings from recent gcc have been added. * "git-send-pack $remote frotz" segfaulted when there is nothing named 'frotz' on the local end. * "git-rebase --interactive" did not handle its "--strategy" option properly. ">
1.5.3.5
1.5.3.6
1.5.3.7
1.5.3.8
" can use more formats: iso8601, rfc2822. - The hunk header output from "git diff" family can be customized with the attributes mechanism. See gitattributes(5) for details. - "git stash" allows you to quickly save away your work in progress and replay it later on an updated state. - "git rebase" learned an "interactive" mode that let you pick and reorder which commits to rebuild. - "git fsck" can save its findings in $GIT_DIR/lost-found, without a separate invocation of "git lost-found" command. The blobs stored by lost-found are stored in plain format to allow you to grep in them. - $GIT_WORK_TREE environment variable can be used together with $GIT_DIR to work in a subdirectory of a working tree that is not located at "$GIT_DIR/..". - Giving "--file=" option to "git config" is the same as running the command with GIT_CONFIG= environment. - "git log" learned a new option "--follow", to follow renaming history of a single file. - "git filter-branch" lets you rewrite the revision history of specified branches. You can specify a number of filters to modify the commits, files and trees. - "git cvsserver" learned new options (--base-path, --export-all, --strict-paths) inspired by "git daemon". - "git daemon --base-path-relaxed" can help migrating a repository URL that did not use to use --base-path to use --base-path. - "git commit" can use "-t templatefile" option and commit.template configuration variable to prime the commit message given to you in the editor. - "git submodule" command helps you manage the projects from the superproject that contain them. - In addition to core.compression configuration option, core.loosecompression and pack.compression options can independently tweak zlib compression levels used for loose and packed objects. - "git ls-tree -l" shows size of blobs pointed at by the tree entries, similar to "/bin/ls -l". - "git rev-list" learned --regexp-ignore-case and --extended-regexp options to tweak its matching logic used for --grep filtering. - "git describe --contains" is a handier way to call more obscure command "git name-rev --tags". - "git gc --aggressive" tells the command to spend more cycles to optimize the repository harder. - "git repack" learned a "window-memory" limit which dynamically reduces the window size to stay within the specified memory usage. - "git repack" can be told to split resulting packs to avoid exceeding limit specified with "--max-pack-size". - "git fsck" gained --verbose option. This is really really verbose but it might help you identify exact commit that is corrupt in your repository. - "git format-patch" learned --numbered-files option. This may be useful for MH users. - "git format-patch" learned format.subjectprefix configuration variable, which serves the same purpose as "--subject-prefix" option. - "git tag -n -l" shows tag annotations while listing tags. - "git cvsimport" can optionally use the separate-remote layout. - "git blame" can be told to see through commits that change whitespaces and indentation levels with "-w" option. - "git send-email" can be told not to thread the messages when sending out more than one patches. - "git send-email" can also be told how to find whom to cc the message to for each message via --cc-cmd. - "git config" learned NUL terminated output format via -z to help scripts. - "git add" learned "--refresh ..." option to selectively refresh the cached stat information. - "git init -q" makes the command quieter. - "git -p command" now has a cousin of opposite sex, "git --no-pager command". * Updated behavior of existing commands. - "gitweb" can offer multiple snapshot formats. ***NOTE*** Unfortunately, this changes the format of the $feature{snapshot}{default} entry in the per-site configuration file 'gitweb_config.perl'. It used to be a three-element tuple that describe a single format; with the new configuration item format, you only have to say the name of the format ('tgz', 'tbz2' or 'zip'). Please update the your configuration file accordingly. - "git clone" uses -l (hardlink files under .git) by default when cloning locally. - URL used for "git clone" and friends can specify nonstandard SSH port by using ssh://host:port/path/to/repo syntax. - "git bundle create" can now create a bundle without negative refs, i.e. "everything since the beginning up to certain points". - "git diff" (but not the plumbing level "git diff-tree") now recursively descends into trees by default. - "git diff" does not show differences that come only from stat-dirtiness in the form of "diff --git" header anymore. It runs "update-index --refresh" silently as needed. - "git tag -l" used to match tags by globbing its parameter as if it has wildcard '*' on both ends, which made "git tag -l gui" to match tag 'gitgui-0.7.0'; this was very annoying. You now have to add asterisk on the sides you want to wildcard yourself. - The editor to use with many interactive commands can be overridden with GIT_EDITOR environment variable, or if it does not exist, with core.editor configuration variable. As before, if you have neither, environment variables VISUAL and EDITOR are consulted in this order, and then finally we fall back on "vi". - "git rm --cached" does not complain when removing a newly added file from the index anymore. - Options to "git log" to affect how --grep/--author options look for given strings now have shorter abbreviations. -i is for ignore case, and -E is for extended regexp. - "git log" learned --log-size to show the number of bytes in the log message part of the output to help qgit. - "git log --name-status" does not require you to give "-r" anymore. As a general rule, Porcelain commands should recurse when showing diff. - "git format-patch --root A" can be used to format everything since the beginning up to A. This was supported with "git format-patch --root A A" for a long time, but was not properly documented. - "git svn dcommit" retains local merge information. - "git svnimport" allows an empty string to be specified as the trunk/ directory. This is necessary to suck data from a SVN repository that doe not have trunk/ branches/ and tags/ organization at all. - "git config" to set values also honors type flags like --bool and --int. - core.quotepath configuration can be used to make textual git output to emit most of the characters in the path literally. - "git mergetool" chooses its backend more wisely, taking notice of its environment such as use of X, Gnome/KDE, etc. - "gitweb" shows merge commits a lot nicer than before. The default view uses more compact --cc format, while the UI allows to choose normal diff with any parent. - snapshot files "gitweb" creates from a repository at $path/$project/.git are more useful. We use $project part in the filename, which we used to discard. - "git cvsimport" creates lightweight tags; there is no interesting information we can record in an annotated tag, and the handcrafted ones the old code created was not properly formed anyway. - "git push" pretends that you immediately fetched back from the remote by updating corresponding remote tracking branches if you have any. - The diffstat given after a merge (or a pull) honors the color.diff configuration. - "git commit --amend" is now compatible with various message source options such as -m/-C/-c/-F. - "git apply --whitespace=strip" removes blank lines added at the end of the file. - "git fetch" over git native protocols with "-v" option shows connection status, and the IP address of the other end, to help diagnosing problems. - We used to have core.legacyheaders configuration, when set to false, allowed git to write loose objects in a format that mimics the format used by objects stored in packs. It turns out that this was not so useful. Although we will continue to read objects written in that format, we do not honor that configuration anymore and create loose objects in the legacy/traditional format. - "--find-copies-harder" option to diff family can now be spelled as "-C -C" for brevity. - "git mailsplit" (hence "git am") can read from Maildir formatted mailboxes. - "git cvsserver" does not barf upon seeing "cvs login" request. - "pack-objects" honors "delta" attribute set in .gitattributes. It does not attempt to deltify blobs that come from paths with delta attribute set to false. - "new-workdir" script (in contrib) can now be used with a bare repository. - "git mergetool" learned to use gvimdiff. - "gitview" (in contrib) has a better blame interface. - "git log" and friends did not handle a commit log message that is larger than 16kB; they do now. - "--pretty=oneline" output format for "git log" and friends deals with "malformed" commit log messages that have more than one lines in the first paragraph better. We used to show the first line, cutting the title at mid-sentence; we concatenate them into a single line and treat the result as "oneline". - "git p4import" has been demoted to contrib status. For a superior option, checkout the "git p4" front end to "git fast-import" (also in contrib). The man page and p4 rpm have been removed as well. - "git mailinfo" (hence "am") now tries to see if the message is in utf-8 first, instead of assuming iso-8859-1, if incoming e-mail does not say what encoding it is in. * Builds - old-style function definitions (most notably, a function without parameter defined with "func()", not "func(void)") have been eradicated. - "git tag" and "git verify-tag" have been rewritten in C. * Performance Tweaks - "git pack-objects" avoids re-deltification cost by caching small enough delta results it creates while looking for the best delta candidates. - "git pack-objects" learned a new heuristic to prefer delta that is shallower in depth over the smallest delta possible. This improves both overall packfile access performance and packfile density. - diff-delta code that is used for packing has been improved to work better on big files. - when there are more than one pack files in the repository, the runtime used to try finding an object always from the newest packfile; it now tries the same packfile as we found the object requested the last time, which exploits the locality of references. - verifying pack contents done by "git fsck --full" got boost by carefully choosing the order to verify objects in them. - "git read-tree -m" to read into an already populated index has been optimized vastly. The effect of this can be seen when switching branches that have differences in only a handful paths. - "git add paths..." and "git commit paths..." has also been heavily optimized. Fixes since v1.5.2 ------------------ All of the fixes in v1.5.2 maintenance series are included in this release, unless otherwise noted. * Bugfixes - "gitweb" had trouble handling non UTF-8 text with older Encode.pm Perl module. - "git svn" misparsed the data from the commits in the repository when the user had "color.diff = true" in the configuration. This has been fixed. - There was a case where "git svn dcommit" clobbered changes made on the SVN side while committing multiple changes. - "git-write-tree" had a bad interaction with racy-git avoidance and gitattributes mechanisms. - "git --bare command" overrode existing GIT_DIR setting and always made it treat the current working directory as GIT_DIR. - "git ls-files --error-unmatch" does not complain if you give the same path pattern twice by mistake. - "git init" autodetected core.filemode but not core.symlinks, which made a new directory created automatically by "git clone" cumbersome to use on filesystems that require these configurations to be set. - "git log" family of commands behaved differently when run as "git log" (no pathspec) and as "git log --" (again, no pathspec). This inconsistency was introduced somewhere in v1.3.0 series but now has been corrected. - "git rebase -m" incorrectly displayed commits that were skipped. ">
1.5.3
1.5.4.1
1.5.4.2
1.5.4.3
" incorrectly made commits. * "git merge --squash --no-ff ", which is a nonsense combination of options, was not rejected. * "git ls-remote" and "git remote show" against an empty repository failed, instead of just giving an empty result (regression). * "git fast-import" did not handle a renamed path whose name needs to be quoted, due to a bug in unquote_c_style() function. * "git cvsexportcommit" was confused when multiple files with the same basename needed to be pushed out in the same commit. * "git daemon" did not send early errors to syslog. * "git log --merge" did not work well with --left-right option. * "git svn" prompted for client cert password every time it accessed the server. * The reset command in "git fast-import" data stream was documented to end with an optional LF, but it actually required one. * "git svn dcommit/rebase" did not honor --rewrite-root option. Also included are a handful documentation updates. ">
1.5.4.4
1.5.4.5
1.5.4.6
1.5.4.7
' has been optimized. * Rename detection of diff family while detecting exact matches has been greatly optimized. * Rename detection of diff family tries to make more natural looking pairing. Earlier, if multiple identical rename sources were found in the preimage, the source used was picked pretty much at random. * Value "true" for color.diff and color.status configuration used to mean "always" (even when the output is not going to a terminal). This has been corrected to mean the same thing as "auto". * "git diff" Porcelain now respects diff.external configuration, which is another way to specify GIT_EXTERNAL_DIFF. * "git diff" can be told to use different prefixes other than "a/" and "b/" e.g. "git diff --src-prefix=l/ --dst-prefix=k/". * "git diff" sometimes did not quote paths with funny characters properly. * "git log" (and any revision traversal commands) misbehaved when --diff-filter is given but was not asked to actually produce diff. * HTTP proxy can be specified per remote repository using remote.*.httpproxy configuration, or global http.proxy configuration variable. * Various Perforce importer updates. * Example update and post-receive hooks have been improved. * Any command that wants to take a commit object name can now use ":/string" syntax to name a commit. * "git reset" is now built-in and its output can be squelched with -q. * "git reset --hard" does not make any sense in a bare repository, but did not error out; fixed. * "git send-email" can optionally talk over ssmtp and use SMTP-AUTH. * "git rebase" learned --whitespace option. * In "git rebase", when you decide not to replay a particular change after the command stopped with a conflict, you can say "git rebase --skip" without first running "git reset --hard", as the command now runs it for you. * "git rebase --interactive" mode can now work on detached HEAD. * Other minor to serious bugs in "git rebase -i" have been fixed. * "git rebase" now detaches head during its operation, so after a successful "git rebase" operation, the reflog entry branch@{1} for the current branch points at the commit before the rebase was started. * "git rebase -i" also triggers rerere to help your repeated merges. * "git merge" can call the "post-merge" hook. * "git pack-objects" can optionally run deltification with multiple threads. * "git archive" can optionally substitute keywords in files marked with export-subst attribute. * "git cherry-pick" made a misguided attempt to repeat the original command line in the generated log message, when told to cherry-pick a commit by naming a tag that points at it. It does not anymore. * "git for-each-ref" learned %(xxxdate:) syntax to show the various date fields in different formats. * "git gc --auto" is a low-impact way to automatically run a variant of "git repack" that does not lose unreferenced objects (read: safer than the usual one) after the user accumulates too many loose objects. * "git clean" has been rewritten in C. * You need to explicitly set clean.requireForce to "false" to allow "git clean" without -f to do any damage (lack of the configuration variable used to mean "do not require -f option to lose untracked files", but we now use the safer default). * The kinds of whitespace errors "git diff" and "git apply" notice (and fix) can be controlled via 'core.whitespace' configuration variable and 'whitespace' attribute in .gitattributes file. * "git push" learned --dry-run option to show what would happen if a push is run. * "git push" does not update a tracking ref on the local side when the remote refused to update the corresponding ref. * "git push" learned --mirror option. This is to push the local refs one-to-one to the remote, and deletes refs from the remote that do not exist anymore in the repository on the pushing side. * "git push" can remove a corrupt ref at the remote site with the usual ":ref" refspec. * "git remote" knows --mirror mode. This is to set up configuration to push into a remote repository to store local branch heads to the same branch on the remote side, and remove branch heads locally removed from local repository at the same time. Suitable for pushing into a back-up repository. * "git remote" learned "rm" subcommand. * "git cvsserver" can be run via "git shell". Also, "cvs" is recognized as a synonym for "git cvsserver", so that CVS users can be switched to git just by changing their login shell. * "git cvsserver" acts more like receive-pack by running post-receive and post-update hooks. * "git am" and "git rebase" are far less verbose. * "git pull" learned to pass --[no-]ff option to underlying "git merge". * "git pull --rebase" is a different way to integrate what you fetched into your current branch. * "git fast-export" produces data-stream that can be fed to fast-import to reproduce the history recorded in a git repository. * "git add -i" takes pathspecs to limit the set of files to work on. * "git add -p" is a short-hand to go directly to the selective patch subcommand in the interactive command loop and to exit when done. * "git add -i" UI has been colorized. The interactive prompt and menu can be colored by setting color.interactive configuration. The diff output (including the hunk picker) are colored with color.diff configuration. * "git commit --allow-empty" allows you to create a single-parent commit that records the same tree as its parent, overriding the usual safety valve. * "git commit --amend" can amend a merge that does not change the tree from its first parent. * "git commit" used to unconditionally strip comment lines that began with '#' and removed excess blank lines. This behavior has been made configurable. * "git commit" has been rewritten in C. * "git stash random-text" does not create a new stash anymore. It was a UI mistake. Use "git stash save random-text", or "git stash" (without extra args) for that. * "git stash clear extra-text" does not clear the whole stash anymore. It is tempting to expect "git stash clear stash@{2}" to drop only a single named stash entry, and it is rude to discard everything when that is asked (but not provided). * "git prune --expire .insteadOf" did not work correctly. * "git clean" ran inside subdirectory behaved as if the directory was explicitly specified for removal by the end user from the top level. * "git bisect" from a detached head leaked an unnecessary error message. * "git bisect good $a $b" when $a is Ok but $b is bogus should have atomically failed before marking $a as good. * "git fmt-merge-msg" did not clean up leading empty lines from commit log messages like "git log" family does. * "git am" recorded a commit with empty Subject: line without complaining. * when given a commit log message whose first paragraph consists of multiple lines, "git rebase" squashed it into a single line. * "git remote add $bogus_name $url" did not complain properly. Also comes with various documentation updates. ">
1.5.5.1
1.5.5.2
1.5.5.3
1.5.5.4
1.5.5.5
1.5.5.6
.insteadof = " can be used to tell "git-fetch" and "git-push" to use different URL than what is given from the command line. * "git add -i" behaves better even before you make an initial commit. * "git am" refused to run from a subdirectory without a good reason. * After "git apply --whitespace=fix" fixes whitespace errors in a patch, a line before the fix can appear as a context or preimage line in a later patch, causing the patch not to apply. The command now knows to see through whitespace fixes done to context lines to successfully apply such a patch series. * "git branch" (and "git checkout -b") to branch from a local branch can optionally set "branch..merge" to mark the new branch to build on the other local branch, when "branch.autosetupmerge" is set to "always", or when passing the command line option "--track" (this option was ignored when branching from local branches). By default, this does not happen when branching from a local branch. * "git checkout" to switch to a branch that has "branch..merge" set (i.e. marked to build on another branch) reports how much the branch and the other branch diverged. * When "git checkout" has to update a lot of paths, it used to be silent for 4 seconds before it showed any progress report. It is now a bit more impatient and starts showing progress report early. * "git commit" learned a new hook "prepare-commit-msg" that can inspect what is going to be committed and prepare the commit log message template to be edited. * "git cvsimport" can now take more than one -M options. * "git describe" learned to limit the tags to be used for naming with --match option. * "git describe --contains" now barfs when the named commit cannot be described. * "git describe --exact-match" describes only commits that are tagged. * "git describe --long" describes a tagged commit as $tag-0-$sha1, instead of just showing the exact tagname. * "git describe" warns when using a tag whose name and path contradict with each other. * "git diff" learned "--relative" option to limit and output paths relative to the current directory when working in a subdirectory. * "git diff" learned "--dirstat" option to show birds-eye-summary of changes more concisely than "--diffstat". * "git format-patch" learned --cover-letter option to generate a cover letter template. * "git gc" learned --quiet option. * "git gc" now automatically prunes unreachable objects that are two weeks old or older. * "git gc --auto" can be disabled more easily by just setting gc.auto to zero. It also tolerates more packfiles by default. * "git grep" now knows "--name-only" is a synonym for the "-l" option. * "git help " now reports "'git ' is alias to ", instead of saying "No manual entry for git-". * "git help" can use different backends to show manual pages and this can be configured using "man.viewer" configuration. * "gitk" does not restore window position from $HOME/.gitk anymore (it still restores the size). * "git log --grep=" learned "--fixed-strings" option to look for without treating it as a regular expression. * "git gui" learned an auto-spell checking. * "git push HEAD" and "git push +HEAD" works as expected; they push the current branch (and only the current branch). In addition, HEAD can be written as the value of "remote..push" configuration variable. * When the configuration variable "pack.threads" is set to 0, "git repack" auto detects the number of CPUs and uses that many threads. * "git send-email" learned to prompt for passwords interactively. * "git send-email" learned an easier way to suppress CC recipients. * "git stash" learned "pop" command, that applies the latest stash and removes it from the stash, and "drop" command to discard the named stash entry. * "git submodule" learned a new subcommand "summary" to show the symmetric difference between the HEAD version and the work tree version of the submodule commits. * Various "git cvsimport", "git cvsexportcommit", "git cvsserver", "git svn" and "git p4" improvements. (internal) * Duplicated code between git-help and git-instaweb that launches user's preferred browser has been refactored. * It is now easier to write test scripts that records known breakages. * "git checkout" is rewritten in C. * "git remote" is rewritten in C. * Two conflict hunks that are separated by a very short span of common lines are now coalesced into one larger hunk, to make the result easier to read. * Run-command API's use of file descriptors is documented clearer and is more consistent now. * diff output can be sent to FILE * that is different from stdout. This will help reimplementing more things in C. Fixes since v1.5.4 ------------------ All of the fixes in v1.5.4 maintenance series are included in this release, unless otherwise noted. * "git-http-push" did not allow deletion of remote ref with the usual "push :" syntax. * "git-rebase --abort" did not go back to the right location if "git-reset" was run during the "git-rebase" session. * "git imap-send" without setting imap.host did not error out but segfaulted. ">
1.5.5
1.5.6.1
1.5.6.2
1.5.6.3
1.5.6.4
1.5.6.5
1.5.6.6
") as section 7 of the manual pages. This means bookmarks to some HTML documentation files may need to be updated (eg "tutorial.html" became "gittutorial.html"). (performance) * "git clone" was rewritten in C. This will hopefully help cloning a repository with insane number of refs. * "git rebase --onto $there $from $branch" used to switch to the tip of $branch only to immediately reset back to $from, smudging work tree files unnecessarily. This has been optimized. * Object creation codepath in "git-svn" has been optimized by enhancing plumbing commands git-cat-file and git-hash-object. (usability, bells and whistles) * "git add -p" (and the "patch" subcommand of "git add -i") can choose to apply (or not apply) mode changes independently from contents changes. * "git bisect help" gives longer and more helpful usage information. * "git bisect" does not use a special branch "bisect" anymore; instead, it does its work on a detached HEAD. * "git branch" (and "git checkout -b") can be told to set up branch..rebase automatically, so that later you can say "git pull" and magically cause "git pull --rebase" to happen. * "git branch --merged" and "git branch --no-merged" can be used to list branches that have already been merged (or not yet merged) to the current branch. * "git cherry-pick" and "git revert" can add a sign-off. * "git commit" mentions the author identity when you are committing somebody else's changes. * "git diff/log --dirstat" output is consistent between binary and textual changes. * "git filter-branch" rewrites signed tags by demoting them to annotated. * "git format-patch --no-binary" can produce a patch that lack binary changes (i.e. cannot be used to propagate the whole changes) meant only for reviewing. * "git init --bare" is a synonym for "git --bare init" now. * "git gc --auto" honors a new pre-auto-gc hook to temporarily disable it. * "git log --pretty=tformat:" gives a LF after each entry, instead of giving a LF between each pair of entries which is how "git log --pretty=format:" works. * "git log" and friends learned the "--graph" option to show the ancestry graph at the left margin of the output. * "git log" and friends can be told to use date format that is different from the default via 'log.date' configuration variable. * "git send-email" now can send out messages outside a git repository. * "git send-email --compose" was made aware of rfc2047 quoting. * "git status" can optionally include output from "git submodule summary". * "git svn" learned --add-author-from option to propagate the authorship by munging the commit log message. * new object creation and looking up in "git svn" has been optimized. * "gitweb" can read from a system-wide configuration file. (internal) * "git unpack-objects" and "git receive-pack" is now more strict about detecting breakage in the objects they receive over the wire. Fixes since v1.5.5 ------------------ All of the fixes in v1.5.5 maintenance series are included in this release, unless otherwise noted. And there are too numerous small fixes to otherwise note here ;-) ">
1.5.6
1.6.0.1
1.6.0.2
1.6.0.3
1.6.0.4
" did not work with options other than -c, most notably with -m. * "git pack-objects" did not make its best effort to honor --max-pack-size option when a single first object already busted the given limit and placed many objects in a single pack. * "git-p4" fast import frontend was too eager to trigger its keyword expansion logic, even on a keyword-looking string that does not have closing '$' on the same line. * "git push $there" when the remote $there is defined in $GIT_DIR/branches/$there behaves more like what cg-push from Cogito used to work. * when giving up resolving a conflicted merge, "git reset --hard" failed to remove new paths from the working tree. * "git tag" did not complain when given mutually incompatible set of options. * The message constructed in the internal editor was discarded when "git tag -s" failed to sign the message, which was often caused by the user not configuring GPG correctly. * "make check" cannot be run without sparse; people may have meant to say "make test" instead, so suggest that. * Internal diff machinery had a corner case performance bug that choked on a large file with many repeated contents. * "git repack" used to grab objects out of packs marked with .keep into a new pack. * Many unsafe call to sprintf() style varargs functions are corrected. * Also contains quite a few documentation updates. ">
1.6.0.5
error" when the standard output is automatically redirected to the pager redirected the standard error to the pager as well; there was no need to. * "git send-email" did not correctly handle list of addresses when they had quoted comma (e.g. "Lastname, Givenname" ). * Logic to discover branch ancestry in "git svn" was unreliable when the process to fetch history was interrupted. * Removed support for an obsolete gitweb request URI, whose implementation ran "git diff" Porcelain, instead of using plumbing, which would have run an external diff command specified in the repository configuration as the gitweb user. Also contains numerous documentation typofixes. ">
1.6.0.6
configuration variable can be used to enable/disable the default paging behaviour per command. * "git-add -i" has a new action 'e/dit' to allow you edit the patch hunk manually. * git-am records the original tip of the branch in ORIG_HEAD before it starts applying patches. * git-apply can handle a patch that touches the same path more than once much better than before. * git-apply can be told not to trust the line counts recorded in the input patch but recount, with the new --recount option. * git-apply can be told to apply a patch to a path deeper than what the patch records with --directory option. * git-archive can be told to omit certain paths from its output using export-ignore attributes. * git-archive uses the zlib default compression level when creating zip archive. * git-archive's command line options --exec and --remote can take their parameters as separate command line arguments, similar to other commands. IOW, both "--exec=path" and "--exec path" are now supported. * With -v option, git-branch describes the remote tracking statistics similar to the way git-checkout reports by how many commits your branch is ahead/behind. * git-branch's --contains option used to always require a commit parameter to limit the branches with; it now defaults to list branches that contains HEAD if this parameter is omitted. * git-branch's --merged and --no-merged option used to always limit the branches relative to the HEAD, but they can now take an optional commit argument that is used in place of HEAD. * git-bundle can read the revision arguments from the standard input. * git-cherry-pick can replay a root commit now. * git-clone can clone from a remote whose URL would be rewritten by configuration stored in $HOME/.gitconfig now. * "git-clone --mirror" is a handy way to set up a bare mirror repository. * git-cvsserver learned to respond to "cvs co -c". * git-diff --check now checks leftover merge conflict markers. * "git-diff -p" learned to grab a better hunk header lines in BibTex, Pascal/Delphi, and Ruby files and also pays attention to chapter and part boundary in TeX documents. * When remote side used to have branch 'foo' and git-fetch finds that now it has branch 'foo/bar', it refuses to lose the existing remote tracking branch and its reflog. The error message has been improved to suggest pruning the remote if the user wants to proceed and get the latest set of branches from the remote, including such 'foo/bar'. * fast-export learned to export and import marks file; this can be used to interface with fast-import incrementally. * fast-import and fast-export learned to export and import gitlinks. * "gitk" left background process behind after being asked to dig very deep history and the user killed the UI; the process is killed when the UI goes away now. * git-rebase records the original tip of branch in ORIG_HEAD before it is rewound. * "git rerere" can be told to update the index with auto-reused resolution with rerere.autoupdate configuration variable. * git-rev-parse learned $commit^! and $commit^@ notations used in "log" family. These notations are available in gitk as well, because the gitk command internally uses rev-parse to interpret its arguments. * git-rev-list learned --children option to show child commits it encountered during the traversal, instead of showing parent commits. * git-send-mail can talk not just over SSL but over TLS now. * git-shortlog honors custom output format specified with "--pretty=format:". * "git-stash save" learned --keep-index option. This lets you stash away the local changes and bring the changes staged in the index to your working tree for examination and testing. * git-stash also learned branch subcommand to create a new branch out of stashed changes. * git-status gives the remote tracking statistics similar to the way git-checkout reports by how many commits your branch is ahead/behind. * "git-svn dcommit" is now aware of auto-props setting the subversion user has. * You can tell "git status -u" to even more aggressively omit checking untracked files with --untracked-files=no. * Original SHA-1 value for "update-ref -d" is optional now. * Error codes from gitweb are made more descriptive where possible, rather than "403 forbidden" as we used to issue everywhere. (internal) * git-merge has been reimplemented in C. Fixes since v1.5.6 ------------------ All of the fixes in v1.5.6 maintenance series are included in this release, unless otherwise noted. * git-clone ignored its -u option; the fix needs to be backported to 'maint'; * git-mv used to lose the distinction between changes that are staged and that are only in the working tree, by staging both in the index after moving such a path. * "git-rebase -i -p" rewrote the parents to wrong ones when amending (either edit or squash) was involved, and did not work correctly when fast forwarding. ">
1.6.0
1.6.1.1
1.6.1.2
1.6.1.3
1.6.1.4
option. * "git daemon" exports REMOTE_ADDR to record client address, so that spawned programs can act differently on it. * "git describe --tags" favours closer lightweight tags than farther annotated tags now. * "git diff" learned to mimic --suppress-blank-empty from GNU diff via a configuration option. * "git diff" learned to put more sensible hunk headers for Python, HTML and ObjC contents. * "git diff" learned to vary the a/ vs b/ prefix depending on what are being compared, controlled by diff.mnemonicprefix configuration. * "git diff" learned --dirstat-by-file to count changed files, not number of lines, when summarizing the global picture. * "git diff" learned "textconv" filters --- a binary or hard-to-read contents can be munged into human readable form and the difference between the results of the conversion can be viewed (obviously this cannot produce a patch that can be applied, so this is disabled in format-patch among other things). * "--cached" option to "git diff has an easier to remember synonym "--staged", to ask "what is the difference between the given commit and the contents staged in the index?" * "git for-each-ref" learned "refname:short" token that gives an unambiguously abbreviated refname. * Auto-numbering of the subject lines is the default for "git format-patch" now. * "git grep" learned to accept -z similar to GNU grep. * "git help" learned to use GIT_MAN_VIEWER environment variable before using "man" program. * "git imap-send" can optionally talk SSL. * "git index-pack" is more careful against disk corruption while completing a thin pack. * "git log --check" and "git log --exit-code" passes their underlying diff status with their exit status code. * "git log" learned --simplify-merges, a milder variant of --full-history; "gitk --simplify-merges" is easier to view than with --full-history. * "git log" learned "--source" to show what ref each commit was reached from. * "git log" also learned "--simplify-by-decoration" to show the birds-eye-view of the topology of the history. * "git log --pretty=format:" learned "%d" format element that inserts names of tags that point at the commit. * "git merge --squash" and "git merge --no-ff" into an unborn branch are noticed as user errors. * "git merge -s $strategy" can use a custom built strategy if you have a command "git-merge-$strategy" on your $PATH. * "git pull" (and "git fetch") can be told to operate "-v"erbosely or "-q"uietly. * "git push" can be told to reject deletion of refs with receive.denyDeletes configuration. * "git rebase" honours pre-rebase hook; use --no-verify to bypass it. * "git rebase -p" uses interactive rebase machinery now to preserve the merges. * "git reflog expire branch" can be used in place of "git reflog expire refs/heads/branch". * "git remote show $remote" lists remote branches one-per-line now. * "git send-email" can be given revision range instead of files and maildirs on the command line, and automatically runs format-patch to generate patches for the given revision range. * "git submodule foreach" subcommand allows you to iterate over checked out submodules. * "git submodule sync" subcommands allows you to update the origin URL recorded in submodule directories from the toplevel .gitmodules file. * "git svn branch" can create new branches on the other end. * "gitweb" can use more saner PATH_INFO based URL. (internal) * "git hash-object" learned to lie about the path being hashed, so that correct gitattributes processing can be done while hashing contents stored in a temporary file. * various callers of git-merge-recursive avoid forking it as an external process. * Git class defined in "Git.pm" can be subclasses a bit more easily. * We used to link GNU regex library as a compatibility layer for some platforms, but it turns out it is not necessary on most of them. * Some path handling routines used fixed number of buffers used alternately but depending on the call depth, this arrangement led to hard to track bugs. This issue is being addressed. Fixes since v1.6.0 ------------------ All of the fixes in v1.6.0.X maintenance series are included in this release, unless otherwise noted. * Porcelains implemented as shell scripts were utterly confused when you entered to a subdirectory of a work tree from sideways, following a symbolic link (this may need to be backported to older releases later). * Tracking symbolic links would work better on filesystems whose lstat() returns incorrect st_size value for them. * "git add" and "git update-index" incorrectly allowed adding S/F when S is a tracked symlink that points at a directory D that has a path F in it (we still need to fix a similar nonsense when S is a submodule and F is a path in it). * "git am" after stopping at a broken patch lost --whitespace, -C, -p and --3way options given from the command line initially. * "git diff --stdin" used to take two trees on a line and compared them, but we dropped support for such a use case long time ago. This has been resurrected. * "git filter-branch" failed to rewrite a tag name with slashes in it. * "git http-push" did not understand URI scheme other than opaquelocktoken when acquiring a lock from the server (this may need to be backported to older releases later). * After "git rebase -p" stopped with conflicts while replaying a merge, "git rebase --continue" did not work (may need to be backported to older releases). * "git revert" records relative to which parent a revert was made when reverting a merge. Together with new documentation that explains issues around reverting a merge and merging from the updated branch later, this hopefully will reduce user confusion (this may need to be backported to older releases later). * "git rm --cached" used to allow an empty blob that was added earlier to be removed without --force, even when the file in the work tree has since been modified. * "git push --tags --all $there" failed with generic usage message without telling saying these two options are incompatible. * "git log --author/--committer" match used to potentially match the timestamp part, exposing internal implementation detail. Also these did not work with --fixed-strings match at all. * "gitweb" did not mark non-ASCII characters imported from external HTML fragments correctly. ">
1.6.1
1.6.2.1
1.6.2.2
1.6.2.3
" did not update the index entry at the named path; it now does. * "git-fast-export" choked when seeing a tag that does not point at commit. * "git init" segfaulted when given an overlong template location via the --template= option. * "git-ls-tree" and "git-diff-tree" used a pathspec correctly when deciding to descend into a subdirectory but they did not match the individual paths correctly. This caused pathspecs "abc/d ab" to match "abc/0" ("abc/d" made them decide to descend into the directory "abc/", and then "ab" incorrectly matched "abc/0" when it shouldn't). * "git-merge-recursive" was broken when a submodule entry was involved in a criss-cross merge situation. Many small documentation updates are included as well. --- exec >/var/tmp/1 echo O=$(git describe maint) O=v1.6.2.3-38-g318b847 git shortlog --no-merges $O..maint ">
1.6.2.4
1.6.2.5
" and "git am --reject" passes these options to underlying "git apply". * "git am" learned --ignore-date option. * "git blame" aligns author names better when they are spelled in non US-ASCII encoding. * "git clone" now makes its best effort when cloning from an empty repository to set up configuration variables to refer to the remote repository. * "git checkout -" is a shorthand for "git checkout @{-1}". * "git cherry" defaults to whatever the current branch is tracking (if exists) when the argument is not given. * "git cvsserver" can be told not to add extra "via git-CVS emulator" to the commit log message it serves via gitcvs.commitmsgannotation configuration. * "git cvsserver" learned to handle 'noop' command some CVS clients seem to expect to work. * "git diff" learned a new option --inter-hunk-context to coalesce close hunks together and show context between them. * The definition of what constitutes a word for "git diff --color-words" can be customized via gitattributes, command line or a configuration. * "git diff" learned --patience to run "patience diff" algorithm. * "git filter-branch" learned --prune-empty option that discards commits that do not change the contents. * "git fsck" now checks loose objects in alternate object stores, instead of misreporting them as missing. * "git gc --prune" was resurrected to allow "git gc --no-prune" and giving non-default expiration period e.g. "git gc --prune=now". * "git grep -w" and "git grep" for fixed strings have been optimized. * "git mergetool" learned -y(--no-prompt) option to disable prompting. * "git rebase -i" can transplant a history down to root to elsewhere with --root option. * "git reset --merge" is a new mode that works similar to the way "git checkout" switches branches, taking the local changes while switching to another commit. * "git submodule update" learned --no-fetch option. * "git tag" learned --contains that works the same way as the same option from "git branch". Fixes since v1.6.1 ------------------ All of the fixes in v1.6.1.X maintenance series are included in this release, unless otherwise noted. Here are fixes that this release has, but have not been backported to v1.6.1.X series. * "git-add sub/file" when sub is a submodule incorrectly added the path to the superproject. * "git bundle" did not exclude annotated tags even when a range given from the command line wanted to. * "git filter-branch" unnecessarily refused to work when you had checked out a different commit from what is recorded in the superproject index in a submodule. * "git filter-branch" incorrectly tried to update a nonexistent work tree at the end when it is run in a bare repository. * "git gc" did not work if your repository was created with an ancient git and never had any pack files in it before. * "git mergetool" used to ignore autocrlf and other attributes based content rewriting. * branch switching and merges had a silly bug that did not validate the correct directory when making sure an existing subdirectory is clean. * "git -p cmd" when cmd is not a built-in one left the display in funny state when killed in the middle. ">
1.6.2
1.6.3.1
1.6.3.2
1.6.3.3
1.6.3.4
" option to the log family of commands can now be spelled as "--format=