提交 5e7f56ac 编写于 作者: J Junio C Hamano

git-read-tree --index-output=<file>

This corrects the interface mistake of the previous one, and
gives a command line parameter to the only plumbing command that
currently needs it: "git-read-tree".

We can add the calls to set_alternate_index_output() to other
plumbing commands that update the index if/when needed.
Signed-off-by: NJunio C Hamano <junkio@cox.net>
上级 30ca07a2
......@@ -8,7 +8,7 @@ git-read-tree - Reads tree information into the index
SYNOPSIS
--------
'git-read-tree' (<tree-ish> | [[-m [--aggressive] | --reset | --prefix=<prefix>] [-u | -i]] [--exclude-per-directory=<gitignore>] <tree-ish1> [<tree-ish2> [<tree-ish3>]])
'git-read-tree' (<tree-ish> | [[-m [--aggressive] | --reset | --prefix=<prefix>] [-u | -i]] [--exclude-per-directory=<gitignore>] [--index-output=<file>] <tree-ish1> [<tree-ish2> [<tree-ish3>]])
DESCRIPTION
......@@ -86,6 +86,18 @@ OPTIONS
file (usually '.gitignore') and allows such an untracked
but explicitly ignored file to be overwritten.
--index-output=<file>::
Instead of writing the results out to `$GIT_INDEX_FILE`,
write the resulting index in the named file. While the
command is operating, the original index file is locked
with the same mechanism as usual. The file must allow
to be rename(2)ed into from a temporary file that is
created next to the usual index file; typically this
means it needs to be on the same filesystem as the index
file itself, and you need write permission to the
directories the index file and index output file are
located in.
<tree-ish#>::
The id of the tree object(s) to be read/merged.
......
......@@ -315,14 +315,6 @@ git so take care if using Cogito etc.
index file. If not specified, the default of `$GIT_DIR/index`
is used.
'_GIT_INDEX_OUTPUT'::
When this environment is defined, plumbing level
commands that update the index writes the resulting
index to this file, instead of `$GIT_INDEX_FILE` (or its
default `$GIT_DIR/index`). This is solely meant to be
used by Porcelain to drive low-level plumbing. Defining
this in user's environment is always an error.
'GIT_OBJECT_DIRECTORY'::
If the object storage directory is specified via this
environment variable then the sha1 directories are created
......
......@@ -84,7 +84,7 @@ static void prime_cache_tree(void)
}
static const char read_tree_usage[] = "git-read-tree (<sha> | [[-m [--aggressive] | --reset | --prefix=<prefix>] [-u | -i]] [--exclude-per-directory=<gitignore>] <sha1> [<sha2> [<sha3>]])";
static const char read_tree_usage[] = "git-read-tree (<sha> | [[-m [--aggressive] | --reset | --prefix=<prefix>] [-u | -i]] [--exclude-per-directory=<gitignore>] [--index-output=<file>] <sha1> [<sha2> [<sha3>]])";
static struct lock_file lock_file;
......@@ -128,6 +128,11 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
continue;
}
if (!prefixcmp(arg, "--index-output=")) {
set_alternate_index_output(arg + 15);
continue;
}
/* "--prefix=<subdirectory>/" means keep the current index
* entries and put the entries from the tree under the
* given subdirectory.
......
......@@ -147,7 +147,6 @@ enum object_type {
#define DEFAULT_GIT_DIR_ENVIRONMENT ".git"
#define DB_ENVIRONMENT "GIT_OBJECT_DIRECTORY"
#define INDEX_ENVIRONMENT "GIT_INDEX_FILE"
#define INDEX_OUTPUT_ENVIRONMENT "_GIT_INDEX_OUTPUT"
#define GRAFT_ENVIRONMENT "GIT_GRAFT_FILE"
#define TEMPLATE_DIR_ENVIRONMENT "GIT_TEMPLATE_DIR"
#define CONFIG_ENVIRONMENT "GIT_CONFIG"
......@@ -216,6 +215,7 @@ extern int commit_lock_file(struct lock_file *);
extern int hold_locked_index(struct lock_file *, int);
extern int commit_locked_index(struct lock_file *);
extern void set_alternate_index_output(const char *);
extern void rollback_lock_file(struct lock_file *);
extern int delete_ref(const char *, unsigned char *sha1);
......
......@@ -370,8 +370,8 @@ t,)
# the same way.
if test -z "$initial_commit"
then
_GIT_INDEX_OUTPUT="$TMP_INDEX" \
GIT_INDEX_FILE="$THIS_INDEX" git-read-tree -i -m HEAD
GIT_INDEX_FILE="$THIS_INDEX" \
git-read-tree --index-output="$TMP_INDEX" -i -m HEAD
else
rm -f "$TMP_INDEX"
fi || exit
......
......@@ -4,6 +4,7 @@
#include "cache.h"
static struct lock_file *lock_file_list;
static const char *alternate_index_output;
static void remove_lock_file(void)
{
......@@ -70,11 +71,15 @@ int hold_locked_index(struct lock_file *lk, int die_on_error)
return hold_lock_file_for_update(lk, get_index_file(), die_on_error);
}
void set_alternate_index_output(const char *name)
{
alternate_index_output = name;
}
int commit_locked_index(struct lock_file *lk)
{
char *output = getenv(INDEX_OUTPUT_ENVIRONMENT);
if (output && *output) {
int result = rename(lk->filename, output);
if (alternate_index_output) {
int result = rename(lk->filename, alternate_index_output);
lk->filename[0] = 0;
return result;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册