Merge branch 'jc/nostat'
* jc/nostat: "assume unchanged" git: documentation. ls-files: split "show-valid-bit" into a different option.
This commit is contained in:
commit
bff606b8e9
@ -8,7 +8,8 @@ git-ls-files - Information about files in the index/working directory
|
|||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
'git-ls-files' [-z] [-t]
|
[verse]
|
||||||
|
'git-ls-files' [-z] [-t] [-v]
|
||||||
(--[cached|deleted|others|ignored|stage|unmerged|killed|modified])\*
|
(--[cached|deleted|others|ignored|stage|unmerged|killed|modified])\*
|
||||||
(-[c|d|o|i|s|u|k|m])\*
|
(-[c|d|o|i|s|u|k|m])\*
|
||||||
[-x <pattern>|--exclude=<pattern>]
|
[-x <pattern>|--exclude=<pattern>]
|
||||||
@ -82,6 +83,10 @@ OPTIONS
|
|||||||
K:: to be killed
|
K:: to be killed
|
||||||
? other
|
? other
|
||||||
|
|
||||||
|
-v::
|
||||||
|
Similar to `-t`, but use lowercase letters for files
|
||||||
|
that are marked as 'always matching index'.
|
||||||
|
|
||||||
--full-name::
|
--full-name::
|
||||||
When run from a subdirectory, the command usually
|
When run from a subdirectory, the command usually
|
||||||
outputs paths relative to the current directory. This
|
outputs paths relative to the current directory. This
|
||||||
|
@ -8,11 +8,14 @@ git-update-index - Modifies the index or directory cache
|
|||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
|
[verse]
|
||||||
'git-update-index'
|
'git-update-index'
|
||||||
[--add] [--remove | --force-remove] [--replace]
|
[--add] [--remove | --force-remove] [--replace]
|
||||||
[--refresh [-q] [--unmerged] [--ignore-missing]]
|
[--refresh [-q] [--unmerged] [--ignore-missing]]
|
||||||
[--cacheinfo <mode> <object> <file>]\*
|
[--cacheinfo <mode> <object> <file>]\*
|
||||||
[--chmod=(+|-)x]
|
[--chmod=(+|-)x]
|
||||||
|
[--assume-unchanged | --no-assume-unchanged]
|
||||||
|
[--really-refresh]
|
||||||
[--info-only] [--index-info]
|
[--info-only] [--index-info]
|
||||||
[-z] [--stdin]
|
[-z] [--stdin]
|
||||||
[--verbose]
|
[--verbose]
|
||||||
@ -65,6 +68,18 @@ OPTIONS
|
|||||||
--chmod=(+|-)x::
|
--chmod=(+|-)x::
|
||||||
Set the execute permissions on the updated files.
|
Set the execute permissions on the updated files.
|
||||||
|
|
||||||
|
--assume-unchanged, --no-assume-unchanged::
|
||||||
|
When these flags are specified, the object name recorded
|
||||||
|
for the paths are not updated. Instead, these options
|
||||||
|
sets and unsets the "assume unchanged" bit for the
|
||||||
|
paths. When the "assume unchanged" bit is on, git stops
|
||||||
|
checking the working tree files for possible
|
||||||
|
modifications, so you need to manually unset the bit to
|
||||||
|
tell git when you change the working tree file. This is
|
||||||
|
sometimes helpful when working with a big project on a
|
||||||
|
filesystem that has very slow lstat(2) system call
|
||||||
|
(e.g. cifs).
|
||||||
|
|
||||||
--info-only::
|
--info-only::
|
||||||
Do not create objects in the object database for all
|
Do not create objects in the object database for all
|
||||||
<file> arguments that follow this flag; just insert
|
<file> arguments that follow this flag; just insert
|
||||||
@ -193,6 +208,37 @@ $ git ls-files -s
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
|
|
||||||
|
Using "assume unchanged" bit
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
Many operations in git depend on your filesystem to have an
|
||||||
|
efficient `lstat(2)` implementation, so that `st_mtime`
|
||||||
|
information for working tree files can be cheaply checked to see
|
||||||
|
if the file contents have changed from the version recorded in
|
||||||
|
the index file. Unfortunately, some filesystems have
|
||||||
|
inefficient `lstat(2)`. If your filesystem is one of them, you
|
||||||
|
can set "assume unchanged" bit to paths you have not changed to
|
||||||
|
cause git not to do this check. Note that setting this bit on a
|
||||||
|
path does not mean git will check the contents of the file to
|
||||||
|
see if it has changed -- it makes git to omit any checking and
|
||||||
|
assume it has *not* changed. When you make changes to working
|
||||||
|
tree files, you have to explicitly tell git about it by dropping
|
||||||
|
"assume unchanged" bit, either before or after you modify them.
|
||||||
|
|
||||||
|
In order to set "assume unchanged" bit, use `--assume-unchanged`
|
||||||
|
option. To unset, use `--no-assume-unchanged`.
|
||||||
|
|
||||||
|
The command looks at `core.ignorestat` configuration variable. When
|
||||||
|
this is true, paths updated with `git-update-index paths...` and
|
||||||
|
paths updated with other git commands that update both index and
|
||||||
|
working tree (e.g. `git-apply --index`, `git-checkout-index -u`,
|
||||||
|
and `git-read-tree -u`) are automatically marked as "assume
|
||||||
|
unchanged". Note that "assume unchanged" bit is *not* set if
|
||||||
|
`git-update-index --refresh` finds the working tree file matches
|
||||||
|
the index (use `git-update-index --really-refresh` if you want
|
||||||
|
to mark them as "assume unchanged").
|
||||||
|
|
||||||
|
|
||||||
Examples
|
Examples
|
||||||
--------
|
--------
|
||||||
To update and refresh only the files already checked out:
|
To update and refresh only the files already checked out:
|
||||||
@ -201,6 +247,35 @@ To update and refresh only the files already checked out:
|
|||||||
$ git-checkout-index -n -f -a && git-update-index --ignore-missing --refresh
|
$ git-checkout-index -n -f -a && git-update-index --ignore-missing --refresh
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
|
On an inefficient filesystem with `core.ignorestat` set:
|
||||||
|
|
||||||
|
------------
|
||||||
|
$ git update-index --really-refresh <1>
|
||||||
|
$ git update-index --no-assume-unchanged foo.c <2>
|
||||||
|
$ git diff --name-only <3>
|
||||||
|
$ edit foo.c
|
||||||
|
$ git diff --name-only <4>
|
||||||
|
M foo.c
|
||||||
|
$ git update-index foo.c <5>
|
||||||
|
$ git diff --name-only <6>
|
||||||
|
$ edit foo.c
|
||||||
|
$ git diff --name-only <7>
|
||||||
|
$ git update-index --no-assume-unchanged foo.c <8>
|
||||||
|
$ git diff --name-only <9>
|
||||||
|
M foo.c
|
||||||
|
|
||||||
|
<1> forces lstat(2) to set "assume unchanged" bits for paths
|
||||||
|
that match index.
|
||||||
|
<2> mark the path to be edited.
|
||||||
|
<3> this does lstat(2) and finds index matches the path.
|
||||||
|
<4> this does lstat(2) and finds index does not match the path.
|
||||||
|
<5> registering the new version to index sets "assume unchanged" bit.
|
||||||
|
<6> and it is assumed unchanged.
|
||||||
|
<7> even after you edit it.
|
||||||
|
<8> you can tell about the change after the fact.
|
||||||
|
<9> now it checks with lstat(2) and finds it has been changed.
|
||||||
|
------------
|
||||||
|
|
||||||
|
|
||||||
Configuration
|
Configuration
|
||||||
-------------
|
-------------
|
||||||
@ -213,6 +288,9 @@ in the index and the file mode on the filesystem if they differ only on
|
|||||||
executable bit. On such an unfortunate filesystem, you may
|
executable bit. On such an unfortunate filesystem, you may
|
||||||
need to use `git-update-index --chmod=`.
|
need to use `git-update-index --chmod=`.
|
||||||
|
|
||||||
|
The command looks at `core.ignorestat` configuration variable. See
|
||||||
|
'Using "assume unchanged" bit' section above.
|
||||||
|
|
||||||
|
|
||||||
See Also
|
See Also
|
||||||
--------
|
--------
|
||||||
|
10
ls-files.c
10
ls-files.c
@ -20,6 +20,7 @@ static int show_unmerged = 0;
|
|||||||
static int show_modified = 0;
|
static int show_modified = 0;
|
||||||
static int show_killed = 0;
|
static int show_killed = 0;
|
||||||
static int show_other_directories = 0;
|
static int show_other_directories = 0;
|
||||||
|
static int show_valid_bit = 0;
|
||||||
static int line_terminator = '\n';
|
static int line_terminator = '\n';
|
||||||
|
|
||||||
static int prefix_len = 0, prefix_offset = 0;
|
static int prefix_len = 0, prefix_offset = 0;
|
||||||
@ -447,7 +448,8 @@ static void show_ce_entry(const char *tag, struct cache_entry *ce)
|
|||||||
if (pathspec && !match(pathspec, ce->name, len))
|
if (pathspec && !match(pathspec, ce->name, len))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (tag && *tag && (ce->ce_flags & htons(CE_VALID))) {
|
if (tag && *tag && show_valid_bit &&
|
||||||
|
(ce->ce_flags & htons(CE_VALID))) {
|
||||||
static char alttag[4];
|
static char alttag[4];
|
||||||
memcpy(alttag, tag, 3);
|
memcpy(alttag, tag, 3);
|
||||||
if (isalpha(tag[0]))
|
if (isalpha(tag[0]))
|
||||||
@ -612,7 +614,7 @@ static void verify_pathspec(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const char ls_files_usage[] =
|
static const char ls_files_usage[] =
|
||||||
"git-ls-files [-z] [-t] (--[cached|deleted|others|stage|unmerged|killed|modified])* "
|
"git-ls-files [-z] [-t] [-v] (--[cached|deleted|others|stage|unmerged|killed|modified])* "
|
||||||
"[ --ignored ] [--exclude=<pattern>] [--exclude-from=<file>] "
|
"[ --ignored ] [--exclude=<pattern>] [--exclude-from=<file>] "
|
||||||
"[ --exclude-per-directory=<filename> ] [--full-name] [--] [<file>]*";
|
"[ --exclude-per-directory=<filename> ] [--full-name] [--] [<file>]*";
|
||||||
|
|
||||||
@ -637,13 +639,15 @@ int main(int argc, const char **argv)
|
|||||||
line_terminator = 0;
|
line_terminator = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!strcmp(arg, "-t")) {
|
if (!strcmp(arg, "-t") || !strcmp(arg, "-v")) {
|
||||||
tag_cached = "H ";
|
tag_cached = "H ";
|
||||||
tag_unmerged = "M ";
|
tag_unmerged = "M ";
|
||||||
tag_removed = "R ";
|
tag_removed = "R ";
|
||||||
tag_modified = "C ";
|
tag_modified = "C ";
|
||||||
tag_other = "? ";
|
tag_other = "? ";
|
||||||
tag_killed = "K ";
|
tag_killed = "K ";
|
||||||
|
if (arg[1] == 'v')
|
||||||
|
show_valid_bit = 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!strcmp(arg, "-c") || !strcmp(arg, "--cached")) {
|
if (!strcmp(arg, "-c") || !strcmp(arg, "--cached")) {
|
||||||
|
Loading…
Reference in New Issue
Block a user