# HTTP PUSH

When using git push over http against a pagure instance, there are two situations to distinguish.

## Git push over http with API token

This is going to be the most supported approach. Any user can generate API tokens with the `commit` ACL which reads in the UI as: Commit to a git repository via http(s). These API tokens can be specific to a project if generated in the settings page of the project, or generic to all projects if generated in the user’s settings page. In either case, they will no work if the user does not have at commit access to the project.

Once the API token has been generate, the user needs to enter it with git prompts for a password (instead of their actual password).

For example:

    $ git push
    username: pingou
    password: ABC123...

## Git push over http with Username & Password

This is only supported on pagure instance that are using the `local` authentication system (ie: where pagure manages the registration of the user accounts, email confirmation, etc).

For these pagure instances and for these only, when being prompted by git for an username and password the user can choose to enter either their username and actual password or their username and an API token.

## Storing the password/token

If you interact with git regularly, typing you password or API token will quickly become tiring. Thanksfully, git has a built-in mechanism named git credential store which can take care of this for you.

You can use two modes for the store, either `cache` or `store`. - cache will cache your credential in memory for 15 minutes (by default) - store will actually store your credentials in plain text on disk

You can set this using either:

    $ git config credential.helper store
    $ git config credential.helper cache

The timeout of the cache can be configured using:

    $ git config credential.helper 'cache --timeout=3600'

Where the timeout value is a number of seconds (so here the cache is extended to one hour).

Finally, if you wish to use this configuration on multiple project, you can add the `--global` argument to these commands which will make the configuration work for all your git repo instead of just the one in which you run the command.