►
From YouTube: Jedi Mind Tricks for Git - Git Merge 2017
Description
Johan Abildskov & Jan Krag, from Praqma, teach us to channel the git force and improve workflows using customized configurations, attributes and hooks.
About GitMerge
Git Merge is the pre-eminent Git-focused conference: a full-day offering technical content and user case studies, plus a day of workshops for Git users of all levels. Git Merge is dedicated to amplifying new voices in the Git community and to showcasing the most thought-provoking projects from contributors, maintainers and community managers around the world. Find out more at git-merge.com
A
So
we're
going
to
do
Jedi,
Mind
Tricks
and
get
also
known
as
we're
going
to
work
with
hooks
filters,
primers
and
attributes
and
I'm
Johanna,
and
this
is
my
colleague
Yin.
We
don't
work
at
github.
We
work
at
the
partner,
the
continuous
delivery
company,
so
we
helped
a
bunch
of
customers
during
continuous
delivery
and
a
part
of
that
is
being
good
at
your
source
control.
So
both
of
us
are
good
trainers
and
so
I'd
like
to
start.
We
have.
Oh,
my
software
development,
sound
rather
perilous.
A
I
can
assure
you
they
will
never
get
me
on
one
of
those
dreadful
computers,
so
that
quote
is
kind
of
from
Star
Wars
and
he
is
right.
It
was
a
terrible
journey
that
they
go
on,
but
what
what
an
adventure
so
I
hope
we
take
you
on
a
journey,
but
it's
not
production-ready
and
so
on
our
slides.
We
have
commands
some
output
and
contents
of
files.
A
Now
you
know
everything
that's
going
on
in
the
slideshow
and
we're
going
to
work
with
git
hooks
and
github
is
basically
a
way
that
we
can
inject
a
hook
into,
gets
normal
flow
and
so,
for
instance,
in
terms
of
a
commit.
We
have
different
phases.
We
have
staging
thing
and
then,
when
the
user
initializes
a
git
commit
so
we
write
git
commit
on
our
terminal,
a
hook
can
be
called,
that's
called
pre
commit.
After
that
we
can.
We
can
abandon
the
flow
here.
We
can
say
we
don't
want
the
user
to
make
the
commit.
A
We
can
prepare
whatever
is
pub
later
into
the
terminal.
So
when
you
scare
the
Windows
users
by
defaulting
to
opening
the
commit
message
in
VI
in
git
bash,
you
can
actually
control
what
gets
written
in
that
like
at
some
of
our
customers.
We
could
write
press
:
WQ
to
exit
things
like
that,
and
after
that
we
can
do
some
passing
on
the
commit
message
that
the
user
has
done.
A
We
get
the
commit
message
and
after
that
we
get
a
post
commit
hook
like
a
notification,
a
commit
was
made
yay,
and
so
we
have
different
types
of
hooks.
We
have
hooks
where
we
can
take
actions
and
we
have
hooks
that's
just
notifications,
and
so
so
that's
kind
of
awesome.
And
how
do
you
get
started?
Your
type
get
in
it
because,
as
we
all
know,
the
the
best
backed
up
code
in
the
world
is
the
get
hook
samples,
because
every
time
you
write
get
in
it,
you
get
a
copy
of
those
files.
A
So
if
you
have
to
share
something
that
you
want
to
be
persistent
forever,
just
try
to
sneak
it
sneak
them
in
there
in
a
comment
or
something,
and
so
in
the
git
folder,
our
repository.
We
have
the
hooks
and
we
differentiate
between
server,
side
and
client
side
hooks
we're
going
to
look
a
bit
at
at
the
client
side
hooks,
but
we
can,
for
instance,
also
have
github
a
bit.
A
Birgit
have
a
post
receive
hook
that
notifies
the
CI
server
or
whatever,
whenever
we
put
a
push
a
branch,
we're
basically
working
with
this
story
in
the
company.
So
we
have
some
tasks,
a
developer
does
something,
and
some
automation
and
sync
engine
does
continuous
integration
and
some
continuous
delivery.
A
So
we
of
course
want
to
work
with
that
in
terms
of
git
and
one
of
the
things
that
that
we
we
recommend
is
that
that
we
we
save
the
truth
on
master.
So
we
want
to
protect
the
master
and-
and
the
issue
is
that,
no
matter
how
much
we
as
tools,
people,
we
we
try
to
get
developers
to
follow
a
certain
workflow.
A
Tell
me
what
is
hep
pointing
out
and
if
head
is
pointing
at
the
master
branch,
we
want
to
abandon
our
commit
right
so
and
you
cannot
laugh
at
my
shell
scripting,
so
we
just
say
well,
we
need
this
information.
If
it's
master,
then
this
is
not
the
branch
you're
looking
for
and
abandoned
with
a
nonzero
exit
code,
because
then
then
kid
will
say:
okay,
then
then
we
will
abandon
the
commit.
A
Yes
excellent,
so
this
is
also
a
issue
of
we
are
only
working
with
client
side,
so
you
should
never
trust
client
input.
Just
because
we
say
that
we
have
some
get
hooks,
so
the
user
can't
commit
and
master.
We
should
enforce
that
server
side
as
well,
because
we
always
either
get
this
local
right,
so
we
can
do
whatever
we
want,
for
instance,
just
add
a
no
verify
and
then
our
hooks,
they
don't
care,
and
so
so
that's
one
part
we're
supporting
our
workflow.
A
We
are
obviously
professional
develops
and
developers
in
here.
So
everything
we
do
is
a
task
right
and
everything
we
do
isn't
get.
So
we
would
like
to
tie
our
tasks
to
get
so
I
want
to
reference
an
issue
in
my
commit
messages.
That's
not
too
harsh
if
demand
and
if
I,
don't
then
abandon
the
commit.
I
want
all
my
code
to
be
traceable
because
then
I
can
go
to
my
bus
and
say
look
at
all
the
tasks
I'm
referencing,
so
we
need
to
figure
out.
Where
are
our
issues?
We
don't
want
to
do
configuration?
A
A
And
then
we've
got
a
love
api's
right,
so
I
can
just
do
a
curl
command
to
figure
out.
If,
in
my
repository,
is
there
an
issue
with
this
number
and
if
I
do
that
and
I
hit
one
I
get
a
ton
of
Jason
I
weigh
more
Jason
than
I
need,
but
I
can
again
use
my
awesome
power
of
shell
scripting
and
figure
out
whether
and
whether
or
not
we're
getting
what
we
want.
So
basically
the
commit
message
compared
to
the
the
pre-commit
hook.
A
The
commit
message
gets
an
argument
that
is
the
temporary
file
that
contains
the
commit
message
that
the
user
saved.
So
that
is
the
string
if
the
user
used
dash
m
or
the
file
that
that
we're
using
so
we're
just
looking
for
issue
numbers,
because
we
know
issues
are
referenced
by
a
hash
tag.
Right,
that's
that's
always
the
case.
A
So
basically
we
have.
Yes,
you
can't
laugh
at
my
shell
scripting
if
stackoverflow
I
come
out,
I
came
up
with
this
myself,
but
the
point
is
that
we
we
get
some.
We
get
a
hook
into
the
the
commit
flow,
so
the
user
has
written
his
message
and
whether
he
not
only
has
to
make
a
reference.
It
also
has
to
be
an
issue
that
exists
in
our
repository
so
that
that's
quite
nice,
integrating
with
with
the
github
issues
in
this
case
that
way
again.
This
is
not.
We
should
check
server-side
again.
A
We
want
to
be
able
to
trust
our
workflow,
because
fear
is
the
path
to
the
dark
side,
where
you
don't
work
in
your
workflow
and
and
we
like
to
have
use
continuous
delivery,
continuous
integration
and
the
way
that
one
of
the
way
that
ways
that
get
is
awesome
is
that
branches
are
so
lightweight.
Everything
should
be
done
by
branching,
so
we
like
to
flag
to
our
CI
engine,
whatever
that
is
Jenkins
concourse,
that
we
are
ready
to
make
a
delivery
and
integration
by
just
making
sure
that
there's
a
branch
called
ready,
slash
whatever.
A
A
We
want
to
take
the
power
back
and
we
want
to
be
platform
agnostic
right
because
whatever's
going
on
with
get
bash
or
just
ordinary.
You
put
into
bash
and
windows,
or
we're
just
going
to
do
shell
scripting
right,
because
I
have
already
showed
my
awesome
power
in
shell
scripting,
so
we're
going
native
and
we're
taking
the
power
back
from
the
evil
cloud
providers
or
we're
doing
stuff
with
get
hooks.
A
So
what
we're
going
to
do
is
that
I
want
to
work
on
a
feature
branch,
never
master,
and
we
solved
that
already
so
check
mark
outside
of
that
and
I
want
to
commit
my
work.
Referencing
issues
also
doing
that
so
perfect.
Now
it
becomes
interesting
because
I
want
to
be
able
to
run
my
integrate.
My
continuous
integration
set
up
and
I
want
to
do
it
in
git
and
locally
and
I
deliver
through
ready
branches.
A
So
again,
we
need
to
figure
out.
Where
are
we
do
we
need
to
trigger?
Do
we
have
a
delivery
and
we
can
see?
We
need
the
branch
name
again
and
where
is
our
stuff,
because
I
need
to
figure
out
where
my
stuff
is
such
that
I
can
run
tests
which,
in
my
case,
I've
just
had
a
test
script
called
test
in
the
root
of
my
repository,
because
that's
conventional
configuration,
and
so
now
we've
figured
out.
If
we
are
on
a
branch,
that's
relevant
and
we
know
where
our
stuff
is.
A
So
there
is
a
does.
Anyone
know
what
the
difference
between
a
fast
forward
much
and
how
many
know
what
the
difference
between
a
fast
forward
march
in
a
recursive
merge
is
most
hands.
So
a
fast-forward
merge
is
when
we
have
this
situation
and
we
want
to
merge
feature
branch
into
master
branch
and
basically
there's
no
thing
that
that's
that's.
We
don't
have
any
divergence
right,
so
so
the
fast
forward,
merch,
is
basically
only
moving
the
pointer.
A
So
in
many
cases,
when
you
push
up
to
a
remote,
it
will
redirect
your
delivery
if
it's
not
a
force
fast
forward.
Much
so,
basically,
when
we
merge
the
feature
branch
into
the
master
branch,
we
can
simply
just
move
the
master
pointer
and
we
can
figure
that
out
how
fast
we
can
go.
Can
we
do
a
fast
forward
much
simply
by
using
this
double
dot?
Syntax,
where
we're
saying,
what's
reachable
from
master
that
isn't
reachable
from
foo
right?
A
Yes,
I
always
get
confused
about
the
order
of
the
branch
point
us,
and
so
we
want
there
to
be
no
commits
that
that's
reachable
from
a
so
that's
not
reachable
from
crew.
Basically,
what
we're
saying
is
there
are
no
divergence
in
are
branching
with.
We
would
just
have
a
linear
direction,
so
our
workflow
is
going
to
be.
We
have
a
hook,
it's
the
post
checkout
hook,
since
that
was
the
one
I
could
locate.
That
makes
sense,
so
a
post,
checkout
hook
is
called
as
a
notification
after
you
have
checked
something
out.
A
So
if
we're
not
on
a
ready
branch,
let's
just
let
the
user
do
what
they
want
to.
We
can
just
do
nothing,
then
we
want
to
test
if
it's
fast
forward
about.
So
if
we
have
our
data
integration
criteria
and
if
not,
if
we
want
to
clean
up,
we
want
to
run
tests
and
if
they're
successful
we
will
merge,
that
is,
we
will
do
our
integration
to
master
and
clean
up
and
otherwise
we'll
clean
up.
A
Yes,
so,
for
instance,
if
we
have
failed,
we'll,
basically
just
rename
or
we'll
dump
our
branch
that
we're
doing
our
delivery
on
and
create
a
new
branch,
that's
called
failed,
slash
whatever,
because
then
we
can
go
into
the
state
of
that
and
figure
out.
Okay,
now
I
have
the
state
of
code.
It's
clearly
marked
as
not
working
what
went
wrong
and
then
simply
just
create
the
fail
branch
and
delete
the
branch
that
week
we
came
from
so
again
that
that's
easy.
A
So
when
we're
running
it,
we
want
to
check
out
a
ready
branch.
We
switch
to
that
we're
running
some
tests,
so
our
tests
in
this
case
fail.
So
we
leave
the
state
of
our
tests
on
a
branch
called
failed,
/
feature,
because
then
we
can
go
back
and
see
what
went
wrong
and
we
delete
delete'
our
delivery
branch,
because
that's
again,
that's
just
a
pointer.
A
So
this
is
where
again
we're
not
moving
any
commits
doing
anything
we're
just
marking
we're
just
giving
ourself
information,
and
but
in
the
case
where
things
are
working,
we
will
do
some
update
and
then
we
have
a
fast-forward
merge
and
we'll
clean
up
our
Guillory
branch.
So
this
is
basically
what
we
would
assume
that
Travis
would
be
doing
or
Jenkins
would
be
doing.
A
A
It
works
on
my
machine
right
because
now
I
have
CI
on
my
machine
and
again
this
is
not
production
ready,
but
you
can
do
things
in
git
with
hooks
to
support
your
users
interface,
a
workflows
not
enforce
them,
so
at
least
the
the
reference
an
issue
and
and
don't
commit
on
master.
You
can
use
and
now
again
we'll
take
you
through
a
tour
of
at
least
as
disturbing
things.
B
Me,
yes,
so
cutscene,
let's
go
to
the
desert
planet
of
tatooine
Johannes
been
investigating
fun
things
to
do
with
hooks,
I
decided
to
take
a
little
dive
into
you
know.
What
can
we
do
without
hooks
taking
inspiration
from
the
scene
on
Tatooine
at
the
Owen
homestead,
with
Luke
and
Owen,
where
the
Jawas
come
along
with
our
sand
crawl
and
try
to
push
some
droids
and
c-3po
is
trying
to
convince
Owen
to
you
know
also
by
r2d2
basically,
and
is
talking
about
these
awesome
secondary
functions?
B
But
what
really
needs
is
something
that
can
talk
binary
and
well.
This
is
sort
of
something
that
we
can
have
a
look
at
as
well,
because
you
know
git
is
cool,
but
binary
files
are
annoying.
This
is
a
very
typical
situation.
If
you
have
anything
in
a
repository,
that's
a
binary
file
and
yes,
it
happens.
We
can
have
all
our
idealistic
ideas
of
writing
everything
in
markdown
and
I.
Don't
know.
What's,
but
sometimes
you
know
there
are
things
that
have
to
be
binary
files
like
pictures.
B
There
are
corporate
policies
of
things
that
have
to
be
Word
files
or
Excel
files,
and
so
so
we
don't
like
this.
Let's
see
what
we
can
do
about
that.
So
what
we're
going
to
do
is
combine
two
features
of
gifts.
One
is
get
attributes
which
is
allows
us
to
specify
behavior
for
certain
files,
file
paths
and
the
ability
in
gates
to
have
custom
drivers.
So
the
first
thing
we're
going
to
look
at
is
is
diff
drivers,
so
git
attributes
are
defined
in
a
file.
B
Take
the
format
that
you
have
a
path,
a
blood
pattern
that
specifies
which
files
we
want
to
give
certain
attributes
and
then
a
list
of
attributes
and
attributes
can
either
be
a
set
just
by
specifying
the
attribute
they
can
be
unset
with,
or
you
can
give
it
a
tribute.
A
certain
property
attributes
are
can
either
be
defined
globally
in
a
file
in
the
config
home,
slash
gates,
folder.
B
If
that
doesn't
exist,
then
it
defaults
to
the
config
file
and
your
home
directory,
and
you
can
specify
your
own
in
the
gate
config
if
you
want
to
put
it
in
a
certain
place
where
a
table
well
Mists,
of
course,
to
say:
hey
I,
just
want
this
in
the
dot
get
attributes
file
in
my
home
directory,
mostly
because
then
I
can
find
it.
When
I
go
looking
for
it
a
year
later
and
forget
where
it
is,
and
just
like
most
other
things
and
gifts,
you
can
also
add
attributes
locally.
B
B
You
will
see
it
used
to
force
either
text
mode
or
non
or
binary
mode
for
certain
file
types,
if
you
don't
trust
its
intuitive
guessing
of
whether
your
file
is
one
or
the
other.
There
may
be
files
that
look
like
text,
but
you
want
to
make
very
sure
that
it
does
not
automatically
change,
see
and
the
file
settings.
B
B
For
this
example,
I
said
you
know,
dump
in
files,
they
should
use
the
hex
if
I
filter-
and
it's
worth
noting
again
that
you
know
there
are
two
sides
of
this
equation.
You
have
to
define
a
driver
and
you
have
to
specify
to
use
this
driver
for
certain
file
type
or
path
or
whatever,
and
then
you
know,
instead
of
just
having
hey
the
binary
file,
changed
I
now
get
the
hex
dump,
which
is
probably
still
not
very
useful.
B
Unless
you
really
do,
you
know,
spend
all
your
day
doing
low-level
embedded
code
for
microcontrollers
and
are
actually
used
to
reading
hex
dump
for
finding
bugs
in
your
code
I'm,
not
so
on
a
more
general
level.
The
recipe
for
success
here
is,
you
know,
for
any
binary
file
that
you're
using
and
wants
to
have
a
better
result
for
find
some
tool
which
can
extract
useful
information
from
the
file
setup.
B
B
I
could
convert
them
to
text,
but
then
I
found
out
I
can
actually
convert
them
to
markdown.
With
this
fantastic
tool
called
pen
doc
that
can
convert
I
think
about
30
different
file,
types
to
30
other
different
file
types
in
this
case
I'm
just
using
it
to
convert
to
markdown.
My
brain
by
now,
is
rather
good
at
reading.
Markdown.
B
So
if
I
do
a
dip
on
a
work
file
now
with
a
few
changes,
then
I
get
something
that
I
can
actually
use.
Now
whether
this
is
my
change
and
I
just
want
to
see
before
I
do
the
commit.
What
have
I
changed
so
I
can
write
a
good
commit
message
or,
if
I'm
looking
at
commits
other
people
have
done
to
see
what
they
changed.
I
think
this
is
a
lot
more
use
useful
than
binary
file
changed,
and
since
this
is
just
text,
I
can
use
my
regular,
no
diff,
foo
and
use
things
like
word.
B
B
So,
let's
see
if
we
can
go
the
further
PDF
files,
also
pretty
annoying
there's
a
nice
tool
called
PDF
conf
I
can
convert
PDF
to
HTML.
Well,
it's
called
PDF
to
HTML
I,
just
called
my
driver
PDF.
So
now
I
can
get
a
nice
HTML
output
of
my
PDF
file
and
see
exactly
or
at
least
to
a
reasonable
level.
What
has
changed,
whether
it
is
content
or
formatting
can
be
pretty
useful.
B
B
So
there's
a
nice
command-line
tool
called
pigment
eyes
and
written
in
Python
that
I
can
pick
a
pip
install
and
I
can
use
that
to
syntax
highlight
my
code.
So
when
I'm
doing
a
diff
of
a
Python
file,
I
get
it
nicely
printed
in
sensors,
highlighting
I
might
have
chosen
a
better
color
scheme.
That's
a
different
discussion,
so
yeah
makes
it
a
bit
easier
to
actually
you
know
figure
out
where,
in
your
code,
you
are
when
you're
looking
at
a
at
patches
I
had
another
use
with
the
markdown
files.
B
B
B
B
Images
we
can
do
things
for
those
too
active
tool,
very
nice,
little
command-line
tool
that
that
extracts
the
EXIF
data.
From
my
pictures
you
know
the
shows
what
camera
was
taking
with
what
resolution.
All
these
kind
of
metadata
I
just
set
that
up
tell
it
to
use
this
diff
tool
for
all
my
different
image
formats
and
then
I
have
let's
take
a
picture
of
Yoda
and
resize
him,
and
do
it
different
that-
and
at
least
I
can
see
here.
B
Okay,
somebody,
maybe
me
I
changed
the
resolution
from
you
know:
8
800,
642,
600,
480
and
suddenly
I
actually
notice.
No
before
I.
Do
this
commit
that
ok
I
changed
it
to
a
smaller
size,
but
it
added
an
alpha
channel
and
made
the
file
size
twice
as
big.
Maybe
I
want
to
fix
that
before
I
do
the
commits,
maybe
I
can't
be
bothered.
B
Maybe
the
file
should
not
be
called
Yoda
800
pixels
anymore,
when
I
change
the
size,
you
know,
but
this
is
a
lot
more
use
useful
and
actually
stops
me
in
my
process
before
I
do
the
commit
to
say
there
might
be
something
worth
fixing,
and
this
is
all
fine
and
good
right,
but
we're
not
here
to
do
regular
and
I
still
have
no
idea
what
actually
changed
in
my
image.
So
let's
try
something
else.
B
I
found
on
a
little
command-line
tool
called
JPEG,
so
ASCII
can
see
where
this
is
going
so
JP
2a,
let's
specify
width
of
80,
so
I,
know
that
it
always
fits
on
my
terminal
screen.
I
just
wanted
to
show
an
example.
There's
a
there's,
a
parameter
called
cache
text
converts
and
I
can
set
to
true.
So
if
this
was
a
you
know,
heavy
operation,
then
I
could
cache
the
results.
So
I
didn't
have
to
compute
it
every
time,
a
problem
that
needed
here,
but
it's
worth
mentioning.
B
B
It's
enough
that
I,
can
you
know
I
could
I?
Could
you
know,
go
in
and
say:
I
want
to
have
more
context
and
this,
but
then
it
wouldn't
have
fit
on
the
slide
anyway.
But
it's
enough
to
see
okay,
this
is
Yoda.
I
can
recognize
it's
the
eyes.
I
can
see.
There
are
some
changes
there
and
that's
all
the
changes
there
is
in
the
file,
it's
good
to
know
and
it
even
works
in
key
okay.
B
B
B
The
SIP
show
can
be
useful.
I
use
this
in
my
previous
job.
We
were
using
a
magic
draw
for
doing
UML,
diagrams
magic,
draw
stores,
its
files,
which
are
basically
unreadable
XML
and
there's
their
sips.
So
I
use
this
filter
to
at
least
unzip
it,
and
then
I
can
dip
the
XML.
So
I
can
sort
of
read
through
this
very
unreadable
XML
and
have
an
idea
of
what
was
changed.
So
I
can
go
talk
to
the
other
guy
and
find
out.
B
B
A
B
So
a
very
quick
recap
for
those
of
you
haven't
really
read
the
get
internals
book
you
know
recently
when
get
stores
things.
It
basically
translates
a
your
folder
structure
to
three
objects
and
blobs,
so
the
content
of
the
file
is
stored
in
a
blob.
So
if
I
mention
blobs-
and
this
is
what
I'm
referring
to-
we
have
another
thing
and
get
called
filter
drivers
and
filter
drivers,
process
blobs
when
we
create
them
or
when
we
check
out
again.
B
So
when
I
do
a
git
commit
I'm,
creating
blobs
and
when
I
actually
want
to
do,
it
adds
that's
a
different
story
and
when
I
check
out
I'm
reading
the
blobs
and
putting
them
translating
them
into
something
in
my
workspace,
so
we
can
set
up
a
filter
filter
just
like
if
it
has
a
name
that
I
can
refer
to,
then
it
has
a
clean
and
a
smudge
parameter.
The
clean
is
the
one
that
we
use
when
we
save
to
the
blob
and
the
smudge
is
what
we
do
when
we,
you
know,
pull
it
out
again.
B
So
so
you
know
if
the
company
policy
was
to
use
spaces
and
I
prefer
tabs
I.
Could
you
know
convert
one
way
when
I
save
it
and
back
again
to
my
preferred
format
when
I
read
it
out
again,
it
would
be.
You
know
one
option:
I
decided
to
try
something
else
here:
I
found
a
Python
for
matter
called
gaps,
always
good
names.
B
So
let's
say
that
if
I
have
a
Python
file,
I
want
to
make
very
very
sure
that
when
it
saves
that
it
is
nicely
clean,
formatted,
so
I
just
run
it
through
through
yep
and
when
I
check
out
again
I,
you
know,
probably
don't
want
the
messy
version
and
I
couldn't
reconstruct
that
anyway,
so
I'm
just
running
it
through
cats.
If
you
leave
out
the
this
much,
then
that
is
sort
of
the
default
anyway.
B
So
now
I
have
my
very
ugly
Python
file,
it
turns
out,
is
actually
pretty
hard
to
write,
really
ugly
Python.
That
still
works.
But
you
know
with
a
bit
of
work.
You
can
construct
an
example.
So,
let's
take
this
ugly
Python
as
it
is
I'll,
add
it
committed
and
push
it
to
github
and
lo
and
behold,
nice,
fantastic,
clean
Python
and
if
somebody
else
checks
it
out.
This
is
what
they
get
if
I
check
it
out.
B
That's
also
what
I
get
which
leads
to
another
one
of
these,
not
quite
production-ready
things,
because
this
does
get
get
slightly
confused.
Well,
actually,
not,
but
it
gets
the
user
bit
confused,
because
if
I
still
have
my
ugly
version
of
the
Python
file
and
do
a
git
status,
it
will
show
up
as
modified,
because
my
file
does
not
match
what
is
stored
in
the
gate,
objects
and,
if
I
do
get
add
it
magically
disappears
because
at
add
it
is
actually
committed
in
the
git
repository
and
thus
converted
to
the
nice
clean
Python
format.
B
And
then
there
are
no
more
changes
anymore,
which
is
totally
correct.
So
kit
knows
what
it's
doing,
but
it
is
slightly
confusing
from
a
user
point
of
view,
and
but
no,
this
is
just
an
example.
Let's
try
some
even
more
fun
I
set
of
a
filter
called
secrets
within
you
know
really
hard
encryption
for
demo
purposes.
I
chose
row
13,
which
is
a
simple.
You
know,
Caesar
cipher,
that
has
the
good
property
of
being
symmetrical.
B
So
if
I
want
to
slice,
I
get
back
to
where
I
was
and
just
for
the
fun
of
it,
because
I
am
a
polyglot,
so
I
decided
to
use
a
ruby
implementation
one-liner
for
encrypting
and
apparel
one-liners
for
decrypting,
but
they
do
exactly
the
same
and
I.
Let's
use
that
for
Java
files,
so
I
have
my
little
short
Java
file
and
you
know
maybe
I
don't
want
it
to
be
too
obvious.
B
But
this
is
a
simple
bubble:
sort
that
I'm
not
proud
of
or
something
so
let's
commit
that
and
have
a
look
at
how
it
looks.
I
can
use
the
low-level
Ellis
tree
to
find
now
the
reference
to
the
blob
so
just
to
show
something
else
than
the
github
user
interface
and
then
we'll
show
the
content
of
that,
because
the
the
cipher
I
chose
only
actually
replaces
letters.
Then
the
code
is
still
readable,
just
a
bit
of
skated
and
of
course
it
looks
like
this
one
could
have
as
well.
B
B
A
B
C
B
Well,
the
attributes
parts
can
be
locally
in
your
repository
and
is
thus
part
of
what
you
clone.
So
you
get
that
the
drivers
are
in
your
config
and
are
does
not
automatically
shared
in
which
you
can
consider
a
you
know,
a
feature,
because
the
tools
that
I
have
on
my
machine
to
do
these
conversions.
It
might
not
be
on
your
machine
or
work
on
your
machine,
so
I
can
set
those
up
myself.
Of
course,
I
can
distribute
those
in
other
ways.
B
It's
a
bit
the
same
story
as
with
the
get
hooks
client-side
a
fantastic
tool,
but
they
are
not
really
distributed
together
with
the
repository.
So
you
either
have
to
figure
out
some
other
way
of
doing
that.
Oh
I,
guess
you
could
put
the
config
part
in
in
the
repository
and
simply
get
into
the
git
config
folder,
but
I
haven't
tried
that
then.
B
Want
this
repository
to
behave
sensibly
and
that
might
not
be
the
same
behavior
that
I
want
to
know.
There
are
a
lot
of
these
diff
drivers
that
I
have
just
set
up
globally,
because
you
know
once
I
got
used
to
them.
I
just
liked
them
everywhere,
but
there
might
might
be
others
that
are
very
context,
specific
behaviors.