The options --branch and -b allow the user to override the initial branch created and checked out by git-clone (normally this is the active branch of the remote repository). If the selected branch is not found the operation aborts. Signed-off-by: Tor Arne Vestbø <torarnv@xxxxxxxxx> --- Something like this? Documentation/git-clone.txt | 5 +++++ builtin-clone.c | 32 ++++++++++++++++++++++++++++---- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index 95f08b9..e7feb4d 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -119,6 +119,11 @@ then the cloned repository will become corrupt. Instead of using the remote name 'origin' to keep track of the upstream repository, use <name> instead. +--branch <name>:: +-b <name>:: + Instead of using the remote repository's active branch as the + initial branch, use <name> instead. + --upload-pack <upload-pack>:: -u <upload-pack>:: When given, and the repository to clone from is accessed diff --git a/builtin-clone.c b/builtin-clone.c index c338910..5fc01ce 100644 --- a/builtin-clone.c +++ b/builtin-clone.c @@ -38,6 +38,7 @@ static int option_quiet, option_no_checkout, option_bare, option_mirror; static int option_local, option_no_hardlinks, option_shared; static char *option_template, *option_reference, *option_depth; static char *option_origin = NULL; +static char *option_branch = NULL; static char *option_upload_pack = "git-upload-pack"; static int option_verbose; @@ -66,6 +67,8 @@ static struct option builtin_clone_options[] = { "path to git-upload-pack on the remote"), OPT_STRING(0, "depth", &option_depth, "depth", "create a shallow clone of that depth"), + OPT_STRING('b', "branch", &option_branch, "branch", + "initial remote branch to check out"), OPT_END() }; @@ -372,7 +375,9 @@ int cmd_clone(int argc, const char **argv, const char *prefix) const char *repo_name, *repo, *work_tree, *git_dir; char *path, *dir; int dest_exists; - const struct ref *refs, *head_points_at, *remote_head, *mapped_refs; + const struct ref *refs, *mapped_refs; + const struct ref *remote_head = NULL; + const struct ref *head_points_at = NULL; struct strbuf key = STRBUF_INIT, value = STRBUF_INIT; struct strbuf branch_top = STRBUF_INIT, reflog_msg = STRBUF_INIT; struct transport *transport = NULL; @@ -545,12 +550,31 @@ int cmd_clone(int argc, const char **argv, const char *prefix) mapped_refs = write_remote_refs(refs, &refspec, reflog_msg.buf); - head_points_at = locate_head(refs, mapped_refs, &remote_head); + if (option_branch) { + const int offset = 11; + const char *branch = option_branch; + if (!prefixcmp(branch, "refs/heads/")) + branch += offset; + + const struct ref *r; + for (r = mapped_refs; r; r = r->next) { + if (!strcmp(r->name + offset, branch)) { + /* Override initial branch */ + head_points_at = r; + remote_head = r; + break; + } + } + + if (!head_points_at) + die("remote has no branch named '%s'.", option_branch); + + } else { + head_points_at = locate_head(refs, mapped_refs, &remote_head); + } } else { warning("You appear to have cloned an empty repository."); - head_points_at = NULL; - remote_head = NULL; option_no_checkout = 1; if (!option_bare) install_branch_config("master", option_origin, -- 1.6.2.rc2.17.g2aa38 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html