[HN Gopher] In a Git repository, where do your files live?
___________________________________________________________________
In a Git repository, where do your files live?
Author : todsacerdoti
Score : 132 points
Date : 2023-09-14 18:34 UTC (4 hours ago)
(HTM) web link (jvns.ca)
(TXT) w3m dump (jvns.ca)
| p4bl0 wrote:
| Thanks for sharing this very interesting link (I actually knew it
| would be good before clicking simply because of the domain name)!
|
| If this sort of internal view of git interests you, I strongly
| suggest reading the "DIY Git in Python" series from here:
| https://www.leshenko.net/p/ugit/
| js2 wrote:
| I realize the Python script is likely provided for didactic
| purposes, but you can use `git hash-object` to get the object ID:
|
| https://git-scm.com/docs/git-hash-object
|
| With a bit of sed, the python script in the blog post becomes:
| git hash-object <path> | sed -E 's|(..)(.*)|.git/objects/\1/\2|'
|
| The inverse of `git hash-object` is `git cat-file`:
| git cat-file -p $(git hash-object <path>)
|
| https://git-scm.com/docs/git-cat-file
|
| Aside, when I learn a new subject, I like to go to the index such
| that it is to get an idea of what I don't know (first stage of
| learning: you don't know what you don't know). Then I can try to
| prioritize the order of learning about the topic. With git, I'd
| start with this page:
|
| https://git-scm.com/docs/git
| drewg123 wrote:
| I have a local clone of a git repo with many local branches. I
| lost an object file (and I'm not certain how). Now git gc
| always fails, complaining about the object:
|
| _Counting objects: 100% (11785289 /11785289), done.
|
| Delta compression using up to 64 threads
|
| Compressing objects: 100% (4116944/4116944), done.
|
| fatal: unable to read 1cae71a9d5b24991c0d632b45186ca8a250e5d52
|
| fatal: failed to run repack_
|
| I've cloned the repo again, and that object does not appear in
| the new clone, so I assume it must be from a commit to a local
| branch.
|
| The odd thing is that I _think_ I locally cloned this repo, and
| saw no complaints about the missing object.
|
| Is there any way to tell what branch and/or file(s) were
| referred to by the object? And, assuming its from a stale
| branch, just delete the branch and thereby fix my repo?
| masklinn wrote:
| You can try to git fsck in case that identifies the missing
| object. But I'm not sure there's any ready made command to
| identify through which path a missing object is reached.
|
| It could actually be the reflog. Pruning the reflog then
| running "git gc --prune=now" might do the trick.
| drewg123 wrote:
| Thank you. I've tried git fsck in the past, and it
| complains about the missing object as well.
|
| And I just tried "git gc --prune=now", and sadly it still
| fails the same way.
|
| I'm afraid I'm going to have to bite the bullet and clean
| up my 30 or so worktrees and re-clone the repo, and re-
| create the worktrees.
| williamcotton wrote:
| Try a grep for that missing hash in the fatal message you
| posted and point it at a commit/object that does exist or
| just delete that line/file and see if that fixes it!
| drewg123 wrote:
| This is more or less what I've been trying to do for
| quite a while. How do I grep for it? And once I do that,
| how can I "point it at a commit/object that does exist ?"
| pcthrowaway wrote:
| You might be able to recreate the git history without
| that object (or commit). Look into commands like filter-
| branch. I'd be surprised if there's not a way to recover
| from this situation
| bloopernova wrote:
| Very apropos, I'm trying to write a guide for my team called "git
| beyond pull/push and checkout".
|
| I'm trying to write something that will demystify git for the
| developers in this team. So I want to show them the files in
| .git, and connect them to the concepts they know like branches,
| etc. I'm always on the lookout for new stuff to include.
|
| The more I can read, the better information I can put in this
| guide.
| grahamplace wrote:
| I'd definitely read this if you're able to share it publicly
| bloopernova wrote:
| I'll probably announce it on HN when it's finished :)
| tcoff91 wrote:
| You should read this: https://jwiegley.github.io/git-from-
| the-bottom-up/
| globular-toast wrote:
| You don't need to know this, by the way. You can totally just
| think of git as simply storing a copy of your entire repo every
| time you make a commit. This is one part of git that actually is
| a good abstraction.
|
| Of course it is fun to know this but it won't help you understand
| git really, and please don't tell people who are just learning
| git. Just say git makes a copy of the whole project every time
| you commit.
| glhaynes wrote:
| I feel like git culture is one of the worst about these sorts
| of things. I've run into people that think you're a loser if
| you don't use it from the command line, but my commits using a
| GUI client are much cleaner and I seem to have much less
| trouble than they do.
| recursive wrote:
| "I don't commit that often because I don't have that much hard
| drive space."
| mostlylurks wrote:
| I wonder if anyone has built a system with the philosophy of
| the opposite extreme.
|
| "Oh yeah, space is cheap, so I just let my automated system
| make 10,000 commits per second. It'll be fine."
| jxy wrote:
| It's kind of true with git-lfs.
| smartmic wrote:
| Oh yeah, the Git internals... I tried to find my way through them
| using visualization but did not progress much:
| https://github.com/smartmic/git2pic
| srathi wrote:
| It is fun to explore the Git internals! Some time back, I used
| it to learn Golang [1]. Two birds with one stone!
|
| [1] https://github.com/ssrathi/gogit
| metaltyphoon wrote:
| This was my aha! Momment
| https://youtu.be/P6jD966jzlk?si=YNKrNf872IQqr1vj
| gjf wrote:
| I tried to do something similar:
| https://articles.foletta.org/post/git-under-the-hood/
| sillysaurusx wrote:
| I encourage everyone to read A Plumber's Guide to Git:
| https://alexwlchan.net/a-plumbers-guide-to-git/
|
| It's not a book, just a series of five short blog posts. Part 1
| explains precisely where files live:
| https://alexwlchan.net/a-plumbers-guide-to-git/1-the-git-obj...
| $ mkdir animals $ cd animals $ git init
| $ echo "Big blue basilisks bawl in the basement" > animals.txt
| $ git hash-object -w animals.txt
| b13311e04762c322493e8562e6ce145a899ce570 $ find
| .git/objects -type f
| .git/objects/b1/3311e04762c322493e8562e6ce145a899ce570
| $ rm animals.txt $ git cat-file -p
| b13311e04762c322493e8562e6ce145a899ce570 > animals.txt
|
| Congratulations, you just did a `git restore animals.txt`
| manually.
|
| Parts 2 through 5 are equally illuminating.
| deepspace wrote:
| That was very informative, but I wondered if there is an easy-to-
| read reference somewhere about WHY git works the way it does?
|
| I am old enough to have used SCCS, RCS and CVS extensively. Each
| had their faults, but Git is the only VCS I have used where
| dealing with merge conflicts is unintuitive enough that I
| sometimes end up with the repository in an unusable state. I am
| sure I am doing something wrong, but I would like to understand
| why.
|
| The VCS that maps closes to the way my brain works is ClearCase.
| You essentially have a versioned file system, and you can set up
| a view to present any previous state of that file system. Of
| course, administration is a nightmare, it is not distributed, it
| is expensive, yada, yada. But when using it I always felt I knew
| exactly what was going on under the covers, which is not the case
| with Git at all.
| zadokshi wrote:
| I used git for years now. I'm comfortable with all of the basic
| functions. It is my experience that I have had several times
| where merging/branching has caused a repo to "break" It doesn't
| happen often, but when it does it's super frustrating and this
| I avoid the merging workflows where possible. I'm sure if I
| educate myself a bit more about git and pay more careful
| attention to the details, I wouldn't occasionally have this
| problem, but Git really shouldn't be like this.
| jayshua wrote:
| What does a broken repo look like? What does broken mean
| here?
___________________________________________________________________
(page generated 2023-09-14 23:00 UTC)