git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
* git diff --text does not work during rebase for binary files
@ 2021-03-21 17:30 Дилян Палаузов
  2021-03-22  5:53 ` Bagas Sanjaya
  0 siblings, 1 reply; 4+ messages in thread
From: Дилян Палаузов @ 2021-03-21 17:30 UTC (permalink / raw)
  To: git

Hello,

I create a small text file ending with \0 and add it to git:

In .gitattributes I specify:

*.txt diff merge=text text

I create several commits by changing the small text file.

The result is at https://github.com/dilyanpalauzov/git-diff-biinary .

I do now

  git rebase -i HEAD~2
and before the “second commit” type E to edit that commit.

I change the small file.

git add a.txt && git rebase --continue

git says:

[detached HEAD bc00e34] second commit
 Date: Sun Mar 21 19:16:15 2021 +0200
 1 file changed, 2 insertions(+), 1 deletion(-)
warning: Cannot merge binary files: a.txt (HEAD vs. 04c77de (third
commit))
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
error: could not apply 04c77de... third commit
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase
--abort".
Could not apply 04c77de... third commit


'git diff' and 'git diff --text' show:

diff --cc a.txt
index 7a61015,dc817ec..0000000
--- a/a.txt
+++ b/a.txt

The file does not contain <<HEAD===>>> markers, despite having
merge=text attribute.

HOW CAN I force git diff to show the differences and git merge to
include the <<<===>>> markers?

I have to say, that at different occassions git diff --text does work
ass expected (e.g. when I call git diff --cached --text).

I call now 
git rebase --abort
git log -p

git shows the differences in the small text file ending with \0.  So
apparently log reads the option, but diff does not.

Using git 2.30.2.

Greetings
  Дилян


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: git diff --text does not work during rebase for binary files
  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   ` Дилян Палаузов
  0 siblings, 1 reply; 4+ messages in thread
From: Bagas Sanjaya @ 2021-03-22  5:53 UTC (permalink / raw)
  To: Дилян Палаузов
  Cc: git



On 22/03/21 00.30, Дилян Палаузов wrote:
> Hello,
> 
> I create a small text file ending with \0 and add it to git:

Did you mean `echo -e "\0" >> a.txt`?

> In .gitattributes I specify:
> 
> *.txt diff merge=text text
> 
> I create several commits by changing the small text file.
> 
> The result is at https://github.com/dilyanpalauzov/git-diff-biinary .
> 
> I do now
> 
>    git rebase -i HEAD~2
> and before the “second commit” type E to edit that commit.
> 
> I change the small file.
> 
> git add a.txt && git rebase --continue
> 
> git says:
> 
> [detached HEAD bc00e34] second commit
>   Date: Sun Mar 21 19:16:15 2021 +0200
>   1 file changed, 2 insertions(+), 1 deletion(-)
> warning: Cannot merge binary files: a.txt (HEAD vs. 04c77de (third
> commit))
> Auto-merging a.txt
> CONFLICT (content): Merge conflict in a.txt
> error: could not apply 04c77de... third commit
> Resolve all conflicts manually, mark them as resolved with
> "git add/rm <conflicted_files>", then run "git rebase --continue".
> You can instead skip this commit: run "git rebase --skip".
> To abort and get back to the state before "git rebase", run "git rebase
> --abort".
> Could not apply 04c77de... third commit
> 
> 
> 'git diff' and 'git diff --text' show:
> 
> diff --cc a.txt
> index 7a61015,dc817ec..0000000
> --- a/a.txt
> +++ b/a.txt
> 
> The file does not contain <<HEAD===>>> markers, despite having
> merge=text attribute.
> 
> HOW CAN I force git diff to show the differences and git merge to
> include the <<<===>>> markers?
> 
> I have to say, that at different occassions git diff --text does work
> ass expected (e.g. when I call git diff --cached --text).
> 
> I call now
> git rebase --abort
> git log -p
> 
> git shows the differences in the small text file ending with \0.  So
> apparently log reads the option, but diff does not.
> 
> Using git 2.30.2.
> 
> Greetings
>    Дилян
> 

Does `file a.txt` shows it as being binary file? I do the similar and it just says "data".

-- 
An old man doll... just what I always wanted! - Clara

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: 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
  0 siblings, 1 reply; 4+ messages in thread
From: Дилян Палаузов @ 2021-03-22  8:45 UTC (permalink / raw)
  To: Bagas Sanjaya; +Cc: git

Hello,

I mean:

git init
echo -e "AB RA\nCADABRA\0" > a.txt && git add a.txt && git commit -
m"Initial"
echo -e "AB2RA\nCADABRA\0" > a.txt && git add a.txt && git commit -
m"Second"
echo -e "AB3RA\nCADABRA\0" > a.txt && git add a.txt && git commit -
m"Third"

git log -pa   show the diffs and handles the file as text.

git rebase -i HEAD~2

I EDIT the “Second” commit (the one before “Third”, not the second in
the editor).


master|REBASE 1/2$ echo -e "AB4RA\nCADABRA\0" > a.txt && git add a.txt
&& git rebase --continue	

[detached HEAD 78408d2] Second
 Date: Mon Mar 22 10:35:57 2021 +0200
 1 file changed, 0 insertions(+), 0 deletions(-)
warning: Cannot merge binary files: a.txt (HEAD vs. 149b67e (Third))
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
error: could not apply 149b67e... Third
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase
--abort".
Could not apply 149b67e... Third
master|REBASE 2/2$

And now `git diff` and `git diff --text` both print:

diff --cc a.txt
index ee95164,d7db2f0..0000000
Binary files differ


But git diff --text should show how the files differ.

Greetings
  Дилян

On Mon, 2021-03-22 at 12:53 +0700, Bagas Sanjaya wrote:
> 
> 
> On 22/03/21 00.30, Дилян Палаузов wrote:
> > Hello,
> > 
> > I create a small text file ending with \0 and add it to git:
> 
> Did you mean `echo -e "\0" >> a.txt`?
> 
> > In .gitattributes I specify:
> > 
> > *.txt diff merge=text text
> > 
> > I create several commits by changing the small text file.
> > 
> > The result is at https://github.com/dilyanpalauzov/git-diff-biinary .
> > 
> > I do now
> > 
> >    git rebase -i HEAD~2
> > and before the “second commit” type E to edit that commit.
> > 
> > I change the small file.
> > 
> > git add a.txt && git rebase --continue
> > 
> > git says:
> > 
> > [detached HEAD bc00e34] second commit
> >   Date: Sun Mar 21 19:16:15 2021 +0200
> >   1 file changed, 2 insertions(+), 1 deletion(-)
> > warning: Cannot merge binary files: a.txt (HEAD vs. 04c77de (third
> > commit))
> > Auto-merging a.txt
> > CONFLICT (content): Merge conflict in a.txt
> > error: could not apply 04c77de... third commit
> > Resolve all conflicts manually, mark them as resolved with
> > "git add/rm <conflicted_files>", then run "git rebase --continue".
> > You can instead skip this commit: run "git rebase --skip".
> > To abort and get back to the state before "git rebase", run "git
> > rebase
> > --abort".
> > Could not apply 04c77de... third commit
> > 
> > 
> > 'git diff' and 'git diff --text' show:
> > 
> > diff --cc a.txt
> > index 7a61015,dc817ec..0000000
> > --- a/a.txt
> > +++ b/a.txt
> > 
> > The file does not contain <<HEAD===>>> markers, despite having
> > merge=text attribute.
> > 
> > HOW CAN I force git diff to show the differences and git merge to
> > include the <<<===>>> markers?
> > 
> > I have to say, that at different occassions git diff --text does work
> > ass expected (e.g. when I call git diff --cached --text).
> > 
> > I call now
> > git rebase --abort
> > git log -p
> > 
> > git shows the differences in the small text file ending with \0.  So
> > apparently log reads the option, but diff does not.
> > 
> > Using git 2.30.2.
> > 
> > Greetings
> >    Дилян
> > 
> 
> Does `file a.txt` shows it as being binary file? I do the similar and
> it just says "data".
> 



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: git diff --text does not work during rebase for binary files
  2021-03-22  8:45   ` Дилян Палаузов
@ 2021-03-26 11:31     ` Jeff King
  0 siblings, 0 replies; 4+ messages in thread
From: Jeff King @ 2021-03-26 11:31 UTC (permalink / raw)
  To: Дилян Палаузов
  Cc: Bagas Sanjaya, git

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

^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-03-26 11:32 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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

Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).