Add levels for refs and symrefs

This commit is contained in:
Sebastian Morr 2020-09-13 21:55:51 +02:00
parent cb2bb767db
commit 9ba485b789
7 changed files with 32 additions and 0 deletions

View file

@ -0,0 +1 @@
This is an empty level without any winning condition - you can use it as a playground!

View file

@ -0,0 +1,9 @@
Let's take a look at "refs", short for "references"! Refs are not objects, but rather very simple *pointers* to objects! They can help you keep track of what's where.
You can create or update a ref with
git update-ref refs/<refname> <newvalue>
Make sure to start a ref's name with "refs/"! That's a convention that helps Git find all refs you create.
Create refs that point to all objects in this repository!

5
levels/05-ref/start Normal file
View file

@ -0,0 +1,5 @@
echo hello > hello
echo world > world
git add .
TREE=$(git write-tree)
git commit-tree $TREE -m "Initial commit"

3
levels/05-ref/win Normal file
View file

@ -0,0 +1,3 @@
OBJECTS=$(git cat-file --batch-check='%(objectname)' --batch-all-objects | sort)
REF_TARGETS=$(git show-ref -s | sort | uniq)
test "$OBJECTS" = "$REF_TARGETS"

View file

@ -0,0 +1,9 @@
Instead of pointing directly to objects, refs can also point to other refs!
When that happens, they are called "symbolic refs". You can create or update a symbolic ref using
git symbolic-ref <name> <ref>
Usually, you will only encounter a special symbolic ref called "HEAD". This ref is special in that it doesn't start with "refs/"!
Try pointing HEAD to the refs in this repository!

4
levels/06-symref/start Normal file
View file

@ -0,0 +1,4 @@
TREE=$(git write-tree)
COMMIT=$(git commit-tree $TREE -m "Initial commit")
git update-ref refs/best_commit $COMMIT
git update-ref refs/worst_commit $COMMIT

1
levels/06-symref/win Normal file
View file

@ -0,0 +1 @@
git symbolic-ref HEAD | grep _commit