diff options
-rw-r--r-- | Documentation/git-update-cache.txt | 30 | ||||
-rw-r--r-- | update-cache.c | 15 |
2 files changed, 36 insertions, 9 deletions
diff --git a/Documentation/git-update-cache.txt b/Documentation/git-update-cache.txt index 947f2bded0..7340e89c1f 100644 --- a/Documentation/git-update-cache.txt +++ b/Documentation/git-update-cache.txt @@ -14,6 +14,7 @@ SYNOPSIS [--ignore-missing] [--force-remove] [--cacheinfo <mode> <object> <file>]\* + [--info-only] [--] [<file>]\* DESCRIPTION @@ -47,6 +48,11 @@ OPTIONS --cacheinfo <mode> <object> <path>:: Directly insert the specified info into the cache. +--info-only:: + Do not create objects in the object database for all + <file> arguments that follow this flag; just insert + their object IDs into the cache. + --force-remove:: Remove the file from the index even when the working directory still has such a file. (Implies --remove.) @@ -80,15 +86,27 @@ the stat entry is out of date. For example, you'd want to do this after doing a "git-read-tree", to link up the stat cache details with the proper files. -Using --cacheinfo ------------------ -'--cacheinfo' is used to register a file that is not in the current -working directory. This is useful for minimum-checkout merging. +Using --cacheinfo or --info-only +-------------------------------- +'--cacheinfo' is used to register a file that is not in the +current working directory. This is useful for minimum-checkout +merging. + + To pretend you have a file with mode and sha1 at path, say: -To pretend you have a file with mode and sha1 at path, say: + $ git-update-cache --cacheinfo mode sha1 path - $ git-update-cache --cacheinfo mode sha1 path +'--info-only' is used to register files without placing them in the object +database. This is useful for status-only repositories. +Both '--cacheinfo' and '--info-only' behave similarly: the index is updated +but the object database isn't. '--cacheinfo' is useful when the object is +in the database but the file isn't available locally. '--info-only' is +useful when the file is available, but you do not wish to update the +object database. + +Examples +-------- To update and refresh only the files already checked out: git-checkout-cache -n -f -a && git-update-cache --ignore-missing --refresh diff --git a/update-cache.c b/update-cache.c index d5225c3764..cc4298ac4f 100644 --- a/update-cache.c +++ b/update-cache.c @@ -12,7 +12,7 @@ * like "git-update-cache *" and suddenly having all the object * files be revision controlled. */ -static int allow_add = 0, allow_remove = 0, allow_replace = 0, not_new = 0, quiet = 0; +static int allow_add = 0, allow_remove = 0, allow_replace = 0, not_new = 0, quiet = 0, info_only = 0; static int force_remove; /* Three functions to allow overloaded pointer return; see linux/err.h */ @@ -68,7 +68,7 @@ static int add_file_to_cache(char *path) fd = open(path, O_RDONLY); if (fd < 0) return -1; - if (index_fd(ce->sha1, fd, &st, 1, NULL) < 0) + if (index_fd(ce->sha1, fd, &st, !info_only, NULL) < 0) return -1; break; case S_IFLNK: @@ -77,7 +77,12 @@ static int add_file_to_cache(char *path) free(target); return -1; } - if (write_sha1_file(target, st.st_size, "blob", ce->sha1)) + if (info_only) { + unsigned char hdr[50]; + int hdrlen; + write_sha1_file_prepare(target, st.st_size, "blob", + ce->sha1, hdr, &hdrlen); + } else if (write_sha1_file(target, st.st_size, "blob", ce->sha1)) return -1; free(target); break; @@ -382,6 +387,10 @@ int main(int argc, char **argv) i += 3; continue; } + if (!strcmp(path, "--info-only")) { + info_only = 1; + continue; + } if (!strcmp(path, "--force-remove")) { force_remove = 1; continue; |