Merge branch 'jc/no-lazy-fetch'
"git --no-lazy-fetch cmd" allows to run "cmd" while disabling lazy fetching of objects from the promisor remote, which may be handy for debugging. * jc/no-lazy-fetch: git: extend --no-lazy-fetch to work across subprocesses git: document GIT_NO_REPLACE_OBJECTS environment variable git: --no-lazy-fetch option
This commit is contained in:
@ -174,8 +174,17 @@ If you just want to run git as if it was started in `<path>` then use
|
|||||||
directory.
|
directory.
|
||||||
|
|
||||||
--no-replace-objects::
|
--no-replace-objects::
|
||||||
Do not use replacement refs to replace Git objects. See
|
Do not use replacement refs to replace Git objects.
|
||||||
linkgit:git-replace[1] for more information.
|
This is equivalent to exporting the `GIT_NO_REPLACE_OBJECTS`
|
||||||
|
environment variable with any value.
|
||||||
|
See linkgit:git-replace[1] for more information.
|
||||||
|
|
||||||
|
--no-lazy-fetch::
|
||||||
|
Do not fetch missing objects from the promisor remote on
|
||||||
|
demand. Useful together with `git cat-file -e <object>` to
|
||||||
|
see if the object is locally available.
|
||||||
|
This is equivalent to setting the `GIT_NO_LAZY_FETCH`
|
||||||
|
environment variable to `1`.
|
||||||
|
|
||||||
--literal-pathspecs::
|
--literal-pathspecs::
|
||||||
Treat pathspecs literally (i.e. no globbing, no pathspec magic).
|
Treat pathspecs literally (i.e. no globbing, no pathspec magic).
|
||||||
@ -872,6 +881,10 @@ for full details.
|
|||||||
header and packfile URIs. Set this Boolean environment variable to false to prevent this
|
header and packfile URIs. Set this Boolean environment variable to false to prevent this
|
||||||
redaction.
|
redaction.
|
||||||
|
|
||||||
|
`GIT_NO_REPLACE_OBJECTS`::
|
||||||
|
Setting and exporting this environment variable tells Git to
|
||||||
|
ignore replacement refs and do not replace Git objects.
|
||||||
|
|
||||||
`GIT_LITERAL_PATHSPECS`::
|
`GIT_LITERAL_PATHSPECS`::
|
||||||
Setting this Boolean environment variable to true will cause Git to treat all
|
Setting this Boolean environment variable to true will cause Git to treat all
|
||||||
pathspecs literally, rather than as glob patterns. For example,
|
pathspecs literally, rather than as glob patterns. For example,
|
||||||
@ -893,6 +906,11 @@ for full details.
|
|||||||
Setting this Boolean environment variable to true will cause Git to treat all
|
Setting this Boolean environment variable to true will cause Git to treat all
|
||||||
pathspecs as case-insensitive.
|
pathspecs as case-insensitive.
|
||||||
|
|
||||||
|
`GIT_NO_LAZY_FETCH`::
|
||||||
|
Setting this Boolean environment variable to true tells Git
|
||||||
|
not to lazily fetch missing objects from the promisor remote
|
||||||
|
on demand.
|
||||||
|
|
||||||
`GIT_REFLOG_ACTION`::
|
`GIT_REFLOG_ACTION`::
|
||||||
When a ref is updated, reflog entries are created to keep
|
When a ref is updated, reflog entries are created to keep
|
||||||
track of the reason why the ref was updated (which is
|
track of the reason why the ref was updated (which is
|
||||||
|
@ -207,6 +207,9 @@ void setup_git_env(const char *git_dir)
|
|||||||
shallow_file = getenv(GIT_SHALLOW_FILE_ENVIRONMENT);
|
shallow_file = getenv(GIT_SHALLOW_FILE_ENVIRONMENT);
|
||||||
if (shallow_file)
|
if (shallow_file)
|
||||||
set_alternate_shallow_file(the_repository, shallow_file, 0);
|
set_alternate_shallow_file(the_repository, shallow_file, 0);
|
||||||
|
|
||||||
|
if (git_env_bool(NO_LAZY_FETCH_ENVIRONMENT, 0))
|
||||||
|
fetch_if_missing = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int is_bare_repository(void)
|
int is_bare_repository(void)
|
||||||
|
@ -36,6 +36,7 @@ const char *getenv_safe(struct strvec *argv, const char *name);
|
|||||||
#define CEILING_DIRECTORIES_ENVIRONMENT "GIT_CEILING_DIRECTORIES"
|
#define CEILING_DIRECTORIES_ENVIRONMENT "GIT_CEILING_DIRECTORIES"
|
||||||
#define NO_REPLACE_OBJECTS_ENVIRONMENT "GIT_NO_REPLACE_OBJECTS"
|
#define NO_REPLACE_OBJECTS_ENVIRONMENT "GIT_NO_REPLACE_OBJECTS"
|
||||||
#define GIT_REPLACE_REF_BASE_ENVIRONMENT "GIT_REPLACE_REF_BASE"
|
#define GIT_REPLACE_REF_BASE_ENVIRONMENT "GIT_REPLACE_REF_BASE"
|
||||||
|
#define NO_LAZY_FETCH_ENVIRONMENT "GIT_NO_LAZY_FETCH"
|
||||||
#define GITATTRIBUTES_FILE ".gitattributes"
|
#define GITATTRIBUTES_FILE ".gitattributes"
|
||||||
#define INFOATTRIBUTES_FILE "info/attributes"
|
#define INFOATTRIBUTES_FILE "info/attributes"
|
||||||
#define ATTRIBUTE_MACRO_PREFIX "[attr]"
|
#define ATTRIBUTE_MACRO_PREFIX "[attr]"
|
||||||
|
6
git.c
6
git.c
@ -4,6 +4,7 @@
|
|||||||
#include "exec-cmd.h"
|
#include "exec-cmd.h"
|
||||||
#include "gettext.h"
|
#include "gettext.h"
|
||||||
#include "help.h"
|
#include "help.h"
|
||||||
|
#include "object-file.h"
|
||||||
#include "pager.h"
|
#include "pager.h"
|
||||||
#include "read-cache-ll.h"
|
#include "read-cache-ll.h"
|
||||||
#include "run-command.h"
|
#include "run-command.h"
|
||||||
@ -186,6 +187,11 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
|
|||||||
use_pager = 0;
|
use_pager = 0;
|
||||||
if (envchanged)
|
if (envchanged)
|
||||||
*envchanged = 1;
|
*envchanged = 1;
|
||||||
|
} else if (!strcmp(cmd, "--no-lazy-fetch")) {
|
||||||
|
fetch_if_missing = 0;
|
||||||
|
setenv(NO_LAZY_FETCH_ENVIRONMENT, "1", 1);
|
||||||
|
if (envchanged)
|
||||||
|
*envchanged = 1;
|
||||||
} else if (!strcmp(cmd, "--no-replace-objects")) {
|
} else if (!strcmp(cmd, "--no-replace-objects")) {
|
||||||
disable_replace_refs();
|
disable_replace_refs();
|
||||||
setenv(NO_REPLACE_OBJECTS_ENVIRONMENT, "1", 1);
|
setenv(NO_REPLACE_OBJECTS_ENVIRONMENT, "1", 1);
|
||||||
|
@ -665,6 +665,21 @@ test_expect_success 'lazy-fetch when accessing object not in the_repository' '
|
|||||||
git -C partial.git rev-list --objects --missing=print HEAD >out &&
|
git -C partial.git rev-list --objects --missing=print HEAD >out &&
|
||||||
grep "[?]$FILE_HASH" out &&
|
grep "[?]$FILE_HASH" out &&
|
||||||
|
|
||||||
|
# The no-lazy-fetch mechanism prevents Git from fetching
|
||||||
|
test_must_fail env GIT_NO_LAZY_FETCH=1 \
|
||||||
|
git -C partial.git cat-file -e "$FILE_HASH" &&
|
||||||
|
|
||||||
|
# The same with command line option to "git"
|
||||||
|
test_must_fail git --no-lazy-fetch -C partial.git cat-file -e "$FILE_HASH" &&
|
||||||
|
|
||||||
|
# The same, forcing a subprocess via an alias
|
||||||
|
test_must_fail git --no-lazy-fetch -C partial.git \
|
||||||
|
-c alias.foo="!git cat-file" foo -e "$FILE_HASH" &&
|
||||||
|
|
||||||
|
# Sanity check that the file is still missing
|
||||||
|
git -C partial.git rev-list --objects --missing=print HEAD >out &&
|
||||||
|
grep "[?]$FILE_HASH" out &&
|
||||||
|
|
||||||
git -C full cat-file -s "$FILE_HASH" >expect &&
|
git -C full cat-file -s "$FILE_HASH" >expect &&
|
||||||
test-tool partial-clone object-info partial.git "$FILE_HASH" >actual &&
|
test-tool partial-clone object-info partial.git "$FILE_HASH" >actual &&
|
||||||
test_cmp expect actual &&
|
test_cmp expect actual &&
|
||||||
|
Reference in New Issue
Block a user