Live data from Hacker News

We Put Half a Million Files in One Git Repository, Here’s What We Learned

canvatechblog.com

71–80 of 270 posts

Re: We Put Half a Million Files in One Git Repository, Here’s What We Learned

#71
post #2

>just under 60 million lines of code in 2022. I'm always surprised at the fact that almost every product has more lines of code than the entire Linux repo. The scale of these products is astounding.

From the rest of the article, it sounds like a big chunk of these lines are from generated files. What I don't understand is why they're checking in generated files into Git.

Note that these files are not statically generated; they are translation files, generated by translators.

Re: We Put Half a Million Files in One Git Repository, Here’s What We Learned

#72
post #10

Earlier quoted context omitted.

xlf files are usually generated. They're XML. No one wants to write that by hand.

.docx files are archives of xml-files. No one wants to write that by hand. Or, in more words: The format of the files is just the representation on disk - it’s not directly connected to how the files are generated or edited. XML files can be written by hand with suitable editor support.

I think we have different ideas of what "written by hand" means. Someone making a Word doc is not writing XML by hand.

Re: We Put Half a Million Files in One Git Repository, Here’s What We Learned

#73
They made a bad design decision 10 years ago, have been fighting the fallout for years, and will be doing so forever and ever because things will only ever grow.

They wrote a blog post on how clever they think all their workarounds are, at least one of which involves sparse-checkout -- which is perilously close to chopping up your monorepo into several, while still pretending monorepo is fine.

I feel like somebody's job and/or ego is heavily invested in keeping things as they are, even if it demonstrably does not scale to their needs, and the solution is blindingly obvious to even a casual observer.

That is institutional insanity.

Re: We Put Half a Million Files in One Git Repository, Here’s What We Learned

#74
post #9

Earlier quoted context omitted.

They're using git as a cache. Having generated files stored there means they're available if they're needed (eg in CI) without needing further access controls, they're versioned, and it's a simple and understandable strategy. As the article states, most devs are set up to ignore those files so they're not much of a source of the slowness. It's a common pattern for apps that have to serve lots of different locales.

It's still surprising to have any generated things there. E.g. you could make the same case for keeping built binaries in Git as well. Is there a reason why that type of file couldn't be better place into an artifact repository, or just generated and consumed in CI as part of generating a final build output?

Is there a reason why that type of file couldn't be better place into an artifact repository, or just generated and consumed in CI as part of generating a final build output?

No reason at all, but when you need the files during development, and testing, and CI, and in production, and you don't want those things to fail when your artefact repo or source of data is down, then putting the latest versions in git makes sense.

The cost of having them in the repo is a tiny bit more complexity in your git workflow and config. The benefit is being able to access those files everywhere you access the code. It seems like a no-brainer to me.

Re: We Put Half a Million Files in One Git Repository, Here’s What We Learned

#75
Maybe at their scale it makes more sense to switch to a VCS like Eden? https://github.com/facebookexperimental/eden

Eden's equivalent of 'git status' should run almost instantaneous, as checkouts are hosted by a virtual file system (FUSE) that tracks changes.

Re: We Put Half a Million Files in One Git Repository, Here’s What We Learned

#76
post #53

Earlier quoted context omitted.

Ah - that would explain why at my current job there was a node_modules directory in git with nearly 2 million lines of Javascript within. It is gone now.

The days before lock files were a thing and 'it works on my machine!' was rampant.

... are we no longer doing 'works on my machine' ?

Re: We Put Half a Million Files in One Git Repository, Here’s What We Learned

#77
post #28

I feel like I've read about several big companies using monorepos, but I've never understood why. It feels like the source-control equivalent of writing your code in one big file. Does anyone have any good resources for why and how best to implement a monorepo?

good resources:

1) https://trunkbaseddevelopment.com/monorepos/

2) and (but I don't know it as well) https://monorepo.tools/

Re: We Put Half a Million Files in One Git Repository, Here’s What We Learned

#78
post #40

Earlier quoted context omitted.

I'm not saying don't have the translations at all. I'm saying: 1) caching things in git in general is a bad idea; why is it not in this case? 2) these are not - to my understanding - the raw resource files, but rather machine-generated intermediate files. This is why it's about caching, rather than minimal source files. Additionally, to respond to your comment, if string translations don't change much then it may be…

> I'm not saying don't have the translations at all. I'm saying: 1) caching things in git in general is a bad idea (...) You're missing the point. Storing translated files is caching things in git, and it is not a bad idea. It's a standard practice that saves your neck. You either place faith on a build step working deterministically when it was not designed to work like that, or you track your generated files in you…

> You either place faith on a build step working deterministically when it was not designed to work like that

I'm sorry, what? Why would a build not work deterministically?

> If you decide to put faith on your ability to run deterministic builds with a potentially non-deterministic system

If your build is non-deterministic, how can you have any faith in the binaries it produces? You would have much larger problems in that case.

> You use git to track changes, regardless of where they came from

You probably don't want to do that if it is 70% of your codebase and slows down all your developer's git.

> Then you need to have internationalization test steps for each localization running as part of your integration tests to verify if your build worked

I'm convinced you've never used a build system before. Your build should fail if required files are missing. Downloading translation files at build time from some artefact repository vs storing them in git is how a lot of companies do it.

Re: We Put Half a Million Files in One Git Repository, Here’s What We Learned

#79
post #24
post #11

Earlier quoted context omitted.

I don't think it's good idea to store cache in Git. Any file remains forever in the repository after once committed. Local/remote repository become unnecessary big.

The bigger issues for me are it makes history impossible to read (every change is hidden in an avalanche of crap), merges are a mess (you definitely want to spend forever merging autogened files, right?), PR reviews are annoying, etc.

You may want to set the '-diff' attribute for these files so that git will not show diffs for these, instead it will show 'Binary files differ'.

There is also '-merge', which will cause git to not attempt to merge the contents, but just ask you to pick a side.

The challenge however is then verifying the contents of these files in things like merge requests.

See https://gitirc.eu/gitattributes.html

Re: We Put Half a Million Files in One Git Repository, Here’s What We Learned

#80
I don't understand the logic of combining microservices with a monorepo. The whole point of microservices is that you don't care what is beyond the external contract of the service. Who cares how each individual team decides to name their stuff. Why do microservice teams need to care about having every single service checked out? Who or what would be bulk applying changes to all services? This is madness.
Post reply on HN