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
Git, GitHub, Etc
Search
Andy Delcambre
April 19, 2014
Programming
3
250
Git, GitHub, Etc
How git and GitHub work, behind the scenes. Aka what I do in my day job.
Andy Delcambre
April 19, 2014
Tweet
Share
More Decks by Andy Delcambre
See All by Andy Delcambre
Git and GitHub at YAPC:Asia
adelcambre
1
3.4k
Systems Programming - SoCoded 2013
adelcambre
2
180
Ruby Systems Programming
adelcambre
4
1.1k
Debugging Production Service Oriented Systems
adelcambre
3
440
Ruby, Rails and Engine Yard - Úll
adelcambre
1
330
SFRuby Nov 2011 - Release Early and Release Often
adelcambre
2
86
Release early and Release often
adelcambre
2
520
Other Decks in Programming
See All in Programming
CSC509 Lecture 13
javiergs
PRO
0
250
PyCon mini 東海 2025「個人ではじめるマルチAIエージェント入門 〜LangChain × LangGraphでアイデアを形にするステップ〜」
komofr
3
960
AI駆動開発ライフサイクル(AI-DLC)のホワイトペーパーを解説
swxhariu5
0
800
PHPライセンス変更の議論を通じて学ぶOSSライセンスの基礎
matsuo_atsushi
0
140
SUZURIの規約違反チェックにおけるクリエイタフィードバックの試⾏錯誤/Trial and Error in Creator Feedback for SUZURI's Terms of Service Violation Checks
ae14watanabe
1
150
Functional Calisthenics in Kotlin: Kotlinで「関数型エクササイズ」を実践しよう
lagenorhynque
0
130
Kotlin + Power-Assert 言語組み込みならではのAssertion Library採用と運用ベストプラクティス by Kazuki Matsuda/Gen-AX
kazukima
0
110
例外処理を理解して、設計段階からエラーを見つけやすく、起こりにくく #phpconfuk
kajitack
12
5.9k
FlutterKaigi 2025 システム裏側
yumnumm
0
1k
仕様がそのままテストになる!Javaで始める振る舞い駆動開発
ohmori_yusuke
6
3.8k
しっかり学ぶ java.lang.*
nagise
1
340
Kotlinで実装するCPU/GPU 「協調的」パフォーマンス管理
matuyuhi
0
400
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.7k
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
Thoughts on Productivity
jonyablonski
73
4.9k
Automating Front-end Workflow
addyosmani
1371
200k
A designer walks into a library…
pauljervisheath
210
24k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
Facilitating Awesome Meetings
lara
57
6.6k
Raft: Consensus for Rubyists
vanstee
140
7.2k
A Tale of Four Properties
chriscoyier
162
23k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
31
2.7k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.5k
jQuery: Nuts, Bolts and Bling
dougneiner
65
8k
Transcript
Git, GitHub, Etc Andy Delcambre
None
None
PLANET ARGON
None
None
None
None
DIRECTED ACYCLIC GRAPH
yt $ git init Initialized empty Git repository in /private/tmp/demo/.git/
yt $ echo "My sweet repo" > README yt ✗ $ git add README yt ✗ $ git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: README # yt ✗ $ git commit -m "Add a README" [master (root-commit) 8a720fa] Add a README 1 file changed, 1 insertion(+) create mode 100644 README yt $ git log commit 8a720fa06710948f2ab79dd3e213ef745b6000c5 Author: Andy Delcambre <
[email protected]
> Date: Mon Apr 14 15:41:34 2014 -0700 ! Add a README
8a720fa HEAD, master Refs Commit
yt $ echo "It's so awesome" >> README yt ✗
$ git add README yt ✗ $ git commit -m "Update README" [master ede0fc8] Update README 1 file changed, 1 insertion(+) yt $ git log --graph --decorate --pretty=oneline * ede0fc8 (HEAD, master) Update README * 8a720fa Add a README%
Commit 8a720fa ede0fc8 HEAD, master Refs Commit
yt $ git cat-file -p ede0fc8 tree 493fc85c806ebd9e49395561d2f9c98a5d9ebdce parent 8a720fa06710948f2ab79dd3e213ef745b6000c5
author Andy Delcambre <
[email protected]
> 1397516385 -0700 committer Andy Delcambre <
[email protected]
> 1397516385 -0700 ! Update README
Commit ede0fc8 8a720fa 493fc85 Parent Tree
yt $ git cat-file -p 493fc85 100644 blob 17ca828132ebdc5347f4c5c20484b9a33fffb294 README
!
Tree 493fc85 17ca828 Blob (README)
yt $ git cat-file -p 17ca828 My sweet repo It's
so awesome
GitHub
Secret:
Hosting a Git repo is Secret:
Hosting a Git repo is Secret: EASY
enzo $ git init --bare demo.git Initialized empty Git repo
in /home/adelcambre/git/demo.git/ ! yt $ git remote add origin adelcambre@enzo:git/demo.git yt $ git push origin master Counting objects: 6, done. Delta compression using up to 8 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (6/6), 473 bytes, done. Total 6 (delta 0), reused 6 (delta 0) To adelcambre@enzo:git/demo.git * [new branch] master -> master ! yt $ git clone adelcambre@enzo:git/demo.git Cloning into 'demo'... remote: Counting objects: 6, done. remote: Compressing objects: 100% (2/2), done. remote: Total 6 (delta 0), reused 0 (delta 0) Receiving objects: 100% (6/6), done.
None
yt $ git remote add -f origin
[email protected]
:adelcambre/demo.git Updating origin
From github.com:adelcambre/demo * [new branch] master -> origin/master ! yt $ git push origin master Counting objects: 6, done. Delta compression using up to 8 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (6/6), 473 bytes, done. Total 6 (delta 0), reused 6 (delta 0) To https://github.com/adelcambre/demo.git * [new branch] master -> master
None
None
GitHub Flow
Make a branch
Add Commits
Open a Pull Request
Discuss & Code Review
Merge and deploy
None
Not so Secret:
Hosting a *lot* of Git repos is Not so Secret:
Hosting a *lot* of Git repos is Not so Secret:
HARD
> 7 million repositories
1.5 million pushes
100 million pulls & clones
27 fileservers
100 TB of online storage
None
Grit
1st Commit GitHub
1st Commit GitHub 1st Commit Grit
Ruby wrapper around Git
repo = Grit::Repo.new(“grit.git”) ! repo.commits # => [#<Grit::Commit "e80bbd2ce67651aa18e57fb0b43618ad4baf7750">, #<Grit::Commit
"91169e1f5fa4de2eaea3f176461f5dc784796769">, #<Grit::Commit "038af8c329ef7c1bae4568b98bd5c58510465493">, #<Grit::Commit "40d3057d09a7a4d61059bca9dca5ae698de58cbe">, #<Grit::Commit "4ea50f4754937bf19461af58ce3b3d24c77311d9">]
This works for everything! ! (locally)
27 fileservers
Smoke “Grit in the cloud”
The Internet Chimney fs102 fs103 fs104 fs105 … fe102 fe103
fe104 fe105 …
The Internet Chimney fs102 fs103 fs104 fs105 … fe102 fe103
fe104 fe105 …
The Internet Chimney fs102 fs103 fs104 fs105 … fe102 fe103
fe104 fe105 …
The Internet Chimney fs102 fs103 fs104 fs105 … fe102 fe103
fe104 fe105 …
The Internet Chimney fs102 fs103 fs104 fs105 … fe102 fe103
fe104 fe105 … BERTRPC
module Smoke def self.install! ::Grit.send(:remove_const, :Git) ! ::Grit.const_set(:Git, Smoke::Git) end
end
repo.ls_tree("HEAD").each do | entry| if entry.blob? repo.load_blob(entry.oid) end end
Death by Round Trip
A condensed (and probably wrong) history of git
Bitkeeper
Git
Shared library?
libgit2
JGit
libgit2 http://github.com/libgit2/libgit2
Rugged http://github.com/libgit2/rugged
Ruby wrapper around libgit2
repo = Rugged::Repository.new("rugged.git") ! repo.last_commit # => #<Rugged::Commit:2227356240 oid: 0277b7df0fea08d5f3fc7177e47527fc24d96a0e>
None
GitRPC The New Hotness aka
Like Smoke, But Better
Caching
Pluggable Wire Protocols
Encoding Aware
This is My Job
education.github.com
Questions! Git for Computer Scientists http://eagain.net/articles/git-for-computer-scientists/ My mom told me
git doesn’t scale https://vimeo.com/64716825 GitHub Flow https://guides.github.com/introduction/flow/index.html How GitHub uses GitHub to build Github http://zachholman.com/talk/how-github-uses-github-to-build-github/