git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Bryan Turner <bturner@atlassian.com>
To: "Jörn Engel" <joern@purestorage.com>
Cc: Git Users <git@vger.kernel.org>
Subject: Re: new file mode 160000
Date: Tue, 10 Mar 2020 12:37:14 -0700	[thread overview]
Message-ID: <CAGyf7-GoJNtdPT=GWG-QcP=J6uu1un5drvPAcNr5jB9Sc_ZLRg@mail.gmail.com> (raw)
In-Reply-To: <20200310184111.GD1443@cork>

On Tue, Mar 10, 2020 at 11:41 AM Jörn Engel <joern@purestorage.com> wrote:
>
> Something weird happened to us and I have no idea how to reproduce it.
> A developer managed to create a git commit with the following content:
>
> diff --git a/foo b/foo
> new file mode 160000
> index 000000000000..b7e7816c1266
> --- /dev/null
> +++ b/foo
> @@ -0,0 +1 @@
> +one line of content
>
> File name and content obfuscated, the rest is verbatim from the git
> commit.
>
> Now, file mode 160000 doesn't make sense to me.  It doesn't correspond
> to any known file type and I cannot explain how this commit was created
> in the first place.  But whatever the mechanism, the git client should
> have refused it.

Git's file modes aren't (entirely) real. It doesn't actually track
read/write, for example, but it does use the mode to track executable.
That means, for normal files, the possible modes are 0755 and 0644.
Other modes like 0600 or 0750 or similar are not possible.

But Git also uses the mode as a way to track other things. In this
case, 160000 means the file is _intended_ to be a submdule (albeit
with what appears to be invalid content for a submodule, in this
case). Relevant source:
https://github.com/git/git/blob/master/cache.h#L69

>
> Next, the commit was pushed to our git server, which happily accepted
> it.  Again, I would argue that the git server should have refused the
> push.

Since 160000 is a valid mode _to Git_, the push is fine.

>
> Finally, others including myself pulled and checked out a branch with
> this commit.  On checkout, an empty directory is being created and
> caused various mayhem.  I get:
>         error: 'foo' does not have a commit checked out
>         fatal: updating files failed

This indicates, as I mentioned earlier, that the contents of the "foo"
submodule are invalid, so Git couldn't actually check it out. The
content is expected to be the SHA of a commit, paired with a matching
line in a `.gitmodules` file which tells Git where the repository is
so it can check it out.

>
> Not sure what the correct solution would be here.  An empty directory is
> a bad idea, but I cannot think of any "correct" way to handle things
> once the bad commit is in the tree.

It should be straightforward to delete the broken submodule (git rm
foo), commit and push.

Hope this helps!
Bryan
>
> In case it matters, my client is: git version 2.25.0
>
> Jörn

  parent reply	other threads:[~2020-03-10 19:37 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-10 18:41 new file mode 160000 Jörn Engel
2020-03-10 19:10 ` Andreas Schwab
2020-03-10 19:47   ` Junio C Hamano
2020-03-10 20:09     ` Andreas Schwab
2020-03-11 18:35       ` Junio C Hamano
2020-03-10 19:37 ` Bryan Turner [this message]
2020-03-10 19:46 ` Junio C Hamano
2020-03-10 19:57   ` Jörn Engel
2020-03-10 22:22     ` brian m. carlson

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

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAGyf7-GoJNtdPT=GWG-QcP=J6uu1un5drvPAcNr5jB9Sc_ZLRg@mail.gmail.com' \
    --to=bturner@atlassian.com \
    --cc=git@vger.kernel.org \
    --cc=joern@purestorage.com \
    /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.
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).