# A Short Tour of the Noms CLI This is a quick introduction to the Noms command-line interface. It should only take a few minutes to read, but there's also a screencast if you prefer: [](https://www.youtube.com/watch?v=NeBsaNdAn68) ## Install Noms ... if you haven't already. Follow the instructions [here](https://github.com/attic-labs/noms#setup). ## The `noms` command Now you should be able to run `noms`: ``` > noms Noms is a tool for goofing with Noms data. Usage: noms command [arguments] The commands are: diff Shows the difference between two objects ds Noms dataset management log Displays the history of a Noms dataset serve Serves a Noms database over HTTP show Shows a serialization of a Noms object sync Moves datasets between or within databases version Display noms version Use "noms help [command]" for more information about a command. ``` Without any arguments, `noms` lists out all available commands. To get information on a specific command, we can use `noms help [command]`: ``` > noms help sync usage: noms sync [options] See Spelling Objects at https://github.com/attic-labs/noms/blob/master/doc/spelling.md for details on the object and dataset arguments. ... ``` ## noms ds There's a sample database running at http://demo.noms.io/cli-tour. Let's take a look inside... The `noms ds` command lists the _datasets_ within a particular database: ``` > noms ds http://demo.noms.io/cli-tour ... sf-film-locations/raw sf-film-locations ... ``` ## noms log Noms datasets are versioned. You can see the history with `log`: ``` > noms log http://demo.noms.io/cli-tour::sf-film-locations commit q4jcc2i7kntkjiipvjgpr5r02ldroj0g Parent: pckdvpvr9br1fie6c3pjudrlthe7na18 Date: "2016-07-25T18:51:23+0000" InputPath: "http://demo.noms.io/cli-tour::sf-film-locations/raw.value" commit pckdvpvr9br1fie6c3pjudrlthe7na18 Parent: c506ta03786j48a07he83ju669u78qa2 Date: "2016-07-25T18:34:00+0000" InputPath: "http://localhost:8000/cli-tour::sf-film-locations/raw.value" [213] { - Locations: "Mission Delores Park (Mission District) via J-Church MUNI Train" + Locations: "Mission Dolores Park (Mission District) via J-Church MUNI Train" } [221] { - FunFacts: "Mission Delores' official name is Mission San Francisco de Assis. It is the oldest bu ... commit c506ta03786j48a07he83ju669u78qa2 Parent: dl0j63uouu3e64tqrcnqokmisgkdoarb Date: "2016-07-25T18:34:00+0000" InputPath: "http://localhost:8000/cli-tour::sf-film-locations/raw.value" [6] { - Locations: "Randall Musuem" + Locations: "Randall Museum" } (root) { + Row { + Actor1: "Charles Chaplin", ... ``` Note that Noms is a typed system. What is being shown here for each entry is not text, but a serialization of the diff between two datasets. ## noms show You can see the entire serialization of any object in the database with `noms show`: ``` > noms show 'http://demo.noms.io/cli-tour::#pckdvpvr9br1fie6c3pjudrlthe7na18' struct Commit { meta: struct {}, parents: Set>>, value: List, }({ meta: Meta { date: "2016-07-25T18:34:00+0000", inputPath: "http://localhost:8000/cli-tour::sf-film-locations/raw.value", }, parents: { c506ta03786j48a07he83ju669u78qa2, }, value: [ // 1,241 items Row { Actor1: "Siddarth", ... ``` ## noms sync You can work with Noms databases that are remote exactly the same as you work with local databases. But it's frequently useful to move data to a local machine, for example, to make a private fork or to work with the data disconnected from the source database. Moving data in Noms is done with the `sync` command. Note that unlike Git, we do not make a distinction between _push_ and _pull_. It's the same operation in both directions: ``` > noms sync http://demo.noms.io/cli-tour::sf-film-locations /tmp/noms::films > noms ds /tmp/noms films ``` We can now make an edit locally: ``` > go install github.com/attic-labs/noms/samples/go/csv/... > csv-export /tmp/noms::films > /tmp/film-locations.csv ``` open /tmp/film-location.csv and edit it, then: ``` > csv-import --column-types=String,String,String,String,String,String,String,String,Number,String,String \ /tmp/film-locations.csv /tmp/noms::films ``` #noms diff The `noms diff` command can show you the differences between any two values. Let's see our change: ``` > noms diff http://demo.noms.io/cli-tour::sf-film-locations /tmp/noms::films ./.meta { - "date": "2016-07-25T18:51:23+0000" + "date": "2016-07-25T22:51:14+0000" + "inputFile": "/tmp/film-locations.csv" - "inputPath": "http://demo.noms.io/cli-tour::sf-film-locations/raw.value" ./.parents { - pckdvpvr9br1fie6c3pjudrlthe7na18 + q4jcc2i7kntkjiipvjgpr5r02ldroj0g } ./.value[0] { - "Locations": "Epic Roasthouse (399 Embarcadero)" + "Locations": "Epic Roadhouse (399 Embarcadero)" ```