<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DkEMSXk_eSp7ImA9WhBbFEQ.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756</id><updated>2013-05-13T18:24:48.741-07:00</updated><category term="Thanks" /><category term="Git" /><category term="Work Log" /><category term="Random Hacking" /><category term="UnGit" /><category term="Announce" /><title>Git Blame</title><subtitle type="html">Junio C Hamano aka &lt;a href="https://plus.google.com/108182106411180467879?rel=author"&gt;Gitster&lt;/a&gt;'s Blog</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://git-blame.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://git-blame.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>186</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/GitBlame" /><feedburner:info uri="gitblame" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CUYGQ3c8fip7ImA9WhBbFEQ.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-7871339760726189867</id><published>2013-05-13T17:58:00.002-07:00</published><updated>2013-05-13T17:58:42.976-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-13T17:58:42.976-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><category scheme="http://www.blogger.com/atom/ns#" term="Announce" /><title>Git 1.8.3-rc2</title><content type="html">The second and planned-to-be-the-final release candidate for the upcoming 1.8.3 release was tagged today. Also, the release tarballs at &lt;a href="https://www.kernel.org/pub/software/scm/git/testing/" target="_blank"&gt;kernel.org&lt;/a&gt; are back ;-)&lt;br /&gt;
&lt;br /&gt;
Hopefully we can have the final late next week, but we might end up doing another release candidate. Please help testing the rc2 early to make sure you can have a solid release.&lt;br /&gt;
&lt;br /&gt;
There are numerous little fixes, new features and enhancements that cannot be covered in a single article, so I'll only highlight some selected big-picture changes here. For the full list of changes, please refer to the &lt;a href="http://article.gmane.org/gmane.comp.version-control.git/224189" target="_blank"&gt;draft Release Notes&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Preparation for 2.0&lt;/h2&gt;
A lot of work went into preparing the users for 2.0 release that will come sometime next year, which promises large backward-incompatible UI changes:&lt;br /&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;"&lt;span style="font-family: Courier New, Courier, monospace;"&gt;git push&lt;/span&gt;" that does not say what to push from the command line will not use the "matching" semantics in Git 2.0 (it will use "simple", which pushes your current branch to the branch of the same name only when you have forked from it previously; e.g. "&lt;span style="font-family: Courier New, Courier, monospace;"&gt;git push origin&lt;/span&gt;" done while you are on your "topic" branch that was previously created with "&lt;span style="font-family: Courier New, Courier, monospace;"&gt;git checkout -t -b topic origin/topic&lt;/span&gt;" will push your "topic" branch to origin).&lt;br /&gt;
&lt;br /&gt;
This default change will hurt old-timers who are used to the traditional "matching" (if you have branches A, B and C, and of the other side has branches A and C, then your branches A and C will update their branches A and C, respectively), and they can use "push.default" configuration variable to keep the traditional behaviour. I.e.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Courier New, Courier, monospace;"&gt;$ git config push.default matching&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Recent releases since 1.8.0 has been issuing warnings when you do not have any push.default configuration set, and this release continues to do so.&lt;br /&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;"&lt;span style="font-family: Courier New, Courier, monospace;"&gt;git add -u&lt;/span&gt;" and "&lt;span style="font-family: Courier New, Courier, monospace;"&gt;git add -A&lt;/span&gt;" that is run inside a subdirectory without any other argument to specify what to add will operate on the entire working tree in Git 2.0, so that the behaviour will be more consistent with "&lt;span style="font-family: Courier New, Courier, monospace;"&gt;git commit -a&lt;/span&gt;" (e.g. "&lt;span style="font-family: Courier New, Courier, monospace;"&gt;edit file &amp;amp;&amp;amp; cd subdir &amp;amp;&amp;amp; git commit -a&lt;/span&gt;" will commit the change to the file you just edited which is outside the directory you ran "&lt;span style="font-family: Courier New, Courier, monospace;"&gt;git commit&lt;/span&gt;" in).&lt;br /&gt;
&lt;br /&gt;
Users can say "&lt;span style="font-family: Courier New, Courier, monospace;"&gt;git add -u .&lt;/span&gt;" and "&lt;span style="font-family: Courier New, Courier, monospace;"&gt;git add -A .&lt;/span&gt;" (the "dot" means "the current directory") to limit the operation to the subdirectory the command is run in with the traditional versions of Git (and this will stay the same in Git 2.0 or later), so there will be no configuration variable to change the default.&lt;br /&gt;
&lt;br /&gt;
The 1.8.3 and later releases do not yet change the behaviour&amp;nbsp;until Git 2.0,&amp;nbsp;and limit these operations to the current subdirectory, but they do notice when you have changes outside your current subdirectory and warn, saying that if you were to type the same command to Git 2.0, you would be adding those other files to your index, and encourages you to learn to add that explicit&amp;nbsp;"dot" if you mean to add changed or all files in the current subdirectory only.&lt;br /&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;"&lt;span style="font-family: Courier New, Courier, monospace;"&gt;git add &lt;i&gt;path&lt;/i&gt;&lt;/span&gt;" has traditionally been a no-op for removed files (e.g. "&lt;span style="font-family: Courier New, Courier, monospace;"&gt;rm -f dir/file &amp;amp;&amp;amp; git add dir&lt;/span&gt;" does not record the removal of &lt;span style="font-family: Courier New, Courier, monospace;"&gt;dir/file&lt;/span&gt; to the index), but Git 2.0 will notice and record removals, too.&lt;br /&gt;
&lt;br /&gt;
The 1.8.3 and later releases do not yet change the behaviour until Git 2.0, but they do notice when you have removed files that match the &lt;i&gt;path&lt;/i&gt; and warn, saying that&amp;nbsp;if you were to type the same command to Git 2.0,&amp;nbsp;you would be recording their removal, and encourages you to learn to use the&amp;nbsp;&lt;span style="font-family: Courier New, Courier, monospace;"&gt;--ignore-removal&lt;/span&gt; option if you mean to only add modified or new files to the index.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2&gt;
Tightening of command line verification&lt;/h2&gt;
&lt;div&gt;
There are quite a many UI fixes that tie loose ends. Some commands assumed that the users were perfect and would never throw nonsense command line arguments at them, and some operations that need two parameters were happily carried out even when they got three parameters without diagnosing such a command line as an error (the excess one was simply ignored).&lt;br /&gt;
&lt;br /&gt;
Many of them have been updated to detect and die on such errors.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
Helping our friends at Emacs land&lt;/h2&gt;
&lt;div&gt;
We expedited the update of the foreign SCM interface to bzr we have in the contrib/ area since 1.8.2, and included a version that is vastly modified from what we had before, with help from some Emacs folks. This code could be a bit rougher than the rest of Git that usually moves slowly and cautiously, but we decided that, given the circumstance, it is more important to push out &lt;i&gt;some&lt;/i&gt;&amp;nbsp;improved version early, in order to help our friends in Emacs land, who have been (reportedly) suffering from less than ideal response to the issues they are having with their SCM of choice.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
A beginning of a better triangular workflow support&lt;/h2&gt;
&lt;div&gt;
The recommended workflows to collaborate with others are either:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;to have your own repository and push your work there while pulling from your upstream to keep up to date, or&lt;/li&gt;
&lt;li&gt;to have a central repository where everybody pushes to and pulls from.&lt;/li&gt;
&lt;/ul&gt;
The latter was primarily to make those who are coming from centralized version control systems feel at ease, and the repository configuration mechanisms such as "remote.origin.url" variable were designed to help that workflow (there is one "origin" you pull from and push to). The former however is also important, and many people on Git hosting sites (e.g. GitHub) employ this workflow (you pull from one place and push to another place, but they are not the same).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
A new configuration mechanism "remote.pushdefault" has been introduced to support such a triangular workflow. After you clone from somebody else's project, that upstream repository will still be your 'origin', but you can add the repository you regularly push to in order to publish your work (and presumably then you will throw a "pull request" at the upstream) as another remote, and set it to this configuration variable. E.g.&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;$ git clone git://example.com/frotz.git frotz
$ cd frotz
$ git remote add publish ssh://myhost.com/myfrotz.git
$ git config remote.pushdefault publish&lt;/pre&gt;
After this, you can say "git push" and the push does not attempt to push to your origin (i.e. git://example.com/frotz.git) &amp;nbsp;but to your publish remote (i.e. ssh://myhost.com/myfrotz.git) because of the last configuration.&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/FjjXkvSm2D8" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/7871339760726189867?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/7871339760726189867?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/FjjXkvSm2D8/git-183-rc2.html" title="Git 1.8.3-rc2" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><feedburner:origLink>http://git-blame.blogspot.com/2013/05/git-183-rc2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcHRHk7eSp7ImA9WhBXGU8.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-808922038852262901</id><published>2013-04-02T11:40:00.005-07:00</published><updated>2013-04-02T11:40:35.701-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-02T11:40:35.701-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><title>Where do evil merges come from?</title><content type="html">&lt;br /&gt;
A canonical example of where "evil merge" happens in real life (and is a good thing) is to adjust for semantic conflicts. It almost never have anything to do with textual conflicts.&lt;br /&gt;
&lt;br /&gt;
Imagine you and your friend start with the same codebase where a function &lt;span style="font-family: Courier New, Courier, monospace;"&gt;f()&lt;/span&gt; takes no parameter, and has two existing call-sites.&lt;br /&gt;
&lt;br /&gt;
You decide to update the function to take a parameter, and adjust both existing call-sites to pass one argument to the function. Your friend in the meantime added a new call-site that calls&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;f()&lt;/span&gt;&amp;nbsp;still without an argument. Then you merge.&lt;br /&gt;
&lt;br /&gt;
It is very likely that you won't see any textual conflict. Your friend added some code to block of lines you did not touch while you two were forked. However, the end result is now wrong. Your updated&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;f()&lt;/span&gt;&amp;nbsp;expects one parameter, while the new call-site your friend added does not pass any argument to it.&lt;br /&gt;
&lt;br /&gt;
In such a case, you would fix the new call-site your friend added to pass an appropriate argument and record that as part of your merge.&lt;br /&gt;
&lt;br /&gt;
Consider the line that has that new call-site you just fixed. It certainly did not exist in your version (it came from your friend'd code), but it is not exactly what your friend wrote, either (it did not pass any argument). That makes the merge an "evil merge".&lt;br /&gt;
&lt;br /&gt;
With "git log -c/--cc", such a line will show with double-plus in the multi-way patch output to show that "this did not exist in either parent".&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/6OGmTFv_oHs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://git-blame.blogspot.com/feeds/808922038852262901/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=632023420616344756&amp;postID=808922038852262901&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/808922038852262901?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/808922038852262901?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/6OGmTFv_oHs/where-do-evil-merges-come-from.html" title="Where do evil merges come from?" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://git-blame.blogspot.com/2013/04/where-do-evil-merges-come-from.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQCQXc9fip7ImA9WhBQGUw.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-6010821768591738997</id><published>2013-03-21T17:49:00.000-07:00</published><updated>2013-03-21T17:49:20.966-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-21T17:49:20.966-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><category scheme="http://www.blogger.com/atom/ns#" term="Random Hacking" /><title>Measuring Project Activities (2)</title><content type="html">Continuing from &lt;a href="http://git-blame.blogspot.com/2013/03/measuring-project-activities-1.html" target="_blank"&gt;an earlier article&lt;/a&gt;, let's see how you can compute &lt;a href="http://git-blame.blogspot.com/2013/03/so-how-well-are-we-doing-lately.html" target="_blank"&gt;some interesting stats&lt;/a&gt; on your own projects.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
How much change did a release have?&lt;/h2&gt;
&lt;div&gt;
As I said &lt;a href="http://git-blame.blogspot.com/2013/03/so-how-well-are-we-doing-lately.html" target="_blank"&gt;earlier&lt;/a&gt;, you can measure the extent of change to your codebase in two ways. A quicker and less precise way, and a more involved but more accurate way.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
A quicker way is to ask &lt;span style="font-family: Courier New, Courier, monospace;"&gt;git diff --numstat&lt;/span&gt; to count the deleted and added lines between the release tags, and add them up yourself. If you care about whole-file renames, you can add the &lt;span style="font-family: Courier New, Courier, monospace;"&gt;-M&lt;/span&gt; option to the &lt;span style="font-family: Courier New, Courier, monospace;"&gt;git diff&lt;/span&gt; command:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;addremove2 () {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; git diff --numstat "$@" | {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; total=0 &amp;amp;&amp;amp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; while read add remove path&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; do&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; total=$(( $total&amp;nbsp;+ $add&amp;nbsp;+ $remove ))&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; done &amp;amp;&amp;amp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; echo "$total"&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
And with that helper, the main function we introduced in the earlier article can do this to compute the modified2 number for the entire release cycle and per each day:&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;handle () {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; old="$1^0" new="$2^0"&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; ...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; modified2=$(addremove2 "$old" "$new")&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; mod2perday=$( echo 2k "$modified2" "$days" / p | dc )&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
How much real change did a release have?&lt;/h2&gt;
&lt;div&gt;
Counting number of added and removed lines using &lt;span style="font-family: Courier New, Courier, monospace;"&gt;git diff --numstat&lt;/span&gt; is straightforward, but this tends to over-count changes. For example, when adding a new caller to an existing code, you may have to move that existing code up in the same file (especially if it is a file-local &lt;span style="font-family: Courier New, Courier, monospace;"&gt;static&lt;/span&gt; function) to make the callee come before the caller, or move it to a different, more "library-ish" file, while making its visibility from &lt;span style="font-family: Courier New, Courier, monospace;"&gt;static&lt;/span&gt; to &lt;span style="font-family: Courier New, Courier, monospace;"&gt;extern&lt;/span&gt;. Both of these kind of changes unfortunately appear as a bulk deletion of existing block of lines and bulk addition of the same contents elsewhere in the codebase.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
In order to count the true amount of work went into the new release, you would want to exclude such changes from your statistics.&lt;br /&gt;
&lt;br /&gt;
This is where &lt;span style="font-family: Courier New, Courier, monospace;"&gt;git blame&lt;/span&gt;&amp;nbsp;can help. In the most basic form, it can trace each and every line of a file in the given commit back to its origin, i.e. which commit it came from. By default, it notices when the whole file gets renamed (e.g. the file &lt;span style="font-family: Courier New, Courier, monospace;"&gt;hello.c&lt;/span&gt;&amp;nbsp;you are running the command on in the current release may have been called &lt;span style="font-family: Courier New, Courier, monospace;"&gt;goodbye.c&lt;/span&gt; in an earlier release), and employs no other fancy tricks, but you can tell it to notice code movement within a file (e.g. moving the callee up in the file) with the &lt;span style="font-family: Courier New, Courier, monospace;"&gt;-M&lt;/span&gt; option, or code moves across files (e.g. moving a static function from a file that an existing caller lives in to a different "library-ish" file, to make it also visible to a new caller in another file) with the&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;-C&lt;/span&gt;&amp;nbsp;option. You can also tell it to ignore whitespace changes with the &lt;span style="font-family: Courier New, Courier, monospace;"&gt;-w&lt;/span&gt; option like you can with &lt;span style="font-family: Courier New, Courier, monospace;"&gt;git diff&lt;/span&gt;. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;span style="font-family: Courier New, Courier, monospace;"&gt;git blame -M -C -w -s v1.8.0..v1.8.1 -- fetch-pack.c&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
will show you which commit each and every line in the &lt;span style="font-family: Courier New, Courier, monospace;"&gt;fetch-pack.c&lt;/span&gt; file came from; its output may begin like this:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;745f7a8c fetch-pack.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1) #include "cache.h"&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;^8c7a786 builtin/fetch-pack.c &amp;nbsp; 2) #include "refs.h"&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;^8c7a786 builtin/fetch-pack.c &amp;nbsp; 3) #include "pkt-line.h"&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
The first line is blamed to commit&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;745f7a8c&lt;/span&gt;, while the other lines are attributed to commit&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;8c7a786&lt;/span&gt;&amp;nbsp;(the leading caret&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;^&lt;/span&gt;&amp;nbsp;means it is attributed to a commit at the lower boundary of the range), which is the&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;v1.8.0&lt;/span&gt;&amp;nbsp;release. Note that these old lines used to live in a different file &lt;span style="font-family: Courier New, Courier, monospace;"&gt;builtin/fetch-pack.c&lt;/span&gt; in the older release, and would have been counted as additions if you used the approach based on &lt;span style="font-family: Courier New, Courier, monospace;"&gt;git diff --numstat -M&lt;/span&gt; to count them, because there was no file renaming involved between these two releases.&lt;br /&gt;
&lt;br /&gt;
Also notice that these lines may have been untouched since a commit that may be a lot older than &lt;span style="font-family: Courier New, Courier, monospace;"&gt;v1.8.0&lt;/span&gt;, but we told the command to stop at&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;v1.8.0&lt;/span&gt;&amp;nbsp;from the command line, so these are all attributed to that range boundary.&lt;br /&gt;
&lt;br /&gt;
If you count the number of lines in the whole output from the above command, that will show the number of lines in the &lt;span style="font-family: Courier New, Courier, monospace;"&gt;fetch-pack.c&lt;/span&gt; file at the&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;v1.8.1&lt;/span&gt;&amp;nbsp;release. If you count the lines that do not begin with a caret, that counts the lines added in the new release.&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;added_to_file () {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; old="$1" new="$2" path="$3"&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; git blame -M -C -w -s "$old".."$new" -- "$path"&amp;nbsp;|&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; grep -v '^^' |&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; wc -l&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
This may be sufficient as a starting point, but we are not all interested in checking each and every commit between the two releases (e.g. the commit &lt;span style="font-family: Courier New, Courier, monospace;"&gt;745f7a8c&lt;/span&gt; in the above example is not the &lt;span style="font-family: Courier New, Courier, monospace;"&gt;v1.8.1&lt;/span&gt; release and the only thing we care about is that the line is new in the new release; we do not care where in the development cycle leading to the release it was added), so it is a waste of computational cycles.&lt;br /&gt;
&lt;br /&gt;
Fortunately, you can tell&amp;nbsp;&lt;span style="font-family: Courier New, Courier, monospace;"&gt;git blame&lt;/span&gt;&amp;nbsp;to pretend as if the commit tagged as &lt;span style="font-family: Courier New, Courier, monospace;"&gt;v1.8.1&lt;/span&gt; release were a direct and sole child of the commit tagged as v&lt;span style="font-family: Courier New, Courier, monospace;"&gt;1.8.0&lt;/span&gt; release with the&amp;nbsp;&lt;span style="font-family: Courier New, Courier, monospace;"&gt;-S&lt;/span&gt; option. First, you prepare a &lt;i&gt;graft&lt;/i&gt;&amp;nbsp;file to describe the parent-child relationship.&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;added_to_file () {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; old="$1" new="$2" path="$3"&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; graft=/tmp/blame.$$.graft&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; cat &amp;gt;"$graft" &amp;lt;&amp;lt;-EOF&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; $new $old&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; $old&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; EOF&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;git blame -M -C -w -s "$old".."$new" -- "$path" |&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; ...&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
The graft file lists each commit object and its parent. The above snippet says that the &lt;span style="font-family: Courier New, Courier, monospace;"&gt;$new&lt;/span&gt; commit has a single parent, which is &lt;span style="font-family: Courier New, Courier, monospace;"&gt;$old&lt;/span&gt;, and &lt;span style="font-family: Courier New, Courier, monospace;"&gt;$old&lt;/span&gt; commit does not have any parent. This lets us lie to &lt;span style="font-family: Courier New, Courier, monospace;"&gt;git blame&lt;/span&gt; that our history consists of only two commits, and one is a direct child of the other.&lt;br /&gt;
&lt;br /&gt;
With this, we can tell how much new material was introduced to the given path in the new release, but what about the material removed from the old release? We can compute it in a similar way with a twist. You take a path in the old release, and pretend as if the old release were the direct &lt;i&gt;child&lt;/i&gt;&amp;nbsp;of the new release. We compute what we have added if we started from release &lt;span style="font-family: Courier New, Courier, monospace;"&gt;v1.8.1&lt;/span&gt; and development led to the contents of &lt;span style="font-family: Courier New, Courier, monospace;"&gt;v1.8.0&lt;/span&gt;, like this:&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;removed_from_file () {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; old="$1" new="$2" path="$3"&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; graft=/tmp/blame.$$.graft&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; cat &amp;gt;"$graft" &amp;lt;&amp;lt;-EOF&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; $old $new&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; $new&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; EOF&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;git blame -M -C -w -s "$new".."$old" -- "$path" |&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; grep -v '^^' |&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; wc -l&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
By tying these two helper functions with a list of paths that existed in the two releases, you can compute the amount of real changes made to reach the new release, but this article is getting a bit too long, so I'll leave it to another installment. We will use the &lt;span style="font-family: Courier New, Courier, monospace;"&gt;added_to_file&lt;/span&gt; helper to construct &lt;span style="font-family: Courier New, Courier, monospace;"&gt;added_to_commit&lt;/span&gt; function like this:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;added_to_commit () {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; old=$(git rev-parse "$1^0")&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; new=$(git rev-parse "$2^0")&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &lt;i&gt;list_paths_in_commit&lt;/i&gt; "$new" |&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; while read path&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; do&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; added_to_file "$old" "$new" "$path"&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; done | {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; total=0&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; while read count&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; do&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; total=$(( $total&amp;nbsp;+ $count ))&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; done&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; echo $total&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/lCqmiqesrFs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://git-blame.blogspot.com/feeds/6010821768591738997/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=632023420616344756&amp;postID=6010821768591738997&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/6010821768591738997?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/6010821768591738997?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/lCqmiqesrFs/measuring-project-activities-2.html" title="Measuring Project Activities (2)" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://git-blame.blogspot.com/2013/03/measuring-project-activities-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEADSXs8eCp7ImA9WhBQFk8.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-6330589994317236200</id><published>2013-03-18T09:06:00.001-07:00</published><updated>2013-03-18T09:06:18.570-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-18T09:06:18.570-07:00</app:edited><title>A bit annoyed by LinkedIn Endorsements</title><content type="html">A few times a week, I get "X endorsed your skills and expertise" e-mail messages from LinkedIn, listing people from my past and present. One of the embarrassing ones I saw the other day was an endorsement on "Linux Kernel", made by somebody who used to work as a receptionist at a small company I used to be at several years ago. She didn't know (and need to know) what technical work I did back then, I do not think she changed her career to know what technical work I do these days, and most importantly, I do not do the Kernel X-&amp;lt;.&lt;br /&gt;
&lt;br /&gt;
And then today I got endorsement from a few Git people on "Ruby", but I know they know I do not do Ruby (not that I hate&amp;nbsp;the language or its ecosystem; it is just I didn't get around to touch it).&lt;br /&gt;
&lt;br /&gt;
I was told by the former receptionist that LinkedIn nags every once in a while to give endorsement to others and it is very easy to click on it, only to dismiss the nagging message, and ending up giving such irrelevant endorsements.&lt;br /&gt;
&lt;br /&gt;
It is mildly annoying. Just as annoying as that big red "unread count" number I see on the right top corner of the Gmail window.&lt;br /&gt;
&lt;br /&gt;
Grumpy I am.&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/4vgeg5VZpqM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://git-blame.blogspot.com/feeds/6330589994317236200/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=632023420616344756&amp;postID=6330589994317236200&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/6330589994317236200?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/6330589994317236200?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/4vgeg5VZpqM/a-bit-annoyed-by-linkedin-endorsements.html" title="A bit annoyed by LinkedIn Endorsements" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://git-blame.blogspot.com/2013/03/a-bit-annoyed-by-linkedin-endorsements.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcNSX86fyp7ImA9WhBQGUs.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-243771167615714640</id><published>2013-03-14T21:55:00.001-07:00</published><updated>2013-03-22T07:21:38.117-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-22T07:21:38.117-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><category scheme="http://www.blogger.com/atom/ns#" term="Random Hacking" /><title>Measuring Project Activities (1)</title><content type="html">Earlier, &lt;a href="http://git-blame.blogspot.com/2013/03/so-how-well-are-we-doing-lately.html" target="_blank"&gt;I showed&lt;/a&gt; a handful of metrics to view the level of activities in Git project, grouped by its release cycle, and promised to expllain how you can compute similar numbers for your projects.&lt;br /&gt;
&lt;br /&gt;
This is the first of such posts. This post covers the very basics.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
How long did a cycle last?&lt;/h2&gt;
&lt;div&gt;
Each release is given a release tag. The latest I tagged for Git project was v1.8.2 and the release before that was v1.8.1. The release cycle began when I tagged v1.8.1 and ended when I tagged v1.8.2. As each commit in Git records commit timestamp and author timestamp, we can use diffrence between the commit timestamps of the two release.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
We can ask &lt;span style="font-family: Courier New, Courier, monospace;"&gt;git log&lt;/span&gt; to give us the timestamp for one commit:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; git log -1 --format=%ct $commit&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The &lt;span style="font-family: Courier New, Courier, monospace;"&gt;--format=&lt;/span&gt; option lets us ask for various pieces of information, and &lt;span style="font-family: Courier New, Courier, monospace;"&gt;%ct&lt;/span&gt; requests the committer timestamp, expressed as number of seconds since midnight of January 1, 1970 (epoch). You can use &lt;span style="font-family: Courier New, Courier, monospace;"&gt;%ci&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;for the same information but in ISO 8601 format, i.e. &lt;/span&gt;&lt;span style="font-family: Courier New, Courier, monospace;"&gt;YYYY-MM-DD HH:MM:SS&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;; see &lt;/span&gt;&lt;span style="font-family: Courier New, Courier, monospace;"&gt;git log --help&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;and look for "PRETTY FORMATS" for other possibilities.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: inherit;"&gt;So the part, given two commits, that computes the number of days between them, becomes something like this:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;handle () {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; old="$1^0" new="$2^0"&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;oldtime=$(git log -1 --format=%ct "$old")&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;newtime=$(git log -1 --format=%ct "$new")&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; days=$(( ($newtime - $oldtime) / (60 * 60 * 24) ))&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; ...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: inherit;"&gt;We ask the commit timestamps for the two commits in seconds since epoch, take the difference, and divide that by number of seconds in a day.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h2&gt;
&lt;span style="font-family: inherit;"&gt;How many commits do we have in the cycle?&lt;/span&gt;&lt;/h2&gt;
&lt;div&gt;
This is a single-liner.&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;git log&lt;/span&gt; has a way to list commits in a specified range, and the range we want can be expressed as: "We are interested in commits that are ancestors of v1.8.2, but we are not interested in commits that are ancestors of v1.8.1" (as the latter is the set of commits that happened &lt;i&gt;before &lt;/i&gt;v1.8.1).&lt;br /&gt;
&lt;br /&gt;
In a merge-heavy project like Git, however, merge commits make up a significant part of the history. A logical change that consists of three patches may start its life as three commits on a topic branch to be tested, and later when it proves to be sound gets merged to the mainline with a merge commit, at which point the mainline gains 4 commits (the original three plus the merge commit). That means the real change is only 75% of the history in the example.&lt;br /&gt;
&lt;br /&gt;
Of course, merging other people's work is an important part of the work done in the project, so you may want to count merge commits as well. The choice is up to you.&lt;br /&gt;
&lt;br /&gt;
When I counted commits for Git project in the earlier article, I chose &lt;i&gt;not&lt;/i&gt;&amp;nbsp;to include merges, so the part that computes the number of commits between two given commits becomes:&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;handle () {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; old="$1^0" new="$2^0"&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; ...&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;commits=$(git log --oneline --no-merges "$old..$new" | wc -l)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; ...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;br /&gt;
Drop &lt;span style="font-family: Courier New, Courier, monospace;"&gt;--no-merges&lt;/span&gt; if you want to count your merges. The &lt;span style="font-family: Courier New, Courier, monospace;"&gt;--oneline&lt;/span&gt; option is to show a single line of output per commit; by counting the lines in the output from that command with &lt;span style="font-family: Courier New, Courier, monospace;"&gt;wc -l&lt;/span&gt;, we can count the number of commits.&lt;br /&gt;
&lt;br /&gt;
As we are not interested in the contents of the output (we are just counting the number of lines), we can also use &lt;span style="font-family: Courier New, Courier, monospace;"&gt;git rev-list&lt;/span&gt;&amp;nbsp;that only shows the commit object name, if you want.&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; commits=$(git rev-list --no-merges "$old..$new" | wc -l)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;
How many contributors did we have in the cycle?&lt;/h2&gt;
&lt;/div&gt;
&lt;div&gt;
You can list the names and e-mails of people who authored commits in a specified range in two ways.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Using the &lt;span style="font-family: Courier New, Courier, monospace;"&gt;git log --format&lt;/span&gt;&amp;nbsp;we saw earlier, we can ask the name &lt;span style="font-family: Courier New, Courier, monospace;"&gt;%an&lt;/span&gt; and e-mail &lt;span style="font-family: Courier New, Courier, monospace;"&gt;%ae&lt;/span&gt; of the author, i.e.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; git log --no-merges --format="%an &amp;lt;%ae&amp;gt;" "$old..$new"&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
You can count the unique lines in the output from this command. That is the list of your contributors. The end result will become something like this:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; authors=$(git log ...&lt;i&gt;the same as above&lt;/i&gt;... | sort -u | wc -l)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The other way is to use the &lt;span style="font-family: Courier New, Courier, monospace;"&gt;git shortlog&lt;/span&gt; command designed specifically for this purpose.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; git shortlog --no-merges -s -e "$old..$new"&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The command without &lt;span style="font-family: Courier New, Courier, monospace;"&gt;-e&lt;/span&gt; option only shows the names (and with it, names and e-mails). It lists commits made by each author along with the author name when run without &lt;span style="font-family: Courier New, Courier, monospace;"&gt;-s&lt;/span&gt; option (and with it, the number of commits and the author's name on the same line). So the number of lines in the output from the above command is the number of your contributors.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; authors=$(&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;git shortlog --no-merges -s -e "$old..$new"&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;| wc -l)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Again, if you want to count merges, drop &lt;span style="font-family: Courier New, Courier, monospace;"&gt;--no-merges&lt;/span&gt; from the command line.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
How many new contributors have we added during the cycle?&lt;/h2&gt;
&lt;div&gt;
This is a bit trickier than the previous one. The idea is to list contributors we already had in the entire history before v1.8.1, and subtract that from the list of contributors in the entire history up to v1.8.2. The remainder are the newcomers you want to welcome when writing your release notes.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The contributors in the entire history leading to a commit can be listed with a helper function:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;authors () {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; git log --no-merges --format="%an &amp;lt;%ae&amp;gt;" "$@" | sort -u&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
and we can write the entire thing using the helper function like so:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;handle () {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; old="$1^0" new="$2^0"&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; ...&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; authors "$old" &amp;gt;/tmp/old&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; authors "$new" &amp;gt;/tmp/new&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; new_authors=$(comm -13 /tmp/old /tmp/new | wc -l)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; ...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;
The &lt;span style="font-family: Courier New, Courier, monospace;"&gt;authors&lt;/span&gt; helper function will write the authors for the old history and new history into two temporary files, both in sorted order, and using &lt;span style="font-family: Courier New, Courier, monospace;"&gt;comm -13&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;, we list lines that only appear in &lt;/span&gt;&lt;span style="font-family: Courier New, Courier, monospace;"&gt;/tmp/new&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;to see who are the new contributors.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;In the next installment of this series, let's count the changes made to the codebase by these commits we counted in this article.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/OlHyiqde0xc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://git-blame.blogspot.com/feeds/243771167615714640/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=632023420616344756&amp;postID=243771167615714640&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/243771167615714640?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/243771167615714640?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/OlHyiqde0xc/measuring-project-activities-1.html" title="Measuring Project Activities (1)" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://git-blame.blogspot.com/2013/03/measuring-project-activities-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8BRX4zeSp7ImA9WhBQGE0.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-5424060020055837437</id><published>2013-03-13T13:30:00.000-07:00</published><updated>2013-03-20T11:24:14.081-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-20T11:24:14.081-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><title>So how well are we doing lately?</title><content type="html">Git v1.8.2 has 630+ non-merge commits since v1.8.1 release.&lt;br /&gt;
&lt;br /&gt;
Averaged over time, the impact of each individual commit is about the same (because we reject an oversized patch that does too many unrelated things and have the submitter split it into multiple patches), so if one release cycle has twice the non-merge commits compared to another cycle, we can say it was about twice as busy.&lt;br /&gt;
&lt;br /&gt;
But from time to time, it is good to measure our progress with different metrics to see how different metrics correlate with each other.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The table at the end lists how long each release cycle lasted, how many non-merge commits we had in the cycle and in each day in the cycle and how many lines of code (counting only &lt;span style="font-family: Courier New, Courier, monospace;"&gt;*.[ch]&lt;/span&gt;&amp;nbsp;source files) were affected in the cycle and in each day in the cycle. The "lines of code affected" are counted in two different ways.&lt;br /&gt;
&lt;br /&gt;
We can see that the latest release cycle was relatively active, while the previous cycle that overlapped the year-end holidays was slow, both from commit count (348 vs 635) and one modification count (2921 vs 5881), but not with the other modification count (6047 vs 6355).&lt;br /&gt;
&lt;br /&gt;
The "modified" number is computed with "git blame -C -C -C -w" to track line-level movements, while the "modified2" number is computed with "git diff -M" which is less accurate when the code gets refactored, and that is where the above apparent discrepancy comes from.&lt;br /&gt;
&lt;br /&gt;
The v1.8.1 cycle has a lot smaller real changes (measured by "git blame") than apparent changes (measured by "git diff -M") because it created two new files by splitting two existing files. &amp;nbsp;The measurement based on "git blame -C" knows to consider bulk movement of lines by such a change as a non-event, but it will show up in "git diff --stat -M" output as a large change.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;&lt;span style="font-size: x-small;"&gt; builtin/fetch-pack.c | 950 +-------------------------------------------------------------
 builtin/send-pack.c  | 333 ----------------------
 fetch-pack.c         | 951 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 send-pack.c          | 344 +++++++++++++++++++++++
&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
So the "modified" number is a better indication of how much actual work is done, but it is painfully expensive to compute.&lt;br /&gt;
&lt;br /&gt;
I'll later explain how to use blame and diff to compute these numbers for your projects in a separate post.&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;table&gt;&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;release&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;days&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;commits&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;commit/day&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;modified&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;mod/day&lt;/span&gt;&lt;/th&gt; &lt;th&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;modified2&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;mod2/day&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.5.0&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;90&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;1448&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;16.08&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;12369&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;137.43&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;13640&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;151.55&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.5.1&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;49&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;643&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;13.12&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;7822&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;159.63&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;8213&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;167.61&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.5.2&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;46&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;575&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;12.50&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;7604&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;165.30&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;8273&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;179.84&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.5.3&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;104&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;1322&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;12.71&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;8081&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;77.70&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;9538&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;91.71&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.5.4&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;152&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;1595&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;10.49&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;21422&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;140.93&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;24934&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;164.03&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.5.5&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;66&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;729&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;11.04&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;9790&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;148.33&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;12172&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;184.42&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.5.6&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;71&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;569&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;8.01&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;7091&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;99.87&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;8354&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;117.66&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.6.0&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;59&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;731&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;12.38&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;16709&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;283.20&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;19481&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;330.18&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.6.1&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;129&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;1033&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;8.00&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;10316&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;79.96&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;14262&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;110.55&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.6.2&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;69&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;499&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;7.23&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;4835&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;70.07&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;5322&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;77.13&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.6.3&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;63&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;692&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;10.98&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6642&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;105.42&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;8687&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;137.88&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.6.4&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;83&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;500&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6.02&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;13571&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;163.50&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;14296&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;172.24&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.6.5&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;72&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;412&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;5.72&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;5018&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;69.69&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;5623&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;78.09&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.6.6&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;74&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;483&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6.52&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6011&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;81.22&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6730&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;90.94&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.7.0&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;51&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;569&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;11.15&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;7698&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;150.94&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;8635&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;169.31&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.7.1&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;70&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;477&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6.81&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;5830&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;83.28&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6558&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;93.68&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.7.2&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;88&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;532&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6.04&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;5615&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;63.80&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6380&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;72.50&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.7.3&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;59&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;481&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;8.15&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;20753&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;351.74&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;21473&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;363.94&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.7.4&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;134&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;746&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;5.56&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;8527&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;63.63&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;9744&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;72.71&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.7.5&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;83&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;548&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6.60&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6766&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;81.51&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;7543&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;90.87&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.7.6&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;63&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;427&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6.77&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;3962&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;62.88&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;4351&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;69.06&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.7.7&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;96&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;563&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;5.86&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;8928&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;93.00&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;10107&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;105.28&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.7.8&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;62&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;426&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6.87&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;5098&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;82.22&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;5463&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;88.11&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.7.9&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;56&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;391&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6.98&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6338&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;113.17&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6886&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;122.96&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.7.10&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;69&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;440&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6.37&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;5051&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;73.20&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;7271&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;105.37&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.7.11&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;72&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;652&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;9.05&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;7354&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;102.13&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;8863&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;123.09&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.7.12&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;63&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;382&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6.06&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;3060&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;48.57&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;3411&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;54.14&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.8.0&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;62&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;497&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;8.01&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;5611&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;90.50&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6037&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;97.37&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.8.1&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;71&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;348&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;4.90&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;2921&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;41.14&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6047&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;85.16&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;v1.8.2&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;71&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;635&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;8.94&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;5881&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;82.83&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;6599&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"&gt;92.94&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/WPDpWgQ_TSk" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/5424060020055837437?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/5424060020055837437?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/WPDpWgQ_TSk/so-how-well-are-we-doing-lately.html" title="So how well are we doing lately?" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><feedburner:origLink>http://git-blame.blogspot.com/2013/03/so-how-well-are-we-doing-lately.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQBR3c4eyp7ImA9WhBQEk0.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-4178142476550168605</id><published>2013-03-13T13:25:00.000-07:00</published><updated>2013-03-13T13:25:56.933-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-13T13:25:56.933-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><category scheme="http://www.blogger.com/atom/ns#" term="Announce" /><title>Git 1.8.2</title><content type="html">The latest feature release Git v1.8.2 is now available at the usual places. The release has commits from 1200+ contributors, among which ~30 are new names in this cycle (~90 people contributed 630+ changes since v1.8.1 release).&lt;br /&gt;
&lt;br /&gt;
I've already mentioned &lt;a href="http://git-blame.blogspot.com/2013/03/git-182-release-candidate-2.html" target="_blank"&gt;backward-compatibility notes&lt;/a&gt; and &lt;a href="http://git-blame.blogspot.com/2013/03/git-182-rc3.html" target="_blank"&gt;notable new features&lt;/a&gt;, so I won't repeat them.&lt;br /&gt;
&lt;br /&gt;
Have fun.&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/mxSOY1A7f84" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/4178142476550168605?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/4178142476550168605?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/mxSOY1A7f84/git-182.html" title="Git 1.8.2" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><feedburner:origLink>http://git-blame.blogspot.com/2013/03/git-182.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcGR3cyfyp7ImA9WhBRFkQ.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-82827055167869076</id><published>2013-03-07T15:13:00.000-08:00</published><updated>2013-03-07T15:13:46.997-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-07T15:13:46.997-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><category scheme="http://www.blogger.com/atom/ns#" term="Announce" /><title>Git 1.8.2-rc3</title><content type="html">This is the third and planned-to-be-the-final release candidate for the upcoming 1.8.2 release. Hopefully we can have the final sometime next week.&lt;br /&gt;
&lt;br /&gt;
Reviewing the draft release notes, I see that there aren't many earth-shattering new features, but there are quite a few niceties around the fringes. To name a few at random:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Command line completion (in &lt;span style="font-family: Courier New, Courier, monospace;"&gt;contrib/completion&lt;/span&gt;) has learned what can be "&lt;span style="font-family: Courier New, Courier, monospace;"&gt;git add&lt;/span&gt;"ed and what are irrelevant. You would not want "&lt;span style="font-family: Courier New, Courier, monospace;"&gt;git add hello.&amp;lt;TAB&amp;gt;&lt;/span&gt;" to offer choices between &lt;span style="font-family: Courier New, Courier, monospace;"&gt;hello.c&lt;/span&gt; and &lt;span style="font-family: Courier New, Courier, monospace;"&gt;hello.h&lt;/span&gt; when you only have changes in &lt;span style="font-family: Courier New, Courier, monospace;"&gt;hello.c&lt;/span&gt; and &lt;span style="font-family: Courier New, Courier, monospace;"&gt;hello.h&lt;/span&gt; is unmodified.&lt;/li&gt;
&lt;li&gt;The patterns used in &lt;span style="font-family: Courier New, Courier, monospace;"&gt;.gitignore&lt;/span&gt; and &lt;span style="font-family: Courier New, Courier, monospace;"&gt;.gitattributes&lt;/span&gt; files can have double-asterisk &lt;span style="font-family: Courier New, Courier, monospace;"&gt;/**/&lt;/span&gt; to match 0 or more levels of directories.&lt;/li&gt;
&lt;li&gt;In the documentation, we consistently refer to Git the software as "Git", not "git" or "GIT" (the last one was a poor-man's attempt for imitating "Git" rendered in S&lt;span style="font-size: xx-small;"&gt;MALL&lt;/span&gt; C&lt;span style="font-size: xx-small;"&gt;APS&lt;/span&gt;).&lt;/li&gt;
&lt;li&gt;"&lt;span style="font-family: Courier New, Courier, monospace;"&gt;git branch&lt;/span&gt;" used to accept nonsense parameters from the command line and silently ignored them (e.g. "&lt;span style="font-family: Courier New, Courier, monospace;"&gt;git branch -m A B C&lt;/span&gt;"). Such an erroneous input is checked more carefully.&lt;/li&gt;
&lt;li&gt;"&lt;span style="font-family: Courier New, Courier, monospace;"&gt;git log&lt;/span&gt;" and friends can be told to use the same mailmap mechanism used by "&lt;span style="font-family: Courier New, Courier, monospace;"&gt;git shortlog&lt;/span&gt;" to canonicalize the user names.&lt;/li&gt;
&lt;li&gt;"&lt;span style="font-family: Courier New, Courier, monospace;"&gt;git log --grep=&amp;lt;pattern&amp;gt;&lt;/span&gt;" first converts the log messages to &lt;span style="font-family: Courier New, Courier, monospace;"&gt;i18n.logoutputencoding&lt;/span&gt; before matching them against the pattern.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
For notable backward compatibility issues (read: there &lt;i&gt;is &lt;/i&gt;none yet ;-), please refer to the &lt;a href="http://git-blame.blogspot.com/2013/03/git-182-release-candidate-2.html" target="_blank"&gt;earlier article&lt;/a&gt; on 1.8.2-rc2.&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/EcBZyks9lcU" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/82827055167869076?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/82827055167869076?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/EcBZyks9lcU/git-182-rc3.html" title="Git 1.8.2-rc3" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><feedburner:origLink>http://git-blame.blogspot.com/2013/03/git-182-rc3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4HSHg5eCp7ImA9WhBRFE8.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-7912672991166453254</id><published>2013-03-04T02:14:00.002-08:00</published><updated>2013-03-04T11:22:19.620-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-04T11:22:19.620-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><category scheme="http://www.blogger.com/atom/ns#" term="Random Hacking" /><title>Living in the browser seems to be possible</title><content type="html">My primary Git work environment lives inside a GNU screen session that is running forever. In the first virtual terminal is an instance of Emacs, and it also is running forever. That is where I read e-mails and process patches. I have several virtual terminals in this screen session, and no matter where I physically am, I am connected to this screen session over SSH whenever I am working on Git.&lt;br /&gt;
&lt;br /&gt;
Usually I open two or three Gnome terminals on my notebook and from these terminals go over SSH to the said screen session, but I tried &lt;a href="https://chrome.google.com/webstore/detail/secure-shell/pnhechapfaindjhompbnflcldabbghjo?utm_source=chrome-ntp-launcher" target="_blank"&gt;Secure Shell&lt;/a&gt; in Chrome on Friday evening. An earlier version of this extension I tried long time ago did not support anything but password authentication, but the recent versions seem to grok private key authentication just fine. It is still rough in that there is no UI to tweak font sizes &amp;amp;c, but a few essentials can be tweaked from the JavaScript console (I hear some of you say "eek" already) and these tweaks survive browser or machine restart. I do not mind doing "set once and forget" configuration by hand.&lt;br /&gt;
&lt;br /&gt;
Following its &lt;a href="http://goo.gl/m6Nj8" target="_blank"&gt;FAQ page&lt;/a&gt;, I came up with the following to let me get going:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;term_.prefs_.set('background-color', 'white')
term_.prefs_.set('foreground-color', 'black')
term_.prefs_.set('font-family', 'monospace')
term_.prefs_.set('font-size', 12)
term_.prefs_.set('scrollbar-visible', false)
&lt;/pre&gt;&lt;br /&gt;
After opening the terminal window (make sure to set the extension to open in its own window—otherwise an innocent \C-w will close the terminal), I clicked to "Inspect Element", then went to "Console" to open the JavaScript console, and then typed the above four lines. Enter the connection parameter and I have a working and usable terminal. Happiness.&lt;br /&gt;
&lt;br /&gt;
I didn't really mean&amp;nbsp;to, but I ended up not opening any program other than Chrome over the weekend. It was rather a fun experience.&lt;br /&gt;
&lt;br /&gt;
I do have to run a few local programs from time to time (e.g. GnuCash, Gimp, and Kid3 come to mind), and I do not think I can switch entirely to a Chromebook yet, but I should be able to survive for a few days with only Chrome.&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/N0Z_ILNMjn0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://git-blame.blogspot.com/feeds/7912672991166453254/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=632023420616344756&amp;postID=7912672991166453254&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/7912672991166453254?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/7912672991166453254?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/N0Z_ILNMjn0/living-in-browser-seems-to-be-possible.html" title="Living in the browser seems to be possible" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://git-blame.blogspot.com/2013/03/living-in-browser-seems-to-be-possible.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08HR3Y7eSp7ImA9WhBRE00.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-4618848501851281749</id><published>2013-03-03T02:17:00.000-08:00</published><updated>2013-03-03T02:17:16.801-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-03T02:17:16.801-08:00</app:edited><title>Git 1.8.2 release candidate #2</title><content type="html">&lt;span style="font-family: inherit;"&gt;The upcoming release is taking shape and I am hoing that not many things will change until the final one. I just tagged the second release candidate 1.8.2-rc2 before going to bed.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;There are a handful of behaviour change that are worth noting.&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li style="white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;"git push $there tag v1.2.3" used to allow replacing a tag v1.2.3 that already exists in the repository $there, if the rewritten tag you are pushing points at a commit that is a descendant of a commit that the old tag v1.2.3 points at.  This was found to be error prone and starting with this release, any attempt to update an existing ref under refs/tags/ hierarchy will fail, without "--force".&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;When "git add -u" and "git add -A", that does not specify what paths to add on the command line, is run from inside a subdirectory, the scope of the operation has always been limited to the subdirectory. Many users found this counter-intuitive, given that "git commit -a" and other commands operate on the entire tree regardless of where you are. In this release, these commands give warning in such a case and encourage the user to say "git add -u/-A ." instead when restricting the scope to the current directory.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;At Git 2.0 (not *this* one), we plan to change these commands without pathspec to operate on the entire tree.  Forming a habit to type "." when you mean to limit the command to the current working directory will protect you against the planned future change, and that is the whole point of the new message (there will be no configuration variable to squelch this warning---it goes against the "habit forming" objective).&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style="white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;For exciting new features, please refer to the &lt;a href="http://git-htmldocs.googlecode.com/git/RelNotes/1.8.2.txt" target="_blank"&gt;draft release notes&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-Vcdhl_jw-84/Tzb5pkNJl5I/AAAAAAAAEcE/qU_t_zLCkIQ/s1600/image" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="179" src="http://1.bp.blogspot.com/-Vcdhl_jw-84/Tzb5pkNJl5I/AAAAAAAAEcE/qU_t_zLCkIQ/s200/image" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/QpYJTwxi_oU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://git-blame.blogspot.com/feeds/4618848501851281749/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=632023420616344756&amp;postID=4618848501851281749&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/4618848501851281749?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/4618848501851281749?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/QpYJTwxi_oU/git-182-release-candidate-2.html" title="Git 1.8.2 release candidate #2" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-Vcdhl_jw-84/Tzb5pkNJl5I/AAAAAAAAEcE/qU_t_zLCkIQ/s72-c/image" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://git-blame.blogspot.com/2013/03/git-182-release-candidate-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEFRnczfCp7ImA9WhBSGE4.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-4927024841050725055</id><published>2013-02-25T16:30:00.001-08:00</published><updated>2013-02-25T16:30:17.984-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-25T16:30:17.984-08:00</app:edited><title>UnFun with signed tags</title><content type="html">I sometimes wish if we can revoke signature made (with PGP/GPG) to a specific tag.&lt;br /&gt;
&lt;br /&gt;
I know that an electronic signature (like a handwritten one) is to protect both parties, the one who signs, and the one who gets something signed, and allowing a signer to retroactively cancel a signature invalidates the protection given to the latter. I'd be protected from a bogus claim that I made a promise I didn't make when somebody produces a document with a signature that does not match mine, and I'd be protected from somebody who changes his mind later after signing a document to promise me with his signature.&lt;br /&gt;
&lt;br /&gt;
But in the context of signing a release tag for an open source project, non-repudiation is not an issue.&lt;br /&gt;
&lt;br /&gt;
I often merge the last set of topics to the 'master' (or 'maint') branch, add a signed release tag to the tip, merge the result to 'next' and higher integration branches, only to find that a few more tweaks are necessary before the real release while testing the integration branches. Since I do not push out any branch before all the main integration branches (i.e. 'maint', 'master', 'next' and 'pu') are ready, it will not hurt anybody for me to rewind 'next' and 'pu' locally, discard the tag and redo the 'master' (or 'maint') branch. I also do not push out the signed tag until all these branches are ready, so in practice I just can discard the previous signed tag (that hasn't been pushed out) and tag the tip of 'master' with the same name. Nobody will notice.&lt;br /&gt;
&lt;br /&gt;
So in practice, I do not need a feature to cancel a signed tag I created earlier, but at the philosophical level. But it somewhat feels awkward.&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/IsqGJGHVnxY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://git-blame.blogspot.com/feeds/4927024841050725055/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=632023420616344756&amp;postID=4927024841050725055&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/4927024841050725055?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/4927024841050725055?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/IsqGJGHVnxY/unfun-with-signed-tags.html" title="UnFun with signed tags" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://git-blame.blogspot.com/2013/02/unfun-with-signed-tags.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8DSX46eSp7ImA9WhBRFko.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-6377408202944367942</id><published>2013-02-24T22:41:00.000-08:00</published><updated>2013-03-07T09:37:58.011-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-07T09:37:58.011-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><title>More leftover bits</title><content type="html">I've spent the past few days to see if there were discussions that are worth salvaging but somehow petered out without reaching conclusion, veered into tangent, or did not even start.&lt;br /&gt;
&lt;br /&gt;
I tried to be fairly thorough, but I am sure I have missed some. Note that I deliberately excluded ones that fall into the &lt;i&gt;Nobody who knows what they are talking about&amp;nbsp;&lt;/i&gt;&lt;i&gt;has any idea how to approach this feature&lt;/i&gt;&amp;nbsp;category. I also left out discussions that are fairly young, hoping that they will stay alive without me keeping track of them.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Teach "--first-parent" to "git rebase" to deal better with a history with (possibly evil) merges from side branches.&lt;br /&gt;Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/198125/focus=198516" target="_blank"&gt;$gmane/198516&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;More fixes to bring sanity to "git diff --no-index", some discussed in the thread are definitely worthwhile, while some others are not.&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/200703/focus=200769" target="_blank"&gt;$gmane/200769&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The name sanitization code may be overly conservative.&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/200816/focus=200823" target="_blank"&gt;$gmane/200823&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The behaviour of "git filter-branch" around annotated tag may be under-documented to cause misunderstanding on the user's part, or it could be simply buggy.&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/212353"&gt;$gmane/212353&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Annotating a pair of commit objects and trigger interesting behaviour when they both appear in the history.&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/212570"&gt;$gmane/212570&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Make it safer to export mandir, htmldir, etc. from the top-level to Documentation/ Makefile.&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/216189/focus=216222" target="_blank"&gt;$gmane/216222&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Allow escaping glob metacharacters in .gitattributes.&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/212631"&gt;$gmane/212631&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Remove contrib/ciabot/.&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/212649"&gt;$gmane/212649&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The return value from getenv(3) may be volatile across calls.&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/212657/focus=212660"&gt;$gmane/212660&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Support VPATH build&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/212714/focus=212744"&gt;$gmane/212744&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Build on "custom comment char" to make it "custom comment prefix string", e.g. "## ".&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/213002/focus=213802"&gt;$gmane/213802&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Serving "git archive" over smart-http.&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/213091/focus=213243"&gt;$gmane/213243&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;"git fetch --deepen"?&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/213179/focus=213180"&gt;$gmane/213180&lt;/a&gt;&amp;nbsp;&lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/212912/focus=212950" target="_blank"&gt;$gmane/212950&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Perhaps reword some questions from "send-email"&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.emulators.libvirt/70239/focus=213233"&gt;$gmane/213233&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Improve "git remote -v" output to show where these URLs come from?&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/213263/focus=213806"&gt;$gmane/213806&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Perhaps add a robust "shell portability check" mode for test scripts?&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/213264/focus=214709"&gt;$gmane/214709&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Perhaps treat failures to write to a hook process that did not consume its input as success?&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/212270/focus=213548"&gt;$gmane/213548&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;"git rm -u"?&lt;/li&gt;
&lt;li&gt;Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/213988/focus=213993"&gt;$gmane/213993&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;"git submodule foreach --untracked"&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/214695/focus=214860"&gt;$gmane/214860&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Prepare to change the default behaviour when "git add -u/-A" is run without pathspec with Git 2.0&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/213988/focus=214822" target="_blank"&gt;$gmane/214822&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Perhaps concatenate young and small packs into one as a cheap repack?&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/214641/focus=215288" target="_blank"&gt;$gmane/215288&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Align the logic format-patch decides to omit S-o-b to that is used by cherry-pick and commit.&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/214764/focus=216026" target="_blank"&gt;$gmane/216026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Allow installation filemode to be tweaked.&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/215088/focus=215119" target="_blank"&gt;$gmane/215119&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;"git log --cc" without other diff format specifiers like --raw should imply "--cc -p".&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/215341/focus=215470" target="_blank"&gt;$gmane/215470&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Perhaps "git grep" may want to pay attention to --textconv.&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/215385" target="_blank"&gt;$gmane/215385&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Perhaps forbid "log --graph --no-walk", as --graph is about connected history while --no-walk is about discrete points?&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/215828/focus=216083" target="_blank"&gt;$gmane/216083&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Possible merge-recursive corner case bug?&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/216117" target="_blank"&gt;$gmane/216117&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Complete smart HTTP protocol documentation?&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/93699/focus=216262" target="_blank"&gt;$gmane/216262&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Perhaps include an artificial HEAD to a bundle when HEAD is not specified from the command line?&lt;br /&gt;
Cf. &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/216352/focus=216401" target="_blank"&gt;$gmane/216401&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/PFstYwGnlGY" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/6377408202944367942?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/6377408202944367942?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/PFstYwGnlGY/more-leftover-bits.html" title="More leftover bits" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><feedburner:origLink>http://git-blame.blogspot.com/2013/02/more-leftover-bits.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYMQn8ycSp7ImA9WhBSE0k.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-8871322240875221291</id><published>2013-02-19T23:43:00.000-08:00</published><updated>2013-02-19T23:43:03.199-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-19T23:43:03.199-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Work Log" /><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><title>Missing the normal code review process</title><content type="html">&lt;span style="background-color: white; font-family: inherit; white-space: pre-wrap;"&gt;My favorite &lt;a href="http://www.bonkersworld.net/code-reviews/" target="_blank"&gt;Bonker's World cartoon&lt;/a&gt; points out that the code review process alone does not necessarily ensure the quality of the code.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="background-color: white; white-space: pre-wrap;"&gt;When you are living in the open, however, you as a reviewee are restrained with an extra incentive to be more careful, lest you embarrass yourself in public with silly mistakes. The reviewers have the same extra incentive to find flaws in others patches to earn their karma points. It also helps that any bug becomes shallow because the reviewers competing to find issues in your code gives any change a large enough number of eyeballs.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="background-color: white; white-space: pre-wrap;"&gt;It is no wonder that the open source process can produce better-quality code more easily.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white; font-family: inherit; white-space: pre-wrap;"&gt;
Unless you are working on fixing a vulnerability that is still under embargo, that is. It is even worse if the bug is in an obscure corner of the system you do not personally use very much.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="background-color: white; white-space: pre-wrap;"&gt;You can only confide in a few of your trusted lieutenants, who all tend to think in a way similar to yourself. This greatly increases the chances of simple and silly bugs go unnoticed. And it makes you feel uneasy and stressed. You get only one chance to get this right, or the disclosure goes out. This is especially true when you thought you have everything tagged and ready, and decided to take a nap while waiting for the embargo to expire. It suddenly occurs to you that there was a corner case you missed, and you have to scramble to redo the fix.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;&lt;span style="background-color: white; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="background-color: white; white-space: pre-wrap;"&gt;Now that the embargo is over and the release is out, I can relax ;-)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white; font-family: arial, sans-serif; font-size: x-small; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/e3SQSkJNSoo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://git-blame.blogspot.com/feeds/8871322240875221291/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=632023420616344756&amp;postID=8871322240875221291&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/8871322240875221291?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/8871322240875221291?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/e3SQSkJNSoo/missing-normal-code-review-process.html" title="Missing the normal code review process" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://git-blame.blogspot.com/2013/02/missing-normal-code-review-process.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYCQ3c8cCp7ImA9WhBSE0k.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-8048669255672711582</id><published>2013-02-19T23:42:00.001-08:00</published><updated>2013-02-19T23:42:42.978-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-19T23:42:42.978-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><category scheme="http://www.blogger.com/atom/ns#" term="Announce" /><title>Git 1.8.1.4</title><content type="html">&lt;span style="font-family: inherit;"&gt;&lt;span style="background-color: white; white-space: pre-wrap;"&gt;The latest maintenance release Git 1.8.1.4 is now available at the &lt;/span&gt;&lt;span style="background-color: white; white-space: pre-wrap;"&gt;usual places.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white;"&gt;&lt;span style="font-family: inherit; white-space: pre-wrap;"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;span style="font-family: inherit;"&gt;&lt;span style="background-color: white;"&gt;&lt;span style="white-space: pre-wrap;"&gt;This is primarily to tighten the host verification when imap-send is talking to your mail server via TLS/SSL. The topic that was merged to the tip of 'maint' track consists of 3 patches and is based on the 1.7.6 maintenance track. This is to make it easier for the distro folks to merge the topic to their older maintenance &lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: white;"&gt;&lt;span style="white-space: pre-wrap;"&gt;branches to issue hotfix binary releases if they wanted to.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;&lt;span style="background-color: white;"&gt;&lt;span style="white-space: pre-wrap;"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: white;"&gt;&lt;span style="white-space: pre-wrap;"&gt;This release itself also contains many small updates to the user-manual.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white; font-family: inherit; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="background-color: white; font-family: inherit; white-space: pre-wrap;"&gt;The release tarballs are found at:&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white; font-family: inherit;"&gt;&lt;span style="white-space: pre-wrap;"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: white;"&gt;&lt;span style="white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;    &lt;/span&gt;&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;http://code.google.com/p/git-core/downloads/list&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;and their SHA-1 checksums are:&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;


&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;553191fe02cfac77386d5bb01df0a79eb7f163c8 &amp;nbsp;git-1.8.1.4.tar.gz&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;bb71df6bc1fdb55b45c59af83102e901d484ef53 &amp;nbsp;git-htmldocs-1.8.1.4.tar.gz&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;98c41b38d02f09e1fcde335834694616d0a615f7 &amp;nbsp;git-manpages-1.8.1.4.tar.gz&lt;/span&gt;&lt;br /&gt;
&lt;div style="font-family: inherit;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style="font-family: inherit;"&gt;Also the following public repositories all have a copy of the v1.8.1.4&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;tag and the maint branch that the tag points at:&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; url = git://repo.or.cz/alt-git.git&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; url = https://code.google.com/p/git-core/&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; url = git://git.sourceforge.jp/gitroot/git-core/git.git&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; url = git://git-core.git.sourceforge.net/gitroot/git-core/git-core&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; url = https://github.com/gitster/git&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Thanks, and enjoy.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/iNHuRqc2xz0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://git-blame.blogspot.com/feeds/8048669255672711582/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=632023420616344756&amp;postID=8048669255672711582&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/8048669255672711582?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/8048669255672711582?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/iNHuRqc2xz0/git-1814.html" title="Git 1.8.1.4" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://git-blame.blogspot.com/2013/02/git-1814.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkAEQHc-eSp7ImA9WhBSEkQ.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-1448852817203781395</id><published>2013-02-18T22:44:00.001-08:00</published><updated>2013-02-19T08:18:21.951-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-19T08:18:21.951-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><title>The Maintainer's Life (1)</title><content type="html">While I was getting interviewed for an article in the "Open Source community leaders" series on a Japanese trade publication (due to come out in &lt;i&gt;many&lt;/i&gt; weeks), I was asked an interesting question:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
What is your role in the community? What is your job?&lt;/blockquote&gt;
My immediate reaction was "Huh?". The interviewer contacted me knowing that I am the Git maintainer. Don't all maintainers do more or less the same thing and operate more or less in the same way?&lt;br /&gt;
&lt;br /&gt;
But here is my version of what I do, anyway. What I do fall into two categories.&lt;br /&gt;
&lt;br /&gt;
One is what I do as a member of the Git development community like everybody else.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Triage end-user bug-reports into non-bugs and real bugs. Non-bugs may result in referring the user to an appropriate manual page, or may result in updates to the documentation. Bugs may result in fixes.&lt;/li&gt;
&lt;li&gt;Read other end-user requests, ranging from "Help, I do not know what I am doing" to a solidly written feature requests. Again, many may result in referring the user to an existing documentation, some may result in real enhancements.&lt;/li&gt;
&lt;li&gt;Design and propose fixes and/or enhancements (possibly inspired by end-user inputs above, or perhaps scratching own itch) to the community and discuss with the members to reach consensus. Post a series of patches to implement the design and get them reviewed by community members. With their help, polish the patches to perfection.&lt;/li&gt;
&lt;li&gt;Participate in the discussion and the review process initiated by other community members who do the above.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
The other is what I the maintainer alone does as the project leader.&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Keep an eye on end-user reports and requests that haven't been responded, find somebody in the community (i.e. victims) who are knowledgeable enough to handle them, and redirect.&lt;/li&gt;
&lt;li&gt;Accept the patches polished in the review process and manage releases.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
An interesting thing to notice is that the latter, at least when expressed as a list of bullet items, is a lot smaller than the former. Strictly speaking, the "Keep an eye on leftover bits and redirect" item could be done by anybody in the community, and in fact we saw various people acting as capable project secretaries to do exactly that from time to time. Even though I rarely do a "grand redesign with a road-map toward the future", such a topic would not be done by me as the maintainer descending from above with an edict, but as a proposal by me as one of the members of the community (bullet 3 in the former list). Also, compared to less experienced community members, I find myself saying "Let's step back a bit" a lot more often, asking other participants in design discussions to temporarily free their thinking of whatever narrow problem description originally given by the proposer of the topic, and instead to view the issue with wider context in mind. That is not done as the maintainer, but as one of the more experienced members of the development community. Other experienced community members can and often do the same to inject sanity to ongoing discussions.&lt;br /&gt;
&lt;br /&gt;
I think one of the biggest reasons why the community does not come to a screeching halt when I disappear for a few weeks is because there aren't many tasks &lt;i&gt;only&lt;/i&gt;&amp;nbsp;the maintainer is supposed to do in our community in the first place. Capable others can take over fairly smoothly while I am away, because no matter who the interim maintainer is, what other community members do do not change very much.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
Perhaps what the maintainer does may be different from communities to communities. How does &lt;i&gt;your&lt;/i&gt;&amp;nbsp;community work?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/7vRkPbIJAhw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://git-blame.blogspot.com/feeds/1448852817203781395/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=632023420616344756&amp;postID=1448852817203781395&amp;isPopup=true" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/1448852817203781395?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/1448852817203781395?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/7vRkPbIJAhw/the-maintainers-life-1.html" title="The Maintainer's Life (1)" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://git-blame.blogspot.com/2013/02/the-maintainers-life-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UBRXk7fSp7ImA9WhBTFUo.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-9147857794254153875</id><published>2013-02-10T22:39:00.001-08:00</published><updated>2013-02-11T00:27:34.705-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-11T00:27:34.705-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><title>Git: Version Control for Everyone</title><content type="html">&lt;br /&gt;
&lt;div class="separator" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;
&lt;a href="http://www.packtpub.com/git-version-control-for-everyone/book" rel="nofollow" target="_blank"&gt;&lt;span style="font-family: inherit;"&gt;&lt;img border="0" height="200" src="http://www.packtpub.com/sites/default/files/7522OS_0.jpg" width="162" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="font-family: inherit;"&gt;Received a sample copy of &lt;/span&gt;&lt;a href="http://www.packtpub.com/git-version-control-for-everyone/book" style="font-family: inherit;" target="_blank"&gt;a new Git book&lt;/a&gt;&lt;span style="font-family: inherit;"&gt; from Packt publishing.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: inherit;"&gt;It says "Beginner's Guide"&amp;nbsp;&lt;/span&gt;on the cover&lt;span style="font-family: inherit;"&gt;; its target audience is "everyone", which apparently means those of us who have not yet read existing Git books by &lt;a href="http://pragprog.com/book/tsgit/pragmatic-version-control-using-git" target="_blank"&gt;Swicegood&lt;/a&gt;, &lt;a href="http://www.amazon.com/Version-Control-Git-collaborative-development/dp/1449316387" target="_blank"&gt;Loeliger&lt;/a&gt;, or &lt;a href="http://git-scm.com/book/" target="_blank"&gt;Chacon&lt;/a&gt;, or find them a bit intimidating.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;
This book turned out to be a very interesting read.&lt;br /&gt;
&lt;br /&gt;
It is relatively short (160 pages), and can be browsed in pretty much a single sitting. I found its approach to introduce Git to "everybody" readers very interesting. After showing step-by-step installation on major platforms (which every Git book unfortunately needs to do), the document it tracks in its first Git repository as its example is "content.docx" (surprise!).&lt;br /&gt;
&lt;br /&gt;
I do not recall seeing anybody start teaching Git (or any other SCM for that matter) by tracking something you cannot get a meaningful diff out of its history you can manipulate. But we coders have to admit that that is one of the definitions of "everybody"; normal people do not read diffs and apply patches.&lt;br /&gt;
&lt;br /&gt;
And the book demonstrates that tracking "content.docx" is sufficient to teach many parts of Git, and successfully teaches resetting to an earlier point to discard recent history, setting up a central repository and using it to work with others by communicating, reviewing the history with &lt;span style="font-family: Courier New, Courier, monospace;"&gt;gitk&lt;/span&gt;, &lt;span style="font-family: Courier New, Courier, monospace;"&gt;git log&lt;/span&gt;, &lt;span style="font-family: Courier New, Courier, monospace;"&gt;git shortlog&lt;/span&gt;, etc., without ever mentioning diffs or merges. It is only at page 107 we see text files added to the history and merge conflicts getting resolved. We do not even see &lt;span style="font-family: Courier New, Courier, monospace;"&gt;git blame&lt;/span&gt; mentioned anywhere in the book.&lt;br /&gt;
&lt;br /&gt;
If somebody tried those other "for programmers" Git books and found their introductory parts a little over his head, this book may be a good introductory book to help him get over that very initial hump.&lt;br /&gt;
&lt;br /&gt;
I have never heard of the author of this book, nor any of the people listed as reviewers, on the Git mailing list or elsewhere. I find that fact alone sati&lt;span style="font-family: inherit;"&gt;sfying&lt;span style="background-color: white; color: #222222; line-height: 14.545454025268555px;"&gt;—&lt;/span&gt;to see&lt;/span&gt;&amp;nbsp;that a Git book is written by somebody who is not an insider, and the book is targeted for "everybody". It shows how much progress we, the Git development community, have made to make the system more accessible and how much Git has become to matter in the real world. Thank you, everybody in the Git community, for working on making Git a better system every day. Your work is very much appreciated.&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/SkUy_jq1mHU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://git-blame.blogspot.com/feeds/9147857794254153875/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=632023420616344756&amp;postID=9147857794254153875&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/9147857794254153875?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/9147857794254153875?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/SkUy_jq1mHU/git-version-control-for-everyone.html" title="Git: Version Control for Everyone" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://git-blame.blogspot.com/2013/02/git-version-control-for-everyone.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8BQ3k9cCp7ImA9WhBTEkU.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-755301049086537277</id><published>2013-02-07T16:20:00.004-08:00</published><updated>2013-02-07T16:20:52.768-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-07T16:20:52.768-08:00</app:edited><title>Git 1.8.1.3</title><content type="html">&lt;br /&gt;
Another release to give fixes for a handful bugs to users who are stuck with the maintenance track ;-) &amp;nbsp;This maintenance release contains the following fixes, and other fixes to the documentation.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The attribute mechanism didn't allow limiting attributes to be applied to only a single directory itself with "path/" like the exclude mechanism does. The fix for this in 1.8.1.2 had performance degradation.&lt;/li&gt;
&lt;li&gt;Command line completion code was inadvertently made incompatible with older versions of bash by using a newer array notation.&lt;/li&gt;
&lt;li&gt;Scripts to test bash completion was inherently flaky as it was affected by whatever random things the user may have on &lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;$PATH&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;A fix was added to the build procedure to work around buggy versions of ccache broke the auto-generation of dependencies, which unfortunately is still relevant because some people use ancient distros.&lt;/li&gt;
&lt;li&gt;We used to stuff "user@" and then append what we read from /etc/mailname to come up with a default e-mail ident, but a bug lost the "user@" part.&lt;/li&gt;
&lt;li&gt;"&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;git am&lt;/span&gt;" did not parse datestamp correctly from Hg generated patch, when it is run in a locale outside C (or en).&lt;/li&gt;
&lt;li&gt;Attempt to "&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;branch --edit-description&lt;/span&gt;" an existing branch, while being on a detached HEAD, errored out.&lt;/li&gt;
&lt;li&gt;"&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;git cherry-pick&lt;/span&gt;" did not replay a root commit to an unborn branch.&lt;/li&gt;
&lt;li&gt;We forgot to close the file descriptor reading from "&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;gpg&lt;/span&gt;" output, killing "&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;git log --show-signature&lt;/span&gt;" on a long history.&lt;/li&gt;
&lt;li&gt;"&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;git rebase --preserve-merges&lt;/span&gt;" lost empty merges in recent versions of Git.&lt;/li&gt;
&lt;li&gt;Rebasing the history of superproject with change in the submodule has been broken since v1.7.12.&lt;/li&gt;
&lt;li&gt;A failure to push due to non-ff while on an unborn branch dereferenced a NULL pointer when showing an error message.&lt;/li&gt;
&lt;/ul&gt;
For those of you who may not be familiar with how Git development works, these fixes were developed and reviewed on our mailing list (&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;&lt;a href="http://vger.kernel.org/vger-lists.html#git"&gt;git@vger.kernel.org&lt;/a&gt;&lt;/span&gt;), and were&amp;nbsp;first&amp;nbsp;applied to the&amp;nbsp;&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;next&lt;/span&gt;&amp;nbsp;branch of the&amp;nbsp;&lt;a href="https://code.google.com/p/git-core/source/checkout" target="_blank"&gt;main repository&lt;/a&gt;&amp;nbsp;where developers and testers regularly pull from. They build and use the version from this branch daily to help ensuring the stability and correctness of the changes.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
These changes proved to be safe after a few weeks testing period. And then they were merged to the&amp;nbsp;&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;master&lt;/span&gt;&amp;nbsp;branch to become a part of upcoming release (1.8.2, scheduled to happen sometime in February).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Thanks to this fairly conservative development process, you can generally expect that the tip of our&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;master&lt;/span&gt;&amp;nbsp;branch is more stable than any released version of Git.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
There are, however, people who want to avoid disruptive changes by staying behind, and to satisfy these people, among the changes that have been applied to the&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;master&lt;/span&gt;&amp;nbsp;branch, only the ones that are bugfixes (not feature enhancements) are merged from time to time to the&amp;nbsp;&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;maint&lt;/span&gt;&amp;nbsp;branch and the results are tagged as maintenance releases.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This 1.8.1.3 is such a release.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/AxIOh4BkC4A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://git-blame.blogspot.com/feeds/755301049086537277/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=632023420616344756&amp;postID=755301049086537277&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/755301049086537277?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/755301049086537277?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/AxIOh4BkC4A/git-1813.html" title="Git 1.8.1.3" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://git-blame.blogspot.com/2013/02/git-1813.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04MQX4zcSp7ImA9WhNaFEw.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-5345934664099037089</id><published>2013-01-28T16:39:00.003-08:00</published><updated>2013-01-28T16:39:40.089-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-28T16:39:40.089-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><category scheme="http://www.blogger.com/atom/ns#" term="Announce" /><title>Git 1.8.1.2</title><content type="html">Another release to give fixes for a handful bugs to users who are stuck with the maintenance track ;-) &amp;nbsp;This maintenance release contains the following fixes, and other fixes to the documentation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;An element on &lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;GIT_CEILING_DIRECTORIES&lt;/span&gt; list that does not name the real path to a directory (i.e. a symbolic link) could have caused the &lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;GIT_DIR&lt;/span&gt; discovery logic to escape the ceiling.&lt;/li&gt;
&lt;li&gt;Command line completion for "&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;tcsh&lt;/span&gt;" emitted an unwanted space after completing a single directory name.&lt;/li&gt;
&lt;li&gt;Command line completion leaked an unnecessary error message while looking for possible matches with paths in &lt;tree-ish&gt;.&lt;/tree-ish&gt;&lt;/li&gt;
&lt;li&gt;"&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;git archive&lt;/span&gt;" did not record uncompressed size in the header when streaming a zip archive, which confused some implementations of unzip.&lt;/li&gt;
&lt;li&gt;When users spelled "cc:" in lowercase in the fake "header" in the trailer part, "&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;git send-email&lt;/span&gt;" failed to pick up the addresses from there. As e-mail headers field names are case insensitive, this script should follow suit and treat "cc:" and "Cc:" the same way.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div&gt;
For those of you who may not be familiar with how Git development works, these fixes were developed and reviewed on our mailing list (&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;&lt;a href="http://vger.kernel.org/vger-lists.html#git"&gt;git@vger.kernel.org&lt;/a&gt;&lt;/span&gt;), and were&amp;nbsp;first&amp;nbsp;applied to the &lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;next&lt;/span&gt;&amp;nbsp;branch of the &lt;a href="https://code.google.com/p/git-core/source/checkout" target="_blank"&gt;main repository&lt;/a&gt; where developers and testers regularly pull from. They build and use the version from this branch daily to help ensuring the stability and correctness of the changes.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
These changes proved to be safe after a few weeks testing period. And then they were merged to the &lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;master&lt;/span&gt; branch to become a part of upcoming release (1.8.2, scheduled to happen sometime in February).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Thanks to this fairly conservative development process, you can generally expect that the tip of our&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;master&lt;/span&gt;&amp;nbsp;branch is more stable than any released version of Git.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
There are, however, people who want to avoid disruptive changes by staying behind, and to satisfy these people, among the changes that have been applied to the&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;master&lt;/span&gt;&amp;nbsp;branch, only the ones that are bugfixes (not feature enhancements) are merged from time to time to the &lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;maint&lt;/span&gt; branch and the results are tagged as maintenance releases.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This 1.8.1.2 is such a release.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/0RyS4teLoFw" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/5345934664099037089?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/5345934664099037089?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/0RyS4teLoFw/git-1812.html" title="Git 1.8.1.2" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><feedburner:origLink>http://git-blame.blogspot.com/2013/01/git-1812.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4FRXYzfCp7ImA9WhNbEUQ.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-6334259616173818271</id><published>2013-01-14T12:05:00.000-08:00</published><updated>2013-01-14T12:05:14.884-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-14T12:05:14.884-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><category scheme="http://www.blogger.com/atom/ns#" term="Announce" /><title>Git 1.8.1.1</title><content type="html">The latest maintenance release Git 1.8.1.1 is available from &lt;a href="http://git-blame.blogspot.com/p/git-public-repositories.html" target="_blank"&gt;the usual places&lt;/a&gt;. This contains many bugfixes that have been cooking on the 'master' branch since 1.8.1 was released, contributions from 27 contributors totalling 71 changes.&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/Q2ey2u7CYK8" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/6334259616173818271?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/6334259616173818271?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/Q2ey2u7CYK8/git-1811.html" title="Git 1.8.1.1" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><feedburner:origLink>http://git-blame.blogspot.com/2013/01/git-1811.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ANRHk5fyp7ImA9WhNVGUQ.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-2613661491451685322</id><published>2012-12-31T16:22:00.003-08:00</published><updated>2012-12-31T16:23:15.727-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-31T16:23:15.727-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><category scheme="http://www.blogger.com/atom/ns#" term="Announce" /><title>Git 1.8.1</title><content type="html">The latest release has just been tagged. Thanks, everybody, and a happy new year.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;Git v1.8.1 Release Notes
========================

Backward compatibility notes
----------------------------

In the next major release (not *this* one), we will change the
behavior of the "git push" command.

When "git push [$there]" does not say what to push, we have used the
traditional "matching" semantics so far (all your branches were sent
to the remote as long as there already are branches of the same name
over there).  We will use the "simple" semantics that pushes the
current branch to the branch with the same name, only when the current
branch is set to integrate with that remote branch.  There is a user
preference configuration variable "push.default" to change this, and
"git push" will warn about the upcoming change until you set this
variable in this release.

"git branch --set-upstream" is deprecated and may be removed in a
relatively distant future.  "git branch [-u|--set-upstream-to]" has
been introduced with a saner order of arguments to replace it.


Updates since v1.8.0
--------------------

UI, Workflows &amp;amp; Features

 * Command-line completion scripts for tcsh and zsh have been added.

 * "git-prompt" scriptlet (in contrib/completion) can be told to paint
   pieces of the hints in the prompt string in colors.

 * Some documentation pages that used to ship only in the plain text
   format are now formatted in HTML as well.

 * We used to have a workaround for a bug in ancient "less" that
   causes it to exit without any output when the terminal is resized.
   The bug has been fixed in "less" version 406 (June 2007), and the
   workaround has been removed in this release.

 * When "git checkout" checks out a branch, it tells the user how far
   behind (or ahead) the new branch is relative to the remote tracking
   branch it builds upon.  The message now also advises how to sync
   them up by pushing or pulling.  This can be disabled with the
   advice.statusHints configuration variable.

 * "git config --get" used to diagnose presence of multiple
   definitions of the same variable in the same configuration file as
   an error, but it now applies the "last one wins" rule used by the
   internal configuration logic.  Strictly speaking, this may be an
   API regression but it is expected that nobody will notice it in
   practice.

 * A new configuration variable "diff.context" can be used to
   give the default number of context lines in the patch output, to
   override the hardcoded default of 3 lines.

 * "git format-patch" learned the "--notes=&lt;ref&gt;" option to give
   notes for the commit after the three-dash lines in its output.

 * "git log -p -S&lt;string&gt;" now looks for the &lt;string&gt; after applying
   the textconv filter (if defined); earlier it inspected the contents
   of the blobs without filtering.

 * "git log --grep=&lt;pcre&gt;" learned to honor the "grep.patterntype"
   configuration set to "perl".

 * "git replace -d &lt;object&gt;" now interprets &lt;object&gt; as an extended
   SHA-1 (e.g. HEAD~4 is allowed), instead of only accepting full hex
   object name.

 * "git rm $submodule" used to punt on removing a submodule working
   tree to avoid losing the repository embedded in it.  Because
   recent git uses a mechanism to separate the submodule repository
   from the submodule working tree, "git rm" learned to detect this
   case and removes the submodule working tree when it is safe to do so.

 * "git send-email" used to prompt for the sender address, even when
   the committer identity is well specified (e.g. via user.name and
   user.email configuration variables).  The command no longer gives
   this prompt when not necessary.

 * "git send-email" did not allow non-address garbage strings to
   appear after addresses on Cc: lines in the patch files (and when
   told to pick them up to find more recipients), e.g.

     Cc: Stable Kernel &lt;stable k.org="k.org"&gt; # for v3.2 and up

   The command now strips " # for v3.2 and up" part before adding the
   remainder of this line to the list of recipients.

 * "git submodule add" learned to add a new submodule at the same
   path as the path where an unrelated submodule was bound to in an
   existing revision via the "--name" option.

 * "git submodule sync" learned the "--recursive" option.

 * "diff.submodule" configuration variable can be used to give custom
   default value to the "git diff --submodule" option.

 * "git symbolic-ref" learned the "-d $symref" option to delete the
   named symbolic ref, which is more intuitive way to spell it than
   "update-ref -d --no-deref $symref".


Foreign Interface

 * "git cvsimport" can be told to record timezones (other than GMT)
   per-author via its author info file.

 * The remote helper interface to interact with subversion
   repositories (one of the GSoC 2012 projects) has been merged.

 * A new remote-helper interface for Mercurial has been added to
   contrib/remote-helpers.

 * The documentation for git(1) was pointing at a page at an external
   site for the list of authors that no longer existed.  The link has
   been updated to point at an alternative site.


Performance, Internal Implementation, etc.

 * Compilation on Cygwin with newer header files are supported now.

 * A couple of low-level implementation updates on MinGW.

 * The logic to generate the initial advertisement from "upload-pack"
   (i.e. what is invoked by "git fetch" on the other side of the
   connection) to list what refs are available in the repository has
   been optimized.

 * The logic to find set of attributes that match a given path has
   been optimized.

 * Use preloadindex in "git diff-index" and "git update-index", which
   has a nice speedup on systems with slow stat calls (and even on
   Linux).


Also contains minor documentation updates and code clean-ups.


Fixes since v1.8.0
------------------

Unless otherwise noted, all the fixes since v1.8.0 in the maintenance
track are contained in this release (see release notes to them for
details).

 * The configuration parser had an unnecessary hardcoded limit on
   variable names that was not checked consistently.

 * The "say" function in the test scaffolding incorrectly allowed
   "echo" to interpret "\a" as if it were a C-string asking for a
   BEL output.

 * "git mergetool" feeds /dev/null as a common ancestor when dealing
   with an add/add conflict, but p4merge backend cannot handle
   it. Work it around by passing a temporary empty file.

 * "git log -F -E --grep='&lt;ere&gt;'" failed to use the given &lt;ere&gt;
   pattern as extended regular expression, and instead looked for the
   string literally.

 * "git grep -e pattern &lt;tree&gt;" asked the attribute system to read
   "&lt;tree&gt;:.gitattributes" file in the working tree, which was
   nonsense.

 * A symbolic ref refs/heads/SYM was not correctly removed with "git
   branch -d SYM"; the command removed the ref pointed by SYM
   instead.

 * Update "remote tracking branch" in the documentation to
   "remote-tracking branch".

 * "git pull --rebase" run while the HEAD is detached tried to find
   the upstream branch of the detached HEAD (which by definition
   does not exist) and emitted unnecessary error messages.

 * The refs/replace hierarchy was not mentioned in the
   repository-layout docs.

 * Various rfc2047 quoting issues around a non-ASCII name on the
   From: line in the output from format-patch have been corrected.

 * Sometimes curl_multi_timeout() function suggested a wrong timeout
   value when there is no file descriptor to wait on and the http
   transport ended up sleeping for minutes in select(2) system call.
   A workaround has been added for this.

 * For a fetch refspec (or the result of applying wildcard on one),
   we always want the RHS to map to something inside "refs/"
   hierarchy, but the logic to check it was not exactly right.
   (merge 5c08c1f jc/maint-fetch-tighten-refname-check later to maint).

 * "git diff -G&lt;pattern&gt;" did not honor textconv filter when looking
   for changes.

 * Some HTTP servers ask for auth only during the actual packing phase
   (not in ls-remote phase); this is not really a recommended
   configuration, but the clients used to fail to authenticate with
   such servers.
   (merge 2e736fd jk/maint-http-half-auth-fetch later to maint).

 * "git p4" used to try expanding malformed "$keyword$" that spans
   across multiple lines.

 * Syntax highlighting in "gitweb" was not quite working.

 * RSS feed from "gitweb" had a xss hole in its title output.

 * "git config --path $key" segfaulted on "[section] key" (a boolean
   "true" spelled without "=", not "[section] key = true").

 * "git checkout -b foo" while on an unborn branch did not say
   "Switched to a new branch 'foo'" like other cases.

 * Various codepaths have workaround for a common misconfiguration to
   spell "UTF-8" as "utf8", but it was not used uniformly.  Most
   notably, mailinfo (which is used by "git am") lacked this support.

 * We failed to mention a file without any content change but whose
   permission bit was modified, or (worse yet) a new file without any
   content in the "git diff --stat" output.

 * When "--stat-count" hides a diffstat for binary contents, the total
   number of added and removed lines at the bottom was computed
   incorrectly.

 * When "--stat-count" hides a diffstat for unmerged paths, the total
   number of affected files at the bottom of the "diff --stat" output
   was computed incorrectly.

 * "diff --shortstat" miscounted the total number of affected files
   when there were unmerged paths.

 * "update-ref -d --deref SYM" to delete a ref through a symbolic ref
   that points to it did not remove it correctly.&lt;/pattern&gt;&lt;/tree&gt;&lt;/tree&gt;&lt;/ere&gt;&lt;/ere&gt;&lt;/stable&gt;&lt;/object&gt;&lt;/object&gt;&lt;/pcre&gt;&lt;/string&gt;&lt;/string&gt;&lt;/ref&gt;&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/I_TtCIuvFao" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://git-blame.blogspot.com/feeds/2613661491451685322/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=632023420616344756&amp;postID=2613661491451685322&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/2613661491451685322?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/2613661491451685322?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/I_TtCIuvFao/git-181.html" title="Git 1.8.1" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://git-blame.blogspot.com/2012/12/git-181.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEESHY4fSp7ImA9WhNVGU0.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-2010766686042726893</id><published>2012-12-30T13:18:00.000-08:00</published><updated>2012-12-30T13:23:29.835-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-30T13:23:29.835-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="UnGit" /><title>Is there any science in Amazon pricing?</title><content type="html">I keep a handful of stuff in the "Saved for later" category in my Amazon shopping cart.&amp;nbsp;It is amusing to see that prices of some items constantly keep changing.&lt;br /&gt;
&lt;br /&gt;
Take&amp;nbsp;&lt;a href="http://www.amazon.com/gp/product/B002RWJD84" target="_blank"&gt;these earbuds&lt;/a&gt;,&amp;nbsp;for example.&amp;nbsp;I listen to podcasts while commuting with a pair of earbuds plugged to my phone, and for that purpose audiophile-grade fidelity is not a requirement. Ones from different brands I tried over time, including these, have developed frayed wire just outside the connector plug and died after several months' use. Cheap earbuds are consumables to me, and I keep a couple of unopened spares around, and restock every once in a while.&lt;br /&gt;
&lt;br /&gt;
They used to be around $20, but among several colors, I noticed that one particular color started selling below $10 a few weeks ago. A few days ago it was at $8.26 and then this morning I saw it at $8.06. Another example I saw was that &lt;a href="http://www.amazon.com/gp/product/0880790385" target="_blank"&gt;a deck of cards&lt;/a&gt; that lists at $45 fluctuated both upwards and downwards between around $30 to $45 within just a few weeks. I saw a similar pattern between $140-$160 for a pair of men's shoes within three weeks.&lt;br /&gt;
&lt;br /&gt;
I am guessing one of the reasons why they keep changing the prices is because they want to encourage customers to come back to their shopping cart often. I however wonder how the price fluctuations are computed. Is it random-walk just to make sure that "The prices of items in your cart changed" notice appears often enough, or is there a deep science based on supply-and-demand and consumer psychology involved? Perhaps they are measuring how low they have to go before I move an item out of the "Saved for later" bin to see how bad a cheapskate I am?&lt;br /&gt;
&lt;br /&gt;
I can understand why the price of &lt;a href="http://www.amazon.com/gp/product/B0000633QW" target="_blank"&gt;this DVD&lt;/a&gt; that I kept in the "Saved for later" for the last three years gradually climbed before December 25th and then dropped soon after that day every year. But I do not expect there is much seasonality in demand with earbuds or deck of cards.&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/hXXgI65NG88" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://git-blame.blogspot.com/feeds/2010766686042726893/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=632023420616344756&amp;postID=2010766686042726893&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/2010766686042726893?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/2010766686042726893?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/hXXgI65NG88/is-there-any-science-in-amazon-pricing.html" title="Is there any science in Amazon pricing?" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://git-blame.blogspot.com/2012/12/is-there-any-science-in-amazon-pricing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UCQnozeip7ImA9WhNVEk4.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-1476691401754173014</id><published>2012-12-22T18:54:00.000-08:00</published><updated>2012-12-22T18:54:23.482-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-22T18:54:23.482-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><category scheme="http://www.blogger.com/atom/ns#" term="Announce" /><title>Git 1.8.1-rc3</title><content type="html">I was hoping that we can do the real 1.8.1 release this weekend, and have a slow week or two towards the new year, but I ended up with an extra release candidate. Hopefully this will be the last rc release before the real thing.&lt;br /&gt;
&lt;br /&gt;
A good news is that this delay was not caused by any last minute show-stopper regression. Rather, it was only to improve the quality of the pre-formatted documentation pages that are produced when the release is made. Relative to the previous 1.8.1-rc2, the only changes in the source tarball are documentation updates.&lt;br /&gt;
&lt;br /&gt;
I've updated the AsciiDoc toolchain that is used to produce the pre-formatted documentation pages (&lt;a href="http://code.google.com/p/git-htmldocs/" target="_blank"&gt;git-htmldocs&lt;/a&gt; and &lt;a href="http://code.google.com/p/git-manpages/" target="_blank"&gt;git-manpages&lt;/a&gt;) to a newer version. I was assuming that the distributions all build their own versions of documentation pages with their versions of tools, but apparently some of them cheat and package these pre-formatted pages and give them to their customers. So if you are a developers of such a distribution, you may want to double-check the documentation tarballs for this release candidate.&lt;br /&gt;
&lt;br /&gt;
The final will be tagged sometime around the end of the year or early next year.&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/8oyhppZHS4s" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/1476691401754173014?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/1476691401754173014?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/8oyhppZHS4s/git-181-rc3.html" title="Git 1.8.1-rc3" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><feedburner:origLink>http://git-blame.blogspot.com/2012/12/git-181-rc3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08CQns4fSp7ImA9WhNWEUo.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-8569143020903026465</id><published>2012-12-10T14:50:00.001-08:00</published><updated>2012-12-10T14:51:03.535-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-10T14:51:03.535-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><category scheme="http://www.blogger.com/atom/ns#" term="Announce" /><title>Git 1.8.0.2</title><content type="html">While we advance toward the v1.8.1 release on the 'master' front, fixes to a few bugs have been merged to the maintenance track and v1.8.0.2 has been tagged.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The release tarballs are found at:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;http://code.google.com/p/git-core/downloads/list&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
and their SHA-1 checksums are:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;1e1640794596da40f35194c29a8cc4e41c6b4f6d &amp;nbsp;git-1.8.0.2.tar.gz&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;6b9e14c5b19b2e27605014252febd61a700012a3 &amp;nbsp;git-htmldocs-1.8.0.2.tar.gz&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;ce0673256ce90451269a82a2464eab060adbfec6 &amp;nbsp;git-manpages-1.8.0.2.tar.gz&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Please upgrade.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Fixes since v1.8.0.1&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Various codepaths have workaround for a common misconfiguration to spell "UTF-8" as "utf8", but it was not used uniformly. &amp;nbsp;Most notably, &lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;mailinfo&lt;/span&gt; (which is used by "&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;git am&lt;/span&gt;") lacked this support.&lt;/li&gt;
&lt;li&gt;We failed to mention a file without any content change but whose permission bit was modified, or (worse yet) a new file without any content in the "&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;git diff --stat&lt;/span&gt;" output.&lt;/li&gt;
&lt;li&gt;When "&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;--stat-count&lt;/span&gt;" hides a diffstat for binary contents, the total&amp;nbsp; &amp;nbsp;number of added and removed lines at the bottom was computed incorrectly.&lt;/li&gt;
&lt;li&gt;When "&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;--stat-count&lt;/span&gt;" hides a diffstat for unmerged paths, the total&amp;nbsp; &amp;nbsp;number of affected files at the bottom of the "&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;diff --stat&lt;/span&gt;" output was computed incorrectly.&lt;/li&gt;
&lt;li&gt;"&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;diff --shortstat&lt;/span&gt;" miscounted the total number of affected files when there were unmerged paths.&lt;/li&gt;
&lt;li&gt;"&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;git p4&lt;/span&gt;" used to try expanding malformed "&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;$keyword$&lt;/span&gt;" that spans across multiple lines.&lt;/li&gt;
&lt;li&gt;"&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;git update-ref -d --deref &lt;i&gt;SYM&lt;/i&gt;&lt;/span&gt;" to delete a ref through a symbolic ref that points to it did not remove it correctly.&lt;/li&gt;
&lt;li&gt;Syntax highlighting in "&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;gitweb&lt;/span&gt;" was not quite working.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
Also contains other minor fixes and documentation updates.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/5wQJeEF8uZ8" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/8569143020903026465?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/8569143020903026465?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/5wQJeEF8uZ8/git-1802.html" title="Git 1.8.0.2" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><feedburner:origLink>http://git-blame.blogspot.com/2012/12/git-1802.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEBSH85eCp7ImA9WhNXF04.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-2891078433484750693</id><published>2012-11-26T00:55:00.000-08:00</published><updated>2012-12-05T11:10:59.120-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-05T11:10:59.120-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="UnGit" /><category scheme="http://www.blogger.com/atom/ns#" term="Random Hacking" /><title>Getting an ultrabook</title><content type="html">I've been happily using Dell Inspiron 1420, and it still is a fine laptop to run Linux on, but it started to feel a bit stale, especially with its 1280x800 display. So I got a Vizio CT15-A5.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-23VrsBKOh78/ULGR0mmuPCI/AAAAAAAAPQk/UGCn2m0Sn84/s1600/vizio.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-23VrsBKOh78/ULGR0mmuPCI/AAAAAAAAPQk/UGCn2m0Sn84/s320/vizio.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Its 1920x1080 display was the primary reason I picked this over Lenovo X1 carbon, even though this is also quite larger; in fact, I do not think I would be willing to carry anything larger than this one.&lt;br /&gt;
&lt;br /&gt;
Doesn't the manufacturer's logo look like U1210, as if it is screaming to get Ubuntu 12.10 installed?&lt;br /&gt;
&lt;br /&gt;
Now, even though I am sufficiently old that tweaking machine configuration no longer excites me too much, I am still curious. It came with Windows 8 (without reinstallation medium). So instead of wiping and installing Ubuntu from scratch, I decided to keep the Windows for a while and see how it looks like, and dual-boot the machine.&lt;br /&gt;
&lt;br /&gt;
Of course, before deciding that, I had to make sure that it worked with Ubuntu (which happened to be the distro I have been running on my 1420). Booting from USB key needed a bit of BIOS tweaking (and it came with no manual, so it needed a bit of Googling around to find out that hitting F2 was the way to fall into the bios settings screen while booting).&lt;br /&gt;
&lt;br /&gt;
There are three places in the bios setting that affects the booting:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Secure boot (on/off)&lt;/li&gt;
&lt;li&gt;OS support (Windows/other)&lt;/li&gt;
&lt;li&gt;Boot device (USB key, USB CD, USB HDD, USB floppy, Internal HDD, UEFI Windows Boot Manager)&lt;/li&gt;
&lt;/ul&gt;
After a couple of trial and error sessions, I found out that in order to boot from the USB key, I had to (1) turn off Secure Boot, (2) pick "Other" from OS Support, and (3) have "USB key" early in the boot device order. In fact, it did not allow me to do (2) until I turned off Secure Boot.&lt;br /&gt;
&lt;br /&gt;
It felt funny to boot the "try it out" mode from a USB key, install Chrome browser in that environment, adding a plugin to do video hangout for G+ in it, all without actually touching the internal disk at all. All the usual suspects in Linux portability (touchpad, wifi, webcam, speakers, microphone, etc.) seemed to work fine out of the box.&lt;br /&gt;
&lt;br /&gt;
Booting into the Windows and looking at its disk (Win-R "diskmgmt.msc") reveals that it uses GPT partitioning scheme, with bunch of garbage partitions (300MB Recovery and 260MB ESP at the beginning, 6.8G Recovery and 2G OEM at the end, with all the remaining space allocated for Windows C:). It also seems that booting from the USB key puts it into BIOS (i.e. not UEFI) mode, so it is understandable that Ubuntu installation USB key said that it does not see any bootable operating system on the disk, and there needs a dedicated "bios_grub" partition.&lt;br /&gt;
&lt;br /&gt;
As a smaller configuration of the same ultrabook ships with 128G SDD (I got a 256G version), it should be sufficient to give Windows (and all the other garbage partition) 128G or so. I shrunk C: to 64G, carved out 22G for Linux (root filesystem), 4G swap, and created a 140G "Data" partition to be shared between the dual booted OSes. Also I gave a few megabytes to the bios grub partition.&lt;br /&gt;
&lt;br /&gt;
The configuration ended up a bit strange albeit a workable one. When the firmware is set to boot from the internal HDD, because Ubuntu installation wrote the early stage of grub into the MBR (without corrupting GPT), it boots into Ubuntu. When set to boot with UEFI, it boots into Windows. I am guessing that I could install rEFInd and always boot with UEFI to dual boot from there, but I haven't felt the need for that step yet.&lt;br /&gt;
&lt;br /&gt;
For now, I still have the Windows installation. I can run Putty to ssh into my primary machine, I can run Gimp, LibreOffice and GnuCash locally. I haven't found something I have to boot into Ubuntu side of the system to do, so I might end up keeping the Windows side much longer than I was originally planning to.&amp;nbsp;&amp;nbsp;Besides, I'm tentatively enrolled in Amazon's Prime program, and their Prime instant video does not play on Chrome/Linux, so...&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/NR6QpHV3RjA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://git-blame.blogspot.com/feeds/2891078433484750693/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=632023420616344756&amp;postID=2891078433484750693&amp;isPopup=true" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/2891078433484750693?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/2891078433484750693?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/NR6QpHV3RjA/getting-ultrabook.html" title="Getting an ultrabook" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-23VrsBKOh78/ULGR0mmuPCI/AAAAAAAAPQk/UGCn2m0Sn84/s72-c/vizio.png" height="72" width="72" /><thr:total>7</thr:total><feedburner:origLink>http://git-blame.blogspot.com/2012/11/getting-ultrabook.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IASXg6eyp7ImA9WhNQGUw.&quot;"><id>tag:blogger.com,1999:blog-632023420616344756.post-5775535478979155783</id><published>2012-11-26T00:45:00.000-08:00</published><updated>2012-11-26T00:45:48.613-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-11-26T00:45:48.613-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><category scheme="http://www.blogger.com/atom/ns#" term="Announce" /><title>Git 1.8.0.1</title><content type="html">As I took a vacation for a few weeks after tagging Git 1.8.0 and needed about a week to sift through the backlog (although having an interim maintainer greatly helped in keeping track of topics in flight in the meantime), we have accumulated quite a few fixes since the major release on the 'master' front. These fixes have been merged to the 'maint' branch and there is the first maintenance release Git 1.8.0.1 now.&lt;br /&gt;
&lt;br /&gt;
Please see the &lt;a href="http://article.gmane.org/gmane.linux.kernel/1400268" target="_blank"&gt;Announcement&lt;/a&gt; for details.&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/GitBlame/~4/zobZWMxpgUI" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/5775535478979155783?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/632023420616344756/posts/default/5775535478979155783?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GitBlame/~3/zobZWMxpgUI/git-1801.html" title="Git 1.8.0.1" /><author><name>Junio C Hamano</name><uri>https://plus.google.com/108182106411180467879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGp5tdl77t8/AAAAAAAAAAI/AAAAAAAAGC4/UtP5rGKfnyQ/s512-c/photo.jpg" /></author><feedburner:origLink>http://git-blame.blogspot.com/2012/11/git-1801.html</feedburner:origLink></entry></feed>
