Re: Git merge conflicts and encoding of logs
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-jpwhich 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