git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Philip Oakley <philipoakley@iee.email>
To: Kevin Buckley <Kevin.Buckley@pawsey.org.au>, git@vger.kernel.org
Subject: Re: Definition of "the Git repository"
Date: Fri, 25 Jun 2021 21:48:28 +0100	[thread overview]
Message-ID: <435b0150-cd9f-32ce-7a07-3057ef20662a@iee.email> (raw)
In-Reply-To: <7dd55e85-38eb-7346-ff10-7124102cd22b@pawsey.org.au>

Hi Kevin,

On 25/06/2021 02:44, Kevin Buckley wrote:
> Hi there,
>
> raising this on the back of a discussion over at the Software
> Carpentry lesson about Git,
>
>    https://github.com/swcarpentry/git-novice/issues/810
>
> I used the book to justify my claim that it is the .git directory
> that is the repository, but I do have to concede that the way that
> the text in section 2.1 of the book reads, does suggest that one
> can refer to the working directory PLUS the .git directory as a
> "repository" as well as being able to refer to the .git directory
> alone as the "repository".
>
> In the way I think of it
>
> git init
>
> initialises a Git repository, however, the only thing that changes
> as a result is that a .git directory has been created, ergo, the
> .git directory is the repository.
>
> Furthermore, the fact that one can take the .git directory, move it
> to a new directory and start using it there (very much a nice feature)
> also suggests to me that it is the .git directory that is the repository,
> as distict from a working directory, under Git control because of the
> existence of a repository within it.
>
> Interested to hear any thoughts around the semantics here,

In general, the Git semantics are confusing.

There is the generic, the conceptual and the implementation, all of the
same term which has to be understood in context (which again uses terms
with the same multi-way context..). This leapfrogging from concept to
implementation and back again causes lots of learner confusion.

You have already seen that a source directory can become a repository by
being initialised, and that the primary artefacts are in the .git
sub-directory. One can also include in the generic 'repository' the
various special .git* files that are [user] added to the main source
directory.

But it gets worse. In the .git directory there is the 'objects'
directory which actually holds all the _content_ of the 'repository',
each object named by its hash value. This object store is a superset of
those objects that form the versioned repository structure (the 'DAG'),
and other parts of Git, such as the staging area (Index) contents, and
other temporary copies of 'stuff'.

Meanwhile, to make the repository structure work, there are 'branch'
pointers (see 'ref/heads' [0]) to the specific object hashes that
provide the _starting point_ for each branch's linked list of commits
and their content.

The use of the write-once unique object hash names [1] is part of that
implementation 'trickery' that allows Git to work so well, but helps
confuse those who think the object store is synonymous with the
repository (e.g. all the new learners..).

In summary, everyone is right, as long as they are clear about the
context. Which they rarely are.

Philip

[0] the 'ref name's are just strings that conveniently look just like
posix paths ...
[1] the current hash is the 160 bit sha1, so roughly 1 : 10^24  chance
of a collision - unique enough;-)

  parent reply	other threads:[~2021-06-25 20:48 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-25  1:44 Definition of "the Git repository" Kevin Buckley
2021-06-25  5:56 ` Ævar Arnfjörð Bjarmason
2021-06-25  8:56 ` Igor Djordjevic
2021-06-25  9:14 ` Igor Djordjevic
2021-06-25 19:39 ` Felipe Contreras
2021-06-25 20:48 ` Philip Oakley [this message]
2021-06-28  2:24   ` Kevin Buckley
2021-06-28  3:24     ` Felipe Contreras
2021-06-28  4:00       ` Kevin Buckley
2021-06-28  5:21         ` Felipe Contreras
2021-06-29  1:57           ` Kevin Buckley
2021-06-29  2:08             ` Felipe Contreras
2021-06-28 15:18     ` Philip Oakley
2021-06-28 15:34       ` Chris Torek
2021-06-29  6:59 ` Junio C Hamano

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=435b0150-cd9f-32ce-7a07-3057ef20662a@iee.email \
    --to=philipoakley@iee.email \
    --cc=Kevin.Buckley@pawsey.org.au \
    --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.
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).