Add --info-only option to git-update-cache.
Signed-off-by: Bryan Larsen <bryan.larsen@gmail.com> ---
Documentation/git-update-cache.txt | 23 +++++++++++++++++++---- update-cache.c | 14 +++++++++++--- 2 files changed, 30 insertions(+), 7 deletions(-)
Show changes to 2 files +30 −7
Documentation/git-update-cache.txt, update-cache.c
diff --git a/Documentation/git-update-cache.txt b/Documentation/git-update-cache.txt --- 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,9 @@ OPTIONS --cacheinfo <mode> <object> <path>:: Directly insert the specified info into the cache. +--info-only:: + All <file> arguments behave like --cacheinfo. + --force-remove:: Remove the file from the index even when the working directory still has such a file. (Implies --remove.) @@ -80,15 +84,26 @@ 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: $ git-update-cache --cacheinfo mode sha1 path + +'--info-only' is used to register a file without placing it 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 --- 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, 0) < 0) + if (index_fd(ce->sha1, fd, &st, info_only) < 0) return -1; break; case S_IFLNK: @@ -77,7 +77,11 @@ 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 +386,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;