GIT URLS[[URLS]]
----------------

In general, URLs contain information about the transport protocol, the
address of the remote server, and the path to the repository.
Depending on the transport protocol, some of this information may be
absent.

Git supports ssh, git, http, and https protocols (in addition, ftp
and ftps can be used for fetching, but this is inefficient and
deprecated; do not use them).

The native transport (i.e. git:// URL) does no authentication and
should be used with caution on unsecured networks.

The following syntaxes may be used with them:

- ++ssh://++{startsb}__<user>__++@++{endsb}__<host>__{startsb}++:++__<port>__{endsb}++/++__<path-to-git-repo>__
- ++git://++__<host>__{startsb}:__<port>__{endsb}++/++__<path-to-git-repo>__
- ++http++{startsb}++s++{endsb}++://++__<host>__{startsb}++:++__<port>__{endsb}++/++__<path-to-git-repo>__
- ++ftp++{startsb}++s++{endsb}++://++__<host>__{startsb}++:++__<port>__{endsb}++/++__<path-to-git-repo>__

An alternative scp-like syntax may also be used with the ssh protocol:

- {startsb}__<user>__++@++{endsb}__<host>__++:/++__<path-to-git-repo>__

This syntax is only recognized if there are no slashes before the
first colon. This helps differentiate a local path that contains a
colon. For example the local path `foo:bar` could be specified as an
absolute path or `./foo:bar` to avoid being misinterpreted as an ssh
url.

The ssh and git protocols additionally support ++~++__<username>__ expansion:

- ++ssh://++{startsb}__<user>__++@++{endsb}__<host>__{startsb}++:++__<port>__{endsb}++/~++__<user>__++/++__<path-to-git-repo>__
- ++git://++__<host>__{startsb}++:++__<port>__{endsb}++/~++__<user>__++/++__<path-to-git-repo>__
- {startsb}__<user>__++@++{endsb}__<host>__++:~++__<user>__++/++__<path-to-git-repo>__

For local repositories, also supported by Git natively, the following
syntaxes may be used:

- `/path/to/repo.git/`
- ++file:///path/to/repo.git/++

ifndef::git-clone[]
These two syntaxes are mostly equivalent, except when cloning, when
the former implies `--local` option. See linkgit:git-clone[1] for
details.
endif::git-clone[]

ifdef::git-clone[]
These two syntaxes are mostly equivalent, except the former implies
`--local` option.
endif::git-clone[]

`git clone`, `git fetch` and `git pull`, but not `git push`, will also
accept a suitable bundle file. See linkgit:git-bundle[1].

When Git doesn't know how to handle a certain transport protocol, it
attempts to use the `remote-`{empty}__<transport>__ remote helper, if one
exists. To explicitly request a remote helper, the following syntax
may be used:

- _<transport>_::__<address>__

where _<address>_ may be a path, a server and path, or an arbitrary
URL-like string recognized by the specific remote helper being
invoked. See linkgit:gitremote-helpers[7] for details.

If there are a large number of similarly-named remote repositories and
you want to use a different format for them (such that the URLs you
use will be rewritten into URLs that work), you can create a
configuration section of the form:

[verse]
--
	[url "__<actual-url-base>__"]
		insteadOf = _<other-url-base>_
--

For example, with this:

------------
	[url "git://git.host.xz/"]
		insteadOf = host.xz:/path/to/
		insteadOf = work:
------------

a URL like "work:repo.git" or like "host.xz:/path/to/repo.git" will be
rewritten in any context that takes a URL to be "git://git.host.xz/repo.git".

If you want to rewrite URLs for push only, you can create a
configuration section of the form:

[verse]
--
	[url "__<actual-url-base>__"]
		pushInsteadOf = _<other-url-base>_
--

For example, with this:

------------
	[url "ssh://example.org/"]
		pushInsteadOf = git://example.org/
------------

a URL like "git://example.org/path/to/repo.git" will be rewritten to
"ssh://example.org/path/to/repo.git" for pushes, but pulls will still
use the original URL.
