Thread (20 messages) 20 messages, 5 authors, 2019-06-04

Re: git archive generates tar with malformed pax extended attribute

From: Ævar Arnfjörð Bjarmason <hidden>
Date: 2019-05-25 20:46:22

On Fri, May 24 2019, Jeff King wrote:
On Fri, May 24, 2019 at 08:45:23AM +0200, Keegan Carruthers-Smith wrote:
quoted
git archive can generate a malformed tar archive. bsdtar reports the
error "tar: Ignoring malformed pax extended attribute" when reading
the archive. Go's "tar/archive" package also reports the error
"archive/tar: invalid tar header". However, BusyBox's tar does not
report the error (unsure if it just has less error logging).

I can reproduce this when generating the tar on linux and mac. I
tested this with "git version 2.21.0" and a build of next I did today:
"git version 2.22.0.rc1.257.g3120a18244"

Reproduction:

  $ git clone https://github.com/SSW-SCIENTIFIC/NNDD.git
  $ cd NNDD
  $ git archive --format tar c21b98da2ca7f007230e696b2eda5da6589fe137
| tar tf - > /dev/null
  tar: Ignoring malformed pax extended attribute
  tar: Error exit delayed from previous errors.
I can't reproduce on Linux, using GNU tar (1.30) nor with bsdtar 3.3.3
(from Debian's bsdtar package). What does your "tar --version" say?

Git does write a pax header with the commit id in it as a comment.
Presumably that's what it's complaining about (but it is not malformed
according to any tar I've tried). If you feed git-archive a tree rather
than a commit, that is omitted. What does:

  git archive --format tar c21b98da2^{tree} | tar tf - >/dev/null

say? If it doesn't complain, then we know it's indeed the pax comment
field.
Solaris tar also complains about this. I've seen that for ages, but
never thought to report it, I figured it was well-known.

When you "tar xf" an archive git-archive it complains:

    tar: pax_global_header: typeflag 'g' not recognized, converting to regular file

It will then extract the "pax_global_header" as if it were a file at the
root of the archive. That file will look like this:

    $ wc -c x/pax_global_header
      52 x/pax_global_header
    $ cat x/pax_global_header
    52 comment=$40_CHAR_SHA_1

Where $40_CHAR_SHA_1 is whatever commit this archive was produced from.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help