зеркало из https://github.com/microsoft/git.git
Protect commits recorded in reflog from pruning.
This teaches fsck-objects and prune to protect objects referred to by reflog entries. Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Родитель
2ff81662c2
Коммит
55dd55263b
|
@ -181,12 +181,28 @@ static void walk_commit_list(struct rev_info *revs)
|
|||
}
|
||||
}
|
||||
|
||||
static int add_one_reflog_ent(unsigned char *osha1, unsigned char *nsha1, char *datail, void *cb_data)
|
||||
{
|
||||
struct object *object;
|
||||
|
||||
object = parse_object(osha1);
|
||||
if (object)
|
||||
add_pending_object(&revs, object, "");
|
||||
object = parse_object(nsha1);
|
||||
if (object)
|
||||
add_pending_object(&revs, object, "");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int add_one_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
|
||||
{
|
||||
struct object *object = parse_object(sha1);
|
||||
if (!object)
|
||||
die("bad object ref: %s:%s", path, sha1_to_hex(sha1));
|
||||
add_pending_object(&revs, object, "");
|
||||
|
||||
for_each_reflog_ent(path, add_one_reflog_ent, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -399,6 +399,25 @@ static void fsck_dir(int i, char *path)
|
|||
|
||||
static int default_refs;
|
||||
|
||||
static int fsck_handle_reflog_ent(unsigned char *osha1, unsigned char *nsha1, char *datail, void *cb_data)
|
||||
{
|
||||
struct object *obj;
|
||||
|
||||
if (!is_null_sha1(osha1)) {
|
||||
obj = lookup_object(osha1);
|
||||
if (obj) {
|
||||
obj->used = 1;
|
||||
mark_reachable(obj, REACHABLE);
|
||||
}
|
||||
}
|
||||
obj = lookup_object(nsha1);
|
||||
if (obj) {
|
||||
obj->used = 1;
|
||||
mark_reachable(obj, REACHABLE);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int fsck_handle_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
|
||||
{
|
||||
struct object *obj;
|
||||
|
@ -416,6 +435,9 @@ static int fsck_handle_ref(const char *refname, const unsigned char *sha1, int f
|
|||
default_refs++;
|
||||
obj->used = 1;
|
||||
mark_reachable(obj, REACHABLE);
|
||||
|
||||
for_each_reflog_ent(refname, fsck_handle_reflog_ent, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче