# knife upload

The knife upload subcommand is used to upload roles, cookbooks, environments, and data bags to the Chef server from the current working directory in the chef-repo. This subcommand is often used in conjunction with `knife diff`, which can be used to see exactly what changes will be uploaded, and then `knife download`, which does the opposite of `knife upload`.

## Syntax

This subcommand has the following syntax:

    $ knife upload [PATTERN...] (options)

## Options

Note

Review the list of common options available to this (and all) knife subcommands and plugins.

This subcommand has the following options:

`--chef-repo-path PATH`
  The path to the chef-repo. This setting will override the default path to the chef-repo. Default: same value as specified by `chef_repo_path` in client.rb.
`--concurrency`
  The number of allowed concurrent connections. Default: `10`.
`--[no-]diff`
  Use to upload only new and modified files. Set to `false` to upload all files. Default: `true`.
`--[no-]force`
  Use `--force` to upload roles, cookbooks, etc. even if the file in the directory is identical (by default, no `POST` or `PUT` is performed unless an actual change would be made). Default: `--no-force`.
`--[no-]freeze`
  Use to require changes to a cookbook be included as a new version. Only the `--force` option can override this setting. Default: `false`.
`-n`, `--dry-run`
  Use to take no action and only print out results. Default: `false`.
`--[no-]purge`
  Use `--purge` to delete roles, cookbooks, etc. from the Chef server if their corresponding files do not exist in the chef-repo. By default, such objects are left alone and NOT purged. Default: `--no-purge`.
`--[no-]recurse`
  Use `--no-recurse` to disable uploading a directory recursively. Default: `--recurse`.
`--repo-mode MODE`
  The layout of the local chef-repo. Possible values: `static`, `everything`, or `hosted_everything`. Use `static` for just roles, environments, cookbooks, and data bags. By default, `everything` and `hosted_everything` are dynamically selected depending on the server type. Default: `everything` / `hosted_everything`.

## Examples

The following examples show how to use this knife subcommand:

Upload the entire chef-repo

Browse to the top level of the chef-repo and enter:

    $ knife upload

or from anywhere in the chef-repo, enter:

    $ knife upload /

Upload the /cookbooks directory

Browse to the top level of the chef-repo and enter:

    $ knife upload cookbooks

or from anywhere in the chef-repo, enter:

    $ knife upload /cookbooks

Upload the /environments directory

Browse to the top level of the chef-repo and enter:

    $ knife upload environments

or from anywhere in the chef-repo, enter:

    $ knife upload /environments

Upload a single environment

Browse to the top level of the chef-repo and enter:

    $ knife upload environments/production.json

or from the `environments/` directory, enter:

    $ knife upload production.json

Upload the /roles directory

Browse to the top level of the chef-repo and enter:

    $ knife upload roles

or from anywhere in the chef-repo, enter:

    $ knife upload /roles

Upload cookbooks and roles

Browse to the top level of the chef-repo and enter:

    $ knife upload cookbooks/apache\* roles/webserver.json

Use output of knife deps to pass command to knife upload

    $ knife upload `knife deps nodes/*.json`