Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
cloning_git_in_go_gophercon_india.pdf
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Aditya Mukerjee
February 25, 2017
42
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
cloning_git_in_go_gophercon_india.pdf
Aditya Mukerjee
February 25, 2017
More Decks by Aditya Mukerjee
See All by Aditya Mukerjee
করো: Translating Go to Other (Human) Languages, and Back Again (GopherCon 2020)
chimeracoder
1
110
Building Stripe’s Remote Hub: Scaling Distributed Teams
chimeracoder
1
310
করো: Translating Code to Other (Human) Languages and Back Again
chimeracoder
1
130
করো: Translating Go to Other (Human) Languages, and Back Again (GopherCon Vietnam)
chimeracoder
1
110
Observability from the Panopticon: Measuring What Matters
chimeracoder
2
430
করো: Translating Code to Other (Human) Languages, and Back Again
chimeracoder
1
2.3k
Building Resilient Services in Go
chimeracoder
3
900
Observing Your Go Services
chimeracoder
1
260
You Might Be a Go Contributor Already and Not Know It
chimeracoder
2
450
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
860
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
470
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
280
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
Side Projects
sachag
455
43k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
650
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
420
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
410
Transcript
Cloning Git in Go Aditya Mukerjee Risk & Systems Engineer
at Stripe @chimeracoder
Why write Gitgo? •Git operations from Go applications •Portability •Simplicity
•…why not? @chimeracoder
The dirty secret about Git •Git wasn’t always meant to
be a version control system •Git is a decentralized, userland filesystem for preserving historical state and synchronizing data @chimeracoder
What We’ve Enabled •Backup •Content management •Distributed build systems •Establishing
consensus @chimeracoder
Have you ever seen a “friend’s” computer that looked like
this? @chimeracoder
@chimeracoder 107724969b2af751a1ffd74e3f38d0d76cb8aa55
@chimeracoder commits trees blobs objects
Discovery #1: Layered interfaces are more flexible than union types
@chimeracoder commits trees blobs objects
Bootstrapping Git in Go “We can just use the real
.git directory for our tests, right?” @chimeracoder …nope.
hash(“I love Go”) != hash(“I love Go!”) @chimeracoder Packfiles
Reference: Unpacking Git Packfiles Reference: Implementing Git’s Compression Algorithm in
Go binarydiff(1, 2, 3) 1. “I love Go” 2. “I love Go!” 3. “You love Go, and so do I!” “I love Go” <string 1> + “!”
Discovery #2: Pay attention to interface contracts @chimeracoder zlib data
<arbitrary data> zlib data <arbitrary data>
@chimeracoder type Reader interface { Read(p []byte) (n int, err
error) } Object 1 Object 2 Object 3 Object 4 …
• Discovery #3: Use concurrency to define state machines, and
use channels for the input/output @chimeracoder f1 f3 f2 g g1 if f g2
• Discovery #4: Treat errors as values, and ask how
they behave @chimeracoder httpdir.Open() ParsePackfile() GitFetch()
• Discovery #5: Well-architected interfaces perform very well @chimeracoder
#1: Layered interfaces are more flexible than union types #2:
Pay attention to interface contracts #3: Use concurrency to define state machines, and use channels for the input/output #4: Treat errors as values, and ask how they behave #5: Well-architected interfaces perform very well @chimeracoder
Aditya Mukerjee @chimeracoder https://github.com/ChimeraCoder
Further References • “Unpacking Git Packfiles”: https://codewords.recurse.com/issues/three/unpacking-git-packfiles/ • Gitgo: https://github.com/ChimeraCoder/gitgo/
• “Git from the Inside Out”: https://codewords.recurse.com/issues/two/git-from-the-inside-out @chimeracoder