static const char pack_usage[] = "git-pack-objects [--window=N] [--depth=N] base-name < object-list";
 
-enum object_type {
-       OBJ_NONE,
-       OBJ_COMMIT,
-       OBJ_TREE,
-       OBJ_BLOB,
-       OBJ_DELTA
-};
-
+/*
+ * The object type is a single-character shorthand:
+ *  - 'C' for "Commit"
+ *  - 'T' for "Tree"
+ *  - 'B' for "Blob"
+ *  - 'G' for "taG"
+ *  - 'D' for "Delta"
+ */
 struct object_entry {
        unsigned char sha1[20];
        unsigned long size;
        unsigned long offset;
        unsigned int depth;
        unsigned int hash;
-       enum object_type type;
+       unsigned char type;
        unsigned long delta_size;
        struct object_entry *delta;
 };
         * length, except for deltas that has the 20 bytes of delta sha
         * instead.
         */
-       header[0] = ".CTB"[entry->type];
+       header[0] = entry->type;
        hdrlen = 5;
        if (entry->delta) {
                header[0] = 'D';
 
        if (!sha1_object_info(entry->sha1, type, &entry->size)) {
                if (!strcmp(type, "commit")) {
-                       entry->type = OBJ_COMMIT;
+                       entry->type = 'C';
                } else if (!strcmp(type, "tree")) {
-                       entry->type = OBJ_TREE;
+                       entry->type = 'T';
                } else if (!strcmp(type, "blob")) {
-                       entry->type = OBJ_BLOB;
+                       entry->type = 'B';
+               } else if (!strcmp(type, "tag")) {
+                       entry->type = 'G';
                } else
                        die("unable to pack object %s of type %s",
                            sha1_to_hex(entry->sha1), type);
 
        case 'C': type_s = "commit"; break;
        case 'T': type_s = "tree"; break;
        case 'B': type_s = "blob"; break;
+       case 'G': type_s = "tag"; break;
        default: goto err_finish;
        }
        if (write_sha1_file(buffer, size, type_s, sha1) < 0)
        size = (pack[1] << 24) + (pack[2] << 16) + (pack[3] << 8) + pack[4];
        left = pack_size - offset - 5;
        switch (*pack) {
-       case 'C': case 'T': case 'B':
+       case 'C': case 'T': case 'B': case 'G':
                unpack_non_delta_entry(entry, *pack, pack+5, size, left);
                break;
        case 'D':