From: Jeff King <peff@peff.net>
To: "Дилян Палаузов" <dilyan.palauzov@aegee.org>
Cc: Bagas Sanjaya <bagasdotme@gmail.com>, git@vger.kernel.org
Subject: Re: git diff --text does not work during rebase for binary files
Date: Fri, 26 Mar 2021 07:31:26 -0400 [thread overview]
Message-ID: <YF3GDgYSo889TaRJ@coredump.intra.peff.net> (raw)
In-Reply-To: <3807b29f442ab7026418511f058ff9513ee200ec.camel@aegee.org>
On Mon, Mar 22, 2021 at 10:45:39AM +0200, Дилян Палаузов wrote:
> And now `git diff` and `git diff --text` both print:
>
> diff --cc a.txt
> index ee95164,d7db2f0..0000000
> Binary files differ
I think the "combined diff" code isn't ready to handle the "--text"
flag.
An easier reproduction than rebase is to just do a merge with a
conflict:
git init
printf 'base\0' >file && git add file && git commit -m base
printf 'one\0' >file && git commit -am one
git checkout -b side HEAD^
printf 'two\0' >file && git commit -am two
git merge master
Now "git diff --text" will try to show a combined diff, but it doesn't
work. Likewise if you complete the merge:
printf 'new\0' >file && git commit -a --no-edit
then "git show --text" will not show a binary combined diff, even though
"git show --text HEAD^" will happily show a normal two-endpoint diff.
Curiously old versions of Git would show broken binary combined diffs,
until 4d5f347199 (combine-diff: handle binary files as binary,
2011-05-23). So the binary detection there looks mostly sane, but it's
just not respecting the "--text" flag.
Something like this helps a bit:
diff --git a/combine-diff.c b/combine-diff.c
index 06635f91bc..940c5c43ff 100644
--- a/combine-diff.c
+++ b/combine-diff.c
@@ -1128,6 +1128,8 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
if (textconv)
is_binary = 0;
+ else if (opt->flags.text)
+ is_binary = 0;
else if (userdiff->binary != -1)
is_binary = userdiff->binary;
else {
but I don't think that's the full story. It looks like the combined-diff
code is too eager to treat the content as NUL-terminated strings. A
regular diff shows the NULs:
$ git show --format= --text HEAD^ | cat -A
diff --git a/file b/file$
index d249428..a9382c3 100644$
--- a/file$
+++ b/file$
@@ -1 +1 @@$
-base^@$
\ No newline at end of file$
+two^@$
\ No newline at end of file$
but the combined diff doesn't:
$ git show --format= --text HEAD | cat -A
diff --cc file$
index a9382c3,f33a432..c984a04$
--- a/file$
+++ b/file$
@@@ -1,1 -1,1 +1,1 @@@$
- two$
-one$
++new$
So I suspect the code is simply not read to handle the NULs, and the
current behavior of ignoring --text is better than producing truncated
or bogus output until those deeper problems are fixed. We could issue a
warning that --text was ignored, I suppose, but that doesn't really
solve your problem. :)
-Peff
prev parent reply other threads:[~2021-03-26 11:32 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-21 17:30 git diff --text does not work during rebase for binary files Дилян Палаузов
2021-03-22 5:53 ` Bagas Sanjaya
2021-03-22 8:45 ` Дилян Палаузов
2021-03-26 11:31 ` Jeff King [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YF3GDgYSo889TaRJ@coredump.intra.peff.net \
--to=peff@peff.net \
--cc=bagasdotme@gmail.com \
--cc=dilyan.palauzov@aegee.org \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox