clone: allow cloning local paths with colons in them
Usually "foo:bar" is interpreted as an ssh url. This patch allows to clone from such paths by putting at least one slash before the colon (i.e. /path/to/foo:bar or just ./foo:bar). file://foo:bar should also work, but local optimizations are off in that case, which may be unwanted. While at there, warn the users about --local being ignored in this case. Reported-by: William Giokas <1007380@gmail.com> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
239222f587
commit
60003340cd
@ -23,6 +23,12 @@ An alternative scp-like syntax may also be used with the ssh protocol:
|
|||||||
|
|
||||||
- {startsb}user@{endsb}host.xz:path/to/repo.git/
|
- {startsb}user@{endsb}host.xz:path/to/repo.git/
|
||||||
|
|
||||||
|
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:
|
The ssh and git protocols additionally support ~username expansion:
|
||||||
|
|
||||||
- ssh://{startsb}user@{endsb}host.xz{startsb}:port{endsb}/~{startsb}user{endsb}/path/to/repo.git/
|
- ssh://{startsb}user@{endsb}host.xz{startsb}:port{endsb}/~{startsb}user{endsb}/path/to/repo.git/
|
||||||
|
@ -724,6 +724,8 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
|
|||||||
is_local = option_local != 0 && path && !is_bundle;
|
is_local = option_local != 0 && path && !is_bundle;
|
||||||
if (is_local && option_depth)
|
if (is_local && option_depth)
|
||||||
warning(_("--depth is ignored in local clones; use file:// instead."));
|
warning(_("--depth is ignored in local clones; use file:// instead."));
|
||||||
|
if (option_local > 0 && !is_local)
|
||||||
|
warning(_("--local is ignored"));
|
||||||
|
|
||||||
if (argc == 2)
|
if (argc == 2)
|
||||||
dir = xstrdup(argv[1]);
|
dir = xstrdup(argv[1]);
|
||||||
|
@ -550,8 +550,11 @@ struct child_process *git_connect(int fd[2], const char *url_orig,
|
|||||||
path = strchr(end, c);
|
path = strchr(end, c);
|
||||||
if (path && !has_dos_drive_prefix(end)) {
|
if (path && !has_dos_drive_prefix(end)) {
|
||||||
if (c == ':') {
|
if (c == ':') {
|
||||||
|
if (path < strchrnul(host, '/')) {
|
||||||
protocol = PROTO_SSH;
|
protocol = PROTO_SSH;
|
||||||
*path++ = '\0';
|
*path++ = '\0';
|
||||||
|
} else /* '/' in the host part, assume local path */
|
||||||
|
path = end;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
path = end;
|
path = end;
|
||||||
|
@ -280,4 +280,9 @@ test_expect_success 'clone checking out a tag' '
|
|||||||
test_cmp fetch.expected fetch.actual
|
test_cmp fetch.expected fetch.actual
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success NOT_MINGW,NOT_CYGWIN 'clone local path foo:bar' '
|
||||||
|
cp -R src "foo:bar" &&
|
||||||
|
git clone "./foo:bar" foobar
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user