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=