Skip to content

Commit

Permalink
Merge branch 'cc/replace'
Browse files Browse the repository at this point in the history
* cc/replace:
  Documentation: talk a little bit about GIT_NO_REPLACE_OBJECTS
  Documentation: fix typos and spelling in replace documentation
  replace: use a GIT_NO_REPLACE_OBJECTS env variable
  • Loading branch information
gitster committed Nov 24, 2009
2 parents 75a7ea2 + 0de8b94 commit 783cfaf
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 10 deletions.
24 changes: 14 additions & 10 deletions Documentation/git-replace.txt
Expand Up @@ -17,31 +17,35 @@ DESCRIPTION
Adds a 'replace' reference in `.git/refs/replace/`

The name of the 'replace' reference is the SHA1 of the object that is
replaced. The content of the replace reference is the SHA1 of the
replaced. The content of the 'replace' reference is the SHA1 of the
replacement object.

Unless `-f` is given, the replace reference must not yet exist in
Unless `-f` is given, the 'replace' reference must not yet exist in
`.git/refs/replace/` directory.

Replace references will be used by default by all git commands except
those doing reachability traversal (prune, pack transfer and fsck).
Replacement references will be used by default by all git commands
except those doing reachability traversal (prune, pack transfer and
fsck).

It is possible to disable use of replacement refs for any command
using the --no-replace-objects option just after "git".
It is possible to disable use of replacement references for any
command using the `--no-replace-objects` option just after 'git'.

For example if commit "foo" has been replaced by commit "bar":
For example if commit 'foo' has been replaced by commit 'bar':

------------------------------------------------
$ git --no-replace-object cat-file commit foo
$ git --no-replace-objects cat-file commit foo
------------------------------------------------

show information about commit "foo", while:
shows information about commit 'foo', while:

------------------------------------------------
$ git cat-file commit foo
------------------------------------------------

show information about commit "bar".
shows information about commit 'bar'.

The 'GIT_NO_REPLACE_OBJECTS' environment variable can be set to
achieve the same effect as the `--no-replace-objects` option.

OPTIONS
-------
Expand Down
1 change: 1 addition & 0 deletions cache.h
Expand Up @@ -369,6 +369,7 @@ static inline enum object_type object_type(unsigned int mode)
#define CONFIG_ENVIRONMENT "GIT_CONFIG"
#define EXEC_PATH_ENVIRONMENT "GIT_EXEC_PATH"
#define CEILING_DIRECTORIES_ENVIRONMENT "GIT_CEILING_DIRECTORIES"
#define NO_REPLACE_OBJECTS_ENVIRONMENT "GIT_NO_REPLACE_OBJECTS"
#define GITATTRIBUTES_FILE ".gitattributes"
#define INFOATTRIBUTES_FILE "info/attributes"
#define ATTRIBUTE_MACRO_PREFIX "[attr]"
Expand Down
1 change: 1 addition & 0 deletions connect.c
Expand Up @@ -609,6 +609,7 @@ struct child_process *git_connect(int fd[2], const char *url_orig,
GIT_WORK_TREE_ENVIRONMENT,
GRAFT_ENVIRONMENT,
INDEX_ENVIRONMENT,
NO_REPLACE_OBJECTS_ENVIRONMENT,
NULL
};
conn->env = env;
Expand Down
2 changes: 2 additions & 0 deletions environment.c
Expand Up @@ -84,6 +84,8 @@ static void setup_git_env(void)
git_graft_file = getenv(GRAFT_ENVIRONMENT);
if (!git_graft_file)
git_graft_file = git_pathdup("info/grafts");
if (getenv(NO_REPLACE_OBJECTS_ENVIRONMENT))
read_replace_refs = 0;
}

int is_bare_repository(void)
Expand Down
3 changes: 3 additions & 0 deletions git.c
Expand Up @@ -89,6 +89,9 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
*envchanged = 1;
} else if (!strcmp(cmd, "--no-replace-objects")) {
read_replace_refs = 0;
setenv(NO_REPLACE_OBJECTS_ENVIRONMENT, "1", 1);
if (envchanged)
*envchanged = 1;
} else if (!strcmp(cmd, "--git-dir")) {
if (*argc < 2) {
fprintf(stderr, "No directory given for --git-dir.\n" );
Expand Down
17 changes: 17 additions & 0 deletions t/t6050-replace.sh
Expand Up @@ -77,6 +77,11 @@ test_expect_success 'test --no-replace-objects option' '
git --no-replace-objects show $HASH2 | grep "A U Thor"
'

test_expect_success 'test GIT_NO_REPLACE_OBJECTS env variable' '
GIT_NO_REPLACE_OBJECTS=1 git cat-file commit $HASH2 | grep "author A U Thor" &&
GIT_NO_REPLACE_OBJECTS=1 git show $HASH2 | grep "A U Thor"
'

cat >tag.sig <<EOF
object $HASH2
type commit
Expand Down Expand Up @@ -202,6 +207,18 @@ test_expect_success 'fetch branch with replacement' '
cd ..
'

test_expect_success 'bisect and replacements' '
git bisect start $HASH7 $HASH1 &&
test "$S" = "$(git rev-parse --verify HEAD)" &&
git bisect reset &&
GIT_NO_REPLACE_OBJECTS=1 git bisect start $HASH7 $HASH1 &&
test "$HASH4" = "$(git rev-parse --verify HEAD)" &&
git bisect reset &&
git --no-replace-objects bisect start $HASH7 $HASH1 &&
test "$HASH4" = "$(git rev-parse --verify HEAD)" &&
git bisect reset
'

#
#
test_done

0 comments on commit 783cfaf

Please sign in to comment.