git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Git merge conflicts and encoding of logs

From
Junio C Hamano <gitster@pobox.com>
Date
Dec 23, 2008, 08:22 UTC
Message-ID
<7vprjjfgi7.fsf@gitster.siamese.dyndns.org>
In-Reply-To
<87lju7h4yb.dancerj%dancer@netfort.gr.jp>
Junichi Uekawa <dancer@netfort.gr.jp> writes:
Show 12 quoted lines
> Git merge conflict will insert '<<< first line of commit log message'
> '===' '>>>' markers to the text file that is causing a conflict.
>
> Unfortunately, the encoding of the text file may be different from the
> log message encoding, and that results in a file which has a mixed
> encoding (which is pretty hard to edit from any editor BTW).
>
> My use case is editing platex files (iso-2022-jp encoded) with log
> messages of utf-8.
>
> ... Thinking about it, it's probably the same encoding problem as git
> blame.

What 69cd8f6 (builtin-blame: Reencode commit messages according to git-log rules., 2008-10-22) does to git-blame is to re-encode the data taken from the commit log to i18n.logoutputencoding, and put that in the datastream.

If your commit object have names and messages in utf-8, and if you set i18n.logoutputencoding to iso-2022-jp, that would reencode data taken from the commit object in iso-2022-jp and sprinkle them in the blame datastream.

The issue would be certainly similar, *if* anything on your <<</===/>>> lines came from commit log message, but I couldn't trigger what you describe. I prepared a history of this shape:

   B
  /
 o---A
with ISO-2022-JP payload and UTF-8 commit log message.  Then, I added:
        [i18n]
                logoutputencoding = iso-2022-jp

which lets me read "git log -p --all" quite comfortably. Everything comes out as good old JISX0208. So far, so good.

Then while on branch B, I tried to merge A, which resulted in conflicts that looked like this:

<<<<<<< HEAD:foo これはサイドブランチの変更です。 やはり JIS コードで書いてます。 ======= 日本語のファイルです。 JIS コードで書いてます。

>>>>>>> master:foo

The above will probably come out as UTF-8 in this mail text, but the point is that the confict side markers do not have anything but filename and the branch name. I am still scratching my head trying to see where in the merge-recursive codepath you got snippet of log message.

A bundle from my test repository is attached.  You can use it to reproduce
the repository like this:
 
    $ cd /var/tmp && mkdir test && cd test && git init
    $ git pull ../x.bndl master
    $ git fetch ../x.bndl side:side
Previous: Junichi UekawaNext: Johannes Sixt
Message 2 of 5 in “Git merge conflicts and encoding of logs”
  1. Junichi UekawaDec 23, 2008
  2. Junio C HamanoDec 23, 2008
  3. Johannes SixtDec 23, 2008
  4. Junio C HamanoDec 23, 2008
  5. Junichi UekawaDec 23, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.