Skip to content

Commit

Permalink
Merge branch 'nd/clone-local-with-colon'
Browse files Browse the repository at this point in the history
"git clone foo/bar:baz" cannot be a request to clone from a remote
over git-over-ssh specified in the scp style.  Detect this case and
clone from a local repository at "foo/bar:baz".

* nd/clone-local-with-colon:
  clone: allow cloning local paths with colons in them
  • Loading branch information
Junio C Hamano committed Jun 2, 2013
2 parents dbbc93b + 6000334 commit 41aaccd
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 2 deletions.
6 changes: 6 additions & 0 deletions Documentation/urls.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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/

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.xz{startsb}:port{endsb}/~{startsb}user{endsb}/path/to/repo.git/
Expand Down
2 changes: 2 additions & 0 deletions builtin/clone.c
Original file line number Diff line number Diff line change
Expand Up @@ -782,6 +782,8 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
is_local = option_local != 0 && path && !is_bundle;
if (is_local && option_depth)
warning(_("--depth is ignored in local clones; use file:// instead."));
if (option_local > 0 && !is_local)
warning(_("--local is ignored"));

if (argc == 2)
dir = xstrdup(argv[1]);
Expand Down
7 changes: 5 additions & 2 deletions connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -551,8 +551,11 @@ struct child_process *git_connect(int fd[2], const char *url_orig,
path = strchr(end, c);
if (path && !has_dos_drive_prefix(end)) {
if (c == ':') {
protocol = PROTO_SSH;
*path++ = '\0';
if (path < strchrnul(host, '/')) {
protocol = PROTO_SSH;
*path++ = '\0';
} else /* '/' in the host part, assume local path */
path = end;
}
} else
path = end;
Expand Down
5 changes: 5 additions & 0 deletions t/t5601-clone.sh
Original file line number Diff line number Diff line change
Expand Up @@ -280,4 +280,9 @@ test_expect_success 'clone checking out a tag' '
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

0 comments on commit 41aaccd

Please sign in to comment.