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

Re: git-archive and core.eol

From
Erik Faye-Lund <kusmabite@gmail.com>
Date
Jan 8, 2011, 17:28 UTC
Message-ID
<AANLkTi==eqwrwq-P6czDvOH5GDEi6WgvRUuZ2dMoiK7e@mail.gmail.com>
In-Reply-To
<4D28683B.4020400@lsrfire.ath.cx>

On Sat, Jan 8, 2011 at 2:35 PM, René Scharfe <rene.scharfe@lsrfire.ath.cx> wrote:

Show 71 quoted lines
> Am 15.12.2010 23:32, schrieb Erik Faye-Lund:
>> I recently tried the following on Windows:
>>
>> $ git init
>> Initialized empty Git repository in c:/Users/kusma/test/.git/
>> $ echo "foo
>> bar" > test.txt
>> $ git -c core.autocrlf=true add test.txt
>> warning: LF will be replaced by CRLF in test.txt.
>> The file will have its original line endings in your working directory.
>> $ git commit -m.
>>  1 files changed, 2 insertions(+), 0 deletions(-)
>>  create mode 100644 test.txt
>> $ git -c core.autocrlf=true -c core.eol=lf archive --format=tar HEAD > test.tar
>> $ tar xvf test.tar
>> $ od -c test.txt
>> 0000000   f   o   o  \r  \n   b   a   r  \r  \n
>> 0000012
>>
>> Just to be sure, I checked this:
>>
>> $ git show HEAD:test.txt | od -c
>> 0000000   f   o   o  \n   b   a   r  \n
>> 0000010
>>
>> Yep, the file has LF in the repo, as expected... the warning from
>> git-add is a bit confusing, but OK.
>>
>> Hmm, so git-archive writes CRLF even if I said I wanted LF. But then I
>> tried this on Linux:
>>
>> $ git init
>> Initialized empty Git repository in /home/kusma/src/test/.git/
>> $ echo "foo
>> bar" > test.txt
>> $ git add test.txt
>> $ git commit -m.
>> [master (root-commit) c6f195e] .
>>  1 files changed, 2 insertions(+), 0 deletions(-)
>>  create mode 100644 test.txt
>> $ git -c core.autocrlf=true -c core.eol=crlf archive --format=tar HEAD
>>> test.tar
>> $ tar xvf test.tar
>> test.txt
>> $ od -c test.txt
>> 0000000   f   o   o  \r  \n   b   a   r  \r  \n
>> 0000012
>>
>> This leaves me a bit puzzled. On Linux, I can override the default
>> new-line style CRLF for git-archive, but I can't override it to LF on
>> Windows?
>>
>> I expected it to work because sha1_file_to_archive calls
>> convert_to_working_tree. I've tried stepping through the code, but I
>> don't quite understand where it goes wrong. Or even how the code is
>> supposed to work :P
>>
>> Does anyone have any clue what's going on? I'm running with the
>> current master, git version 1.7.3.3.585.g74f6e.
>
> I can't seem to replicate this (1.7.4-rc1); see below for the test script
> I tried to come up with.  It should test all combinations of the relevant
> config variables and the text attribute.  I cheated by simply setting the
> expectations to match the results on Linux; I didn't check if these are
> indeed the correct results.  The test passes for me on MinGW, too, though.
>
> Did I miss a variable or are some of the expectations wrong?
>
> Thanks,
> René
>

Really? I haven't looked through what the test actually does (I'm out sick right now, and don't have many working brain-cells), but every single test fails for me:

not ok - 1 setup # # printf "1\\n2\\n" >lf && # printf "1\\r\\n2\\r\\n" >crlf && # # echo "*.txt text" >.gitattributes && # git add .gitattributes && # # mkdir autocrlf_false && # cp lf crlf autocrlf_false/ && # cp lf autocrlf_false/lf.txt && # cp crlf autocrlf_false/crlf.txt && # git -c core.autocrlf=false add autocrlf_false/ && # # mkdir autocrlf_true && # cp lf crlf autocrlf_true/ && # cp lf autocrlf_true/lf.txt && # cp crlf autocrlf_true/crlf.txt && # git -c core.autocrlf=true add autocrlf_true/ && # # git commit -m. # not ok - 2 archive with autocrlf=false eol=crlf # # git -c core.autocrlf=false -c core.eol=crlf archive HEAD

>autocrlf_false-eol_crlf.tar &&

# (mkdir autocrlf_false-eol_crlf.d && cd autocrlf_false-eol_crlf.d && "tar" xf -) <autocrlf_false-eol_crlf.tar # not ok - 3 archive with autocrlf=true eol=crlf # # git -c core.autocrlf=true -c core.eol=crlf archive HEAD

>autocrlf_true-eol_crlf.tar &&

# (mkdir autocrlf_true-eol_crlf.d && cd autocrlf_true-eol_crlf.d && "tar" xf -) <autocrlf_true-eol_crlf.tar # not ok - 4 archive with autocrlf=false eol=lf # # git -c core.autocrlf=false -c core.eol=lf archive HEAD

>autocrlf_false-eol_lf.tar &&

# (mkdir autocrlf_false-eol_lf.d && cd autocrlf_false-eol_lf.d && "tar" xf -) <autocrlf_false-eol_lf.tar # not ok - 5 archive with autocrlf=true eol=lf # # git -c core.autocrlf=true -c core.eol=lf archive HEAD

>autocrlf_true-eol_lf.tar &&

# (mkdir autocrlf_true-eol_lf.d && cd autocrlf_true-eol_lf.d && "tar" xf -) <autocrlf_true-eol_lf.tar # not ok - 6 add autocrlf=false, archive autocrlf=false eol=crlf: crlf => crlf # test_cmp crlf autocrlf_false-eol_crlf.d/autocrlf_false/crlf not ok - 7 add autocrlf=false, archive autocrlf=false eol=crlf: lf => lf # test_cmp lf autocrlf_false-eol_crlf.d/autocrlf_false/lf not ok - 8 add autocrlf=false, archive autocrlf=false eol=lf: crlf => crlf # test_cmp crlf autocrlf_false-eol_lf.d/autocrlf_false/crlf not ok - 9 add autocrlf=false, archive autocrlf=false eol=lf: lf => lf # test_cmp lf autocrlf_false-eol_lf.d/autocrlf_false/lf not ok - 10 add autocrlf=false, archive autocrlf=true eol=crlf: crlf => crlf # test_cmp crlf autocrlf_true-eol_crlf.d/autocrlf_false/crlf not ok - 11 add autocrlf=false, archive autocrlf=true eol=crlf: lf => crlf # test_cmp crlf autocrlf_true-eol_crlf.d/autocrlf_false/lf not ok - 12 add autocrlf=false, archive autocrlf=true eol=lf: crlf => crlf # test_cmp crlf autocrlf_true-eol_lf.d/autocrlf_false/crlf not ok - 13 add autocrlf=false, archive autocrlf=true eol=lf: lf => crlf # test_cmp crlf autocrlf_true-eol_lf.d/autocrlf_false/lf not ok - 14 add autocrlf=true, archive autocrlf=false eol=crlf: crlf => lf # test_cmp lf autocrlf_false-eol_crlf.d/autocrlf_true/crlf not ok - 15 add autocrlf=true, archive autocrlf=false eol=crlf: lf => lf # test_cmp lf autocrlf_false-eol_crlf.d/autocrlf_true/lf not ok - 16 add autocrlf=true, archive autocrlf=false eol=lf: crlf => lf # test_cmp lf autocrlf_false-eol_lf.d/autocrlf_true/crlf not ok - 17 add autocrlf=true, archive autocrlf=false eol=lf: lf => lf # test_cmp lf autocrlf_false-eol_lf.d/autocrlf_true/lf not ok - 18 add autocrlf=true, archive autocrlf=true eol=crlf: crlf => crlf # test_cmp crlf autocrlf_true-eol_crlf.d/autocrlf_true/crlf not ok - 19 add autocrlf=true, archive autocrlf=true eol=crlf: lf => crlf # test_cmp crlf autocrlf_true-eol_crlf.d/autocrlf_true/lf not ok - 20 add autocrlf=true, archive autocrlf=true eol=lf: crlf => crlf # test_cmp crlf autocrlf_true-eol_lf.d/autocrlf_true/crlf not ok - 21 add autocrlf=true, archive autocrlf=true eol=lf: lf => crlf # test_cmp crlf autocrlf_true-eol_lf.d/autocrlf_true/lf not ok - 22 add autocrlf=false, archive autocrlf=false eol=crlf: crlf.txt => crlf # test_cmp crlf autocrlf_false-eol_crlf.d/autocrlf_false/crlf.txt not ok - 23 add autocrlf=false, archive autocrlf=false eol=crlf: lf.txt => crlf # test_cmp crlf autocrlf_false-eol_crlf.d/autocrlf_false/lf.txt not ok - 24 add autocrlf=false, archive autocrlf=false eol=lf: crlf.txt => lf # test_cmp lf autocrlf_false-eol_lf.d/autocrlf_false/crlf.txt not ok - 25 add autocrlf=false, archive autocrlf=false eol=lf: lf.txt => lf # test_cmp lf autocrlf_false-eol_lf.d/autocrlf_false/lf.txt not ok - 26 add autocrlf=false, archive autocrlf=true eol=crlf: crlf.txt => crlf # test_cmp crlf autocrlf_true-eol_crlf.d/autocrlf_false/crlf.txt not ok - 27 add autocrlf=false, archive autocrlf=true eol=crlf: lf.txt => crlf # test_cmp crlf autocrlf_true-eol_crlf.d/autocrlf_false/lf.txt not ok - 28 add autocrlf=false, archive autocrlf=true eol=lf: crlf.txt => crlf # test_cmp crlf autocrlf_true-eol_lf.d/autocrlf_false/crlf.txt not ok - 29 add autocrlf=false, archive autocrlf=true eol=lf: lf.txt => crlf # test_cmp crlf autocrlf_true-eol_lf.d/autocrlf_false/lf.txt not ok - 30 add autocrlf=true, archive autocrlf=false eol=crlf: crlf.txt => crlf # test_cmp crlf autocrlf_false-eol_crlf.d/autocrlf_true/crlf.txt not ok - 31 add autocrlf=true, archive autocrlf=false eol=crlf: lf.txt => crlf # test_cmp crlf autocrlf_false-eol_crlf.d/autocrlf_true/lf.txt not ok - 32 add autocrlf=true, archive autocrlf=false eol=lf: crlf.txt => lf # test_cmp lf autocrlf_false-eol_lf.d/autocrlf_true/crlf.txt not ok - 33 add autocrlf=true, archive autocrlf=false eol=lf: lf.txt => lf # test_cmp lf autocrlf_false-eol_lf.d/autocrlf_true/lf.txt not ok - 34 add autocrlf=true, archive autocrlf=true eol=crlf: crlf.txt => crlf # test_cmp crlf autocrlf_true-eol_crlf.d/autocrlf_true/crlf.txt not ok - 35 add autocrlf=true, archive autocrlf=true eol=crlf: lf.txt => crlf # test_cmp crlf autocrlf_true-eol_crlf.d/autocrlf_true/lf.txt not ok - 36 add autocrlf=true, archive autocrlf=true eol=lf: crlf.txt => crlf # test_cmp crlf autocrlf_true-eol_lf.d/autocrlf_true/crlf.txt not ok - 37 add autocrlf=true, archive autocrlf=true eol=lf: lf.txt => crlf # test_cmp crlf autocrlf_true-eol_lf.d/autocrlf_true/lf.txt # failed 37 among 37 test(s) 1..37

$ git --version git version 1.7.4.rc1.3196.gfd693

(This is the current 'devel'-branch from git://repo.or.cz/git/mingw/4msysgit.git)

Previous: René ScharfeNext: René Scharfe
Message 3 of 7 in “git-archive and core.eol”
  1. Erik Faye-LundDec 15, 2010
  2. René ScharfeJan 8, 2011
  3. Erik Faye-LundJan 8, 2011
  4. René ScharfeJan 9, 2011
  5. Erik Faye-LundJan 10, 2011
  6. Erik Faye-LundJan 10, 2011
  7. René ScharfeJan 11, 2011

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.