clone: define shallow clone boundary based on time with --shallow-since

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:
Nguyễn Thái Ngọc Duy 2016-06-12 17:54:00 +07:00 committed by Junio C Hamano
parent 508ea88226
commit 994c2aaf31
2 changed files with 16 additions and 3 deletions

View File

@ -193,6 +193,9 @@ objects from the source repository into a pack in the cloned repository.
`--no-single-branch` is given to fetch the histories near the `--no-single-branch` is given to fetch the histories near the
tips of all branches. tips of all branches.
--shallow-since=<date>::
Create a shallow clone with a history after the specified time.
--[no-]single-branch:: --[no-]single-branch::
Clone only the history leading to the tip of a single branch, Clone only the history leading to the tip of a single branch,
either specified by the `--branch` option or the primary either specified by the `--branch` option or the primary

View File

@ -40,7 +40,8 @@ static const char * const builtin_clone_usage[] = {
static int option_no_checkout, option_bare, option_mirror, option_single_branch = -1; static int option_no_checkout, option_bare, option_mirror, option_single_branch = -1;
static int option_local = -1, option_no_hardlinks, option_shared, option_recursive; static int option_local = -1, option_no_hardlinks, option_shared, option_recursive;
static char *option_template, *option_depth; static int deepen;
static char *option_template, *option_depth, *option_since;
static char *option_origin = NULL; static char *option_origin = NULL;
static char *option_branch = NULL; static char *option_branch = NULL;
static const char *real_git_dir; static const char *real_git_dir;
@ -86,6 +87,8 @@ static struct option builtin_clone_options[] = {
N_("path to git-upload-pack on the remote")), N_("path to git-upload-pack on the remote")),
OPT_STRING(0, "depth", &option_depth, N_("depth"), OPT_STRING(0, "depth", &option_depth, N_("depth"),
N_("create a shallow clone of that depth")), N_("create a shallow clone of that depth")),
OPT_STRING(0, "shallow-since", &option_since, N_("time"),
N_("create a shallow clone since a specific time")),
OPT_BOOL(0, "single-branch", &option_single_branch, OPT_BOOL(0, "single-branch", &option_single_branch,
N_("clone only one branch, HEAD or --branch")), N_("clone only one branch, HEAD or --branch")),
OPT_STRING(0, "separate-git-dir", &real_git_dir, N_("gitdir"), OPT_STRING(0, "separate-git-dir", &real_git_dir, N_("gitdir"),
@ -849,8 +852,10 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
usage_msg_opt(_("You must specify a repository to clone."), usage_msg_opt(_("You must specify a repository to clone."),
builtin_clone_usage, builtin_clone_options); builtin_clone_usage, builtin_clone_options);
if (option_depth || option_since)
deepen = 1;
if (option_single_branch == -1) if (option_single_branch == -1)
option_single_branch = option_depth ? 1 : 0; option_single_branch = deepen ? 1 : 0;
if (option_mirror) if (option_mirror)
option_bare = 1; option_bare = 1;
@ -976,6 +981,8 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
if (is_local) { if (is_local) {
if (option_depth) if (option_depth)
warning(_("--depth is ignored in local clones; use file:// instead.")); warning(_("--depth is ignored in local clones; use file:// instead."));
if (option_since)
warning(_("--shallow-since is ignored in local clones; use file:// instead."));
if (!access(mkpath("%s/shallow", path), F_OK)) { if (!access(mkpath("%s/shallow", path), F_OK)) {
if (option_local > 0) if (option_local > 0)
warning(_("source repository is shallow, ignoring --local")); warning(_("source repository is shallow, ignoring --local"));
@ -994,6 +1001,9 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
if (option_depth) if (option_depth)
transport_set_option(transport, TRANS_OPT_DEPTH, transport_set_option(transport, TRANS_OPT_DEPTH,
option_depth); option_depth);
if (option_since)
transport_set_option(transport, TRANS_OPT_DEEPEN_SINCE,
option_since);
if (option_single_branch) if (option_single_branch)
transport_set_option(transport, TRANS_OPT_FOLLOWTAGS, "1"); transport_set_option(transport, TRANS_OPT_FOLLOWTAGS, "1");
@ -1001,7 +1011,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
transport_set_option(transport, TRANS_OPT_UPLOADPACK, transport_set_option(transport, TRANS_OPT_UPLOADPACK,
option_upload_pack); option_upload_pack);
if (transport->smart_options && !option_depth) if (transport->smart_options && !deepen)
transport->smart_options->check_self_contained_and_connected = 1; transport->smart_options->check_self_contained_and_connected = 1;
refs = transport_get_remote_refs(transport); refs = transport_get_remote_refs(transport);