write-tree: --prefix=<path>

The "bind" commit can express an aggregation of multiple
projects into a single commit.

In such an organization, there would be one project, root of
whose tree object is at the same level of the root of the
aggregated projects, and other projects have their toplevel in
separate subdirectories.  Let's call that root level project the
"primary project", and call other ones just "subprojects".

You would first read-tree the primary project, and then graft
the subprojects under their appropriate location using read-tree
--prefix=<subdir>/ repeatedly.

To write out a tree object from such an index for a subproject,
write-tree --prefix=<subdir>/ is used.

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano
2006-04-26 01:20:50 -07:00
parent f4c6f2d328
commit 6bd20358a9
5 changed files with 67 additions and 6 deletions

View File

@ -8,8 +8,10 @@
#include "cache-tree.h"
static int missing_ok = 0;
static char *prefix = NULL;
static const char write_tree_usage[] = "git-write-tree [--missing-ok]";
static const char write_tree_usage[] =
"git-write-tree [--missing-ok] [--prefix=<prefix>/]";
static struct cache_file cache_file;
@ -21,13 +23,18 @@ int main(int argc, char **argv)
newfd = hold_index_file_for_update(&cache_file, get_index_file());
entries = read_cache();
if (argc == 2) {
if (!strcmp(argv[1], "--missing-ok"))
while (1 < argc) {
char *arg = argv[1];
if (!strcmp(arg, "--missing-ok"))
missing_ok = 1;
else if (!strncmp(arg, "--prefix=", 9))
prefix = arg + 9;
else
die(write_tree_usage);
argc--; argv++;
}
if (argc > 2)
die("too many options");
@ -54,6 +61,12 @@ int main(int argc, char **argv)
* performance penalty and not a big deal.
*/
}
printf("%s\n", sha1_to_hex(active_cache_tree->sha1));
if (prefix) {
struct cache_tree *subtree =
cache_tree_find(active_cache_tree, prefix);
printf("%s\n", sha1_to_hex(subtree->sha1));
}
else
printf("%s\n", sha1_to_hex(active_cache_tree->sha1));
return 0;
}