Committing Changes

Once you have a repository running as outlined in the Creating a new Repository section, you can start to commit changes. Picking up where the previous example left off, we can create some data and then commit that state:

$ docker exec -it mymongo mongo --quiet
> db.names.insert({ firstName: "Katherine", lastName: "Goble" })
WriteResult({ "nInserted" : 1 })
> db.names.insert({ firstName: "Mary", lastName: "Jackson" })
WriteResult({ "nInserted" : 1 })
> db.names.find()
{ "_id" : ObjectId("5d8d011a81973f4255f6bf25"), "firstName" : "Dorothy", "lastName" : "Vaughan" }
{ "_id" : ObjectId("5d8d035b4958f33cf90b4d83"), "firstName" : "Katherine", "lastName" : "Goble" }
{ "_id" : ObjectId("5d8d036e4958f33cf90b4d84"), "firstName" : "Mary", "lastName" : "Jackson" }
>
$ titan commit -m "hidden figures" mymongo
Commit 503d7863-14b7-4c39-b609-778fb976ba6a

The commit command took a snapshot of the on-disk state for the mongodb container mymongo and stored that in the repository. It should now be visible in the log:

$ titan log mymongo
commit 503d7863-14b7-4c39-b609-778fb976ba6a
User: Anne Smith
Email: anne.smith@gmail.com
Date: 2019-09-26T18:34:48Z

hidden figures

From here, we can add additional state and create a second commit:

$ docker exec -it mymongo mongo --quiet
> db.names.insert([{ firstName: "Grace", lastName: "Hopper" }, { firstName: "Ada", lastName: "Lovelace" }])
BulkWriteResult({
    "writeErrors" : [ ],
    "writeConcernErrors" : [ ],
    "nInserted" : 2,
    "nUpserted" : 0,
    "nMatched" : 0,
    "nModified" : 0,
    "nRemoved" : 0,
    "upserted" : [ ]
})
> db.names.find()
{ "_id" : ObjectId("5d8d011a81973f4255f6bf25"), "firstName" : "Dorothy", "lastName" : "Vaughan" }
{ "_id" : ObjectId("5d8d035b4958f33cf90b4d83"), "firstName" : "Katherine", "lastName" : "Goble" }
{ "_id" : ObjectId("5d8d036e4958f33cf90b4d84"), "firstName" : "Mary", "lastName" : "Jackson" }
{ "_id" : ObjectId("5d8d05a643a059308e3dfae7"), "firstName" : "Grace", "lastName" : "Hopper" }
{ "_id" : ObjectId("5d8d05a643a059308e3dfae8"), "firstName" : "Ada", "lastName" : "Lovelace" }
>
$ titan commit -m "more great scientists" mymongo
Commit 15ce0a6e-f15e-47a4-a65a-305fcb9efa5c

Once we have this committed state, we can easily go back to a previous state by running titan checkout:

$ titan checkout -c 503d7863-14b7-4c39-b609-778fb976ba6a mymongo
Stopping container mymongo
Checkout 503d7863-14b7-4c39-b609-778fb976ba6a
Starting container mymongo
503d7863-14b7-4c39-b609-778fb976ba6a checked out
$ docker exec -it mymongo mongo --quiet
> db.names.find()
{ "_id" : ObjectId("5d8d011a81973f4255f6bf25"), "firstName" : "Dorothy", "lastName" : "Vaughan" }
{ "_id" : ObjectId("5d8d035b4958f33cf90b4d83"), "firstName" : "Katherine", "lastName" : "Goble" }
{ "_id" : ObjectId("5d8d036e4958f33cf90b4d84"), "firstName" : "Mary", "lastName" : "Jackson" }
>

Here you can see that we stopped the container, swapped out the data, and started it again. And with that, we’re back to the original commit we created.

Warning

The titan infrastructure has not currently been built for scale, and while it should work fine for dozens of commits, creating hundreds or thousands of commits or repositories may have adverse effects on the system. This will be addressed in a future release.

For information on more additional local workflows, see the Local Docker Repositories section.