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

Re: Definition of "the Git repository"

From
Philip Oakley <philipoakley@iee.email>
Date
Jun 25, 2021, 20:48 UTC
Message-ID
<435b0150-cd9f-32ce-7a07-3057ef20662a@iee.email>
In-Reply-To
<7dd55e85-38eb-7346-ff10-7124102cd22b@pawsey.org.au>
Hi Kevin,
On 25/06/2021 02:44, Kevin Buckley wrote:
Show 29 quoted lines
> 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;-)

Previous: Felipe ContrerasNext: Kevin Buckley
Message 6 of 15 in “Definition of "the Git repository"”
  1. Kevin BuckleyJun 25, 2021
  2. Ævar Arnfjörð BjarmasonJun 25, 2021
  3. Igor DjordjevicJun 25, 2021
  4. Igor DjordjevicJun 25, 2021
  5. Felipe ContrerasJun 25, 2021
  6. Philip OakleyJun 25, 2021
  7. Kevin BuckleyJun 28, 2021
  8. Felipe ContrerasJun 28, 2021
  9. Kevin BuckleyJun 28, 2021
  10. Felipe ContrerasJun 28, 2021
  11. Kevin BuckleyJun 29, 2021
  12. Felipe ContrerasJun 29, 2021
  13. Philip OakleyJun 28, 2021
  14. Chris TorekJun 28, 2021
  15. Junio C HamanoJun 29, 2021

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.