Git Rev News: Edition 5 (July 8th, 2015)

Welcome to the fifth edition of Git Rev News, a digest of all things Git. For our goals, the archives, the way we work, and how to contribute or to subscribe, see the Git Rev News page on git.github.io.

This edition covers what happened during the month of June 2015.

Discussions

General

As part of a school project, Antoine DELAITE, Remi GALAN ALFONSO, Remi LESPINET, Guillaume PAGES and Louis-Alexandre STUBER, from Ensimag, contributed to Git. As a warm-up, they implemented a am.threeWay configuration variable to have git am use -3 by default (will be in Git 2.5). Some patch series are being polished to allow git bisect to use an arbitrary pair of terms instead of good and bad, an improved management of list of addresses and aliases in the --to, --cc and --bcc options of git send-email, a more verbose output for git status when ran during a rebase -i session, and a safety feature for git rebase to avoid dropping lines by mistake in the todo-list.

Both of the Git project Google Summer of Code students, Paul Tan and Karthik Nayak have passed the midterm evaluation and are doing well. Karthik is working on unifying the implementations of git branch -l, git tag -l, and git for-each-ref and Paul is working on porting git-pull from shell to C and on porting git-am from shell to C too.

Reviews

The linked-worktree facility allows multiple working directories to share a single repository, with (typically) a different branch checked out in each worktree. Introduced more than half a year ago to provide integrated and platform-agnostic support for similar functionality long supplied by the Unix-only and somewhat fragile contrib/git-new-workdir script, linked-worktrees recently migrated to the master branch, but is not yet part of any release.

As originally implemented, creation of linked-worktrees was accomplished via git checkout --to <path> <branch>, and cleanup of leftover administrative files after manual deletion of <path> was done with git prune --worktrees. However, a recent unrelated change to git prune led to a discussion that concluded that worktree-related maintenance functionality didn’t belong in git prune.

Consequently, Nguyễn Thái Ngọc Duy submitted a patch which introduces a new git worktree command, and relocates git prune --worktrees functionality to git worktree prune.

Eric Sunshine then further fleshed out git worktree with a patch which relocates git checkout --to functionality to git worktree new. A lengthy discussion ensued, which eventually led to a second version, consisting of 23 patches, and which names the command git worktree add, rather than git worktree new, and gives the documentation some needed attention.

Aside from documentation updates, several other user-visible changes arrive with the second version. For instance, while preparing worktree-creation functionality for the move from git checkout to git worktree, Eric discovered and fixed a bug where git checkout --to <path> HEAD~1 would instead incorrectly checkout HEAD~2 at <path>.

The second version also introduces convenience enhancements. In particular, the <branch> in git worktree add <path> <branch>, is now optional. When omitted, a new branch is created automatically based upon <path>, as if -b $(basename <path>) had been provided (where -b <new-branch> creates a new branch). For example, given git worktree add ../hotfix, a new branch named hotfix is created and checked out into new worktree ../hotfix, as if git worktree -b hotfix ../hotfix HEAD had been specified.

Finally, the question was raised whether git checkout --ignore-other-worktrees should be retired and git checkout --force overloaded to subsume its duties, however, Junio was not thrilled by the idea.

Max Kirillov proposed a patch to warn when a conversion from a character set to another character set could not happen because iconv has not been compiled into Git.

Iconv is one of the few C libraries that people can compile either in or out of Git. Most of the time though they choose to compile it in, because it makes it possible to convert text, like commit messages, between character sets, as long, of course, as the requested character sets are installed on the system.

For example when one uses git-am to create a commit from a patch sent in an email, git-mailinfo is called to extract from the email the information needed to create the commit. When doing that git-mailinfo also by default tries to use iconv to convert the commit message, the author name and the author email from the email encoding to UTF-8.

Junio Hamano, the Git maintainer, replied to Max’s patch with:

I actually am OK if the user gets exactly the same warning between the two cases:

  • iconv failed to convert in the real reencode_string_len()

  • we compiled out iconv() and real conversion was asked.

and this patch is about the latter; I do not think it is reasonable to give noise only for the latter but not for the former.

and later Junio explained:

After all, if you had to convert between UTF-8 and ISO-2022-JP, the latter of which your system does not support, whether you use iconv-disabled build of Git or iconv-enabled build of Git, we pass the bytestream through, right? Your patch gives warning for the former (which is a good starting point if we want to warn “user expected them to be converted, we didn’t” case) but does not do anything to the latter, even though users of the iconv-disabled build is more likely to be aware of the potential issue (and are likely to be willing to accept that) than the ones with iconv-enabled build that runs on a system that cannot convert the specific encoding.

Hopefully Max will send an updated patch that will take Junio’s suggestion into account.

Support

Eric Raible reported the following:

Upon returning from a vacation, I was looking at what people had been up to, and discovered on merge in which a colleague had resolved a merge incorrectly. It turns out that he has pushed many merges over the past year which had conflicts in my code, and now I don’t trust any of them.

So naturally I want to check each of them for correctness.

I know about “git log -p -cc SHA – path”, but it really doesn’t show just the conflicts so there’s just too much noise in that output.

I use kdiff3 to resolve conflicts, so I’m looking for a way to visualize these already-resolved conflicts with that tool.

Johannes Schindelin, aka Dscho, suggested the following shell script to recreate the merge conflicts and then compare the resulting commit with the existing one:

mergecommit=$1

# probably should verify that the working directory is clean, yadda yadda

# recreate merge conflicts on an unnamed branch (Git speak: detached HEAD)
git checkout $mergecommit^
git merge $mergecommit^2 ||
die "This merge did not have any problem!"

# compare to the actual resolution as per the merge commit
git diff $mergecommit

Michael J Gruber replied to Dscho that, as we often get this type of request, it might be a good idea to better support the above.

Junio Hamano then pointed to a patch series from last September by Thomas Rast that implements a new --remerge-diff option for git log to show what a conflict resolution changed. Unfortunately, though the feature looks promising at least to Michael, it looks like some more work is needed to properly integrate this feature into Git.

Dscho, when he originally replied to Eric, also suggested the following command to list all the merge commits created by one colleague in the current branch:

git rev-list --author="My Colleague" --parents HEAD |
sed -n 's/ .* .*//p'

And Michael noticed that using the --merges option would be better than using sed to filter the merge commits. Something like the following could do it:

git rev-list --author="My Colleague" --parents --merges HEAD

Right now git log supports the following date related options:

--date-order

--author-date-order

--date=(relative|local|default|iso|iso-strict|rfc|short|raw)

But H.Merijn Brand noticed two problems with those options.

First he found that dates shown by git log --date=local do not respect the LC_TIME locale configuration.

Jeff King, aka Peff, replied:

Right, we use our own routines for formatting the dates, and not strftime. And it probably should stay that way in general, as git’s output is often meant to be parsed.

That being said, I do not think it would be wrong to have a date-mode that just showed strftime(“%c”), or some other arbitrary strftime string. You could then set log.date as appropriate for human consumption.

To that H.Merijn suggested the implementation of the following options --date=lc, --date=lc_time and --date=locale.

The second issue H.Merijn reported was that git log with either --date-order or --author-date-order does not order the commit by date.

To that Peff replied:

Correct. The documentation says:

–date-order Show no parents before all of its children are shown, but otherwise show commits in the commit timestamp order.

[…]

There is not a simple way to show commits in arbitrary order without respect to parentage. I think you’d have to do something like:

git log –format=’%at %H’ | sort -rn | cut -d’ ‘ -f2 | git log –stdin –no-walk

And H.Merijn said that the option names are misleading, and suggested a gitk option for Peff’s script.

It looks like no gitk option has been developed yet for the above, but Peff sent a patch series to implement --date=format:... which can produce the same output as the --date=... options H.Merijn suggested about his first issue.

As Peff’s patch series uses strftime() to process the format passed in --date=format:..., a discussion about how to manage a potential strftime() failure when it is passed a bogus format ensued.

Releases

Other News

Various

Light reading

Git tools and sites

Credits

This edition of Git Rev News was curated by Christian Couder <christian.couder@gmail.com>, Thomas Ferris Nicolaisen <tfnico@gmail.com> and Nicola Paolucci <npaolucci@atlassian.com>, with help from Eric Sunshine <sunshine@sunshineco.com>, Junio C Hamano, Matthieu Moy and Johannes Schindelin.