git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v9 4/5] unpack-objects: unpack_non_delta_entry() read data in a stream

From
HXHan Xin <chiyutianyi@gmail.com>
Date
Jan 20, 2022, 11:21 UTC
Message-ID
<20220120112114.47618-5-chiyutianyi@gmail.com>
In-Reply-To
<20220108085419.79682-1-chiyutianyi@gmail.com>
From: Han Xin <hanxin.hx@alibaba-inc.com>

We used to call "get_data()" in "unpack_non_delta_entry()" to read the entire contents of a blob object, no matter how big it is. This implementation may consume all the memory and cause OOM.

By implementing a zstream version of input_stream interface, we can use a small fixed buffer for "unpack_non_delta_entry()". However, unpack non-delta objects from a stream instead of from an entrie buffer will have 10% performance penalty.

    $ hyperfine \
      --setup \
      'if ! test -d scalar.git; then git clone --bare
       https://github.com/microsoft/scalar.git;
       cp scalar.git/objects/pack/*.pack small.pack; fi' \
      --prepare 'rm -rf dest.git && git init --bare dest.git' \
      ...
    Summary
      './git -C dest.git -c core.bigFileThreshold=512m
      unpack-objects <small.pack' in 'origin/master'
        1.01 ± 0.04 times faster than './git -C dest.git
                -c core.bigFileThreshold=512m unpack-objects
                <small.pack' in 'HEAD~1'
        1.01 ± 0.04 times faster than './git -C dest.git
                -c core.bigFileThreshold=512m unpack-objects
                <small.pack' in 'HEAD~0'
        1.03 ± 0.10 times faster than './git -C dest.git
                -c core.bigFileThreshold=16k unpack-objects
                <small.pack' in 'origin/master'
        1.02 ± 0.07 times faster than './git -C dest.git
                -c core.bigFileThreshold=16k unpack-objects
                <small.pack' in 'HEAD~0'
        1.10 ± 0.04 times faster than './git -C dest.git
                -c core.bigFileThreshold=16k unpack-objects
                <small.pack' in 'HEAD~1'

Therefore, only unpack objects larger than the "core.bigFileThreshold" in zstream. Until now, the config variable has been used in the following cases, and our new case belongs to the packfile category.

 * Archive:
   + archive.c: write_entry(): write large blob entries to archive in
     stream.
 * Loose objects:
   + object-file.c: index_fd(): when hashing large files in worktree,
     read files in a stream, and create one packfile per large blob if
     want to save files to git object store.
   + object-file.c: read_loose_object(): when checking loose objects
     using "git-fsck", do not read full content of large loose objects.
 * Packfile:
   + fast-import.c: parse_and_store_blob(): streaming large blob from
     foreign source to packfile.
   + index-pack.c: check_collison(): read and check large blob in stream.
   + index-pack.c: unpack_entry_data(): do not return the entire
     contents of the big blob from packfile, but uses a fixed buf to
     perform some integrity checks on the object.
   + pack-check.c: verify_packfile(): used by "git-fsck" and will call
     check_object_signature() to check large blob in pack with the
     streaming interface.
   + pack-objects.c: get_object_details(): set "no_try_delta" for large
     blobs when counting objects.
   + pack-objects.c: write_no_reuse_object(): streaming large blob to
     pack.
   + unpack-objects.c: unpack_non_delta_entry(): unpack large blob in
     stream from packfile.
 * Others:
   + diff.c: diff_populate_filespec(): treat large blob file as binary.
   + streaming.c: istream_source(): as a helper of "open_istream()" to
     select proper streaming interface to read large blob from packfile.
Helped-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Helped-by: Derrick Stolee <stolee@gmail.com>
Helped-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Han Xin <hanxin.hx@alibaba-inc.com>
---
 builtin/unpack-objects.c        | 71 ++++++++++++++++++++++++++++++++-
 t/t5328-unpack-large-objects.sh | 23 +++++++++--
 2 files changed, 90 insertions(+), 4 deletions(-)
diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c
index c6d6c17072..e9ec2b349d 100644
--- a/builtin/unpack-objects.c
+++ b/builtin/unpack-objects.c
@@ -343,11 +343,80 @@ static void added_object(unsigned nr, enum object_type type,
 	}
 }
 
+struct input_zstream_data {
+	git_zstream *zstream;
+	unsigned char buf[8192];
+	int status;
+};
+
+static const void *feed_input_zstream(struct input_stream *in_stream,
+				      unsigned long *readlen)
+{
+	struct input_zstream_data *data = in_stream->data;
+	git_zstream *zstream = data->zstream;
+	void *in = fill(1);
+
+	if (in_stream->is_finished) {
+		*readlen = 0;
+		return NULL;
+	}
+
+	zstream->next_out = data->buf;
+	zstream->avail_out = sizeof(data->buf);
+	zstream->next_in = in;
+	zstream->avail_in = len;
+
+	data->status = git_inflate(zstream, 0);
+
+	in_stream->is_finished = data->status != Z_OK;
+	use(len - zstream->avail_in);
+	*readlen = sizeof(data->buf) - zstream->avail_out;
+
+	return data->buf;
+}
+
+static void write_stream_blob(unsigned nr, size_t size)
+{
+	git_zstream zstream = { 0 };
+	struct input_zstream_data data = { 0 };
+	struct input_stream in_stream = {
+		.read = feed_input_zstream,
+		.data = &data,
+	};
+
+	data.zstream = &zstream;
+	git_inflate_init(&zstream);
+
+	if (stream_loose_object(&in_stream, size, &obj_list[nr].oid))
+		die(_("failed to write object in stream"));
+
+	if (data.status != Z_STREAM_END)
+		die(_("inflate returned (%d)"), data.status);
+	git_inflate_end(&zstream);
+
+	if (strict) {
+		struct blob *blob =
+			lookup_blob(the_repository, &obj_list[nr].oid);
+		if (blob)
+			blob->object.flags |= FLAG_WRITTEN;
+		else
+			die(_("invalid blob object from stream"));
+	}
+	obj_list[nr].obj = NULL;
+}
+
 static void unpack_non_delta_entry(enum object_type type, unsigned long size,
 				   unsigned nr)
 {
-	void *buf = get_data(size);
+	void *buf;
+
+	/* Write large blob in stream without allocating full buffer. */
+	if (!dry_run && type == OBJ_BLOB && size > big_file_threshold) {
+		write_stream_blob(nr, size);
+		return;
+	}
 
+	buf = get_data(size);
 	if (buf)
 		write_object(nr, type, buf, size);
 }
diff --git a/t/t5328-unpack-large-objects.sh b/t/t5328-unpack-large-objects.sh
index 45a3316e06..f4129979f9 100755
--- a/t/t5328-unpack-large-objects.sh
+++ b/t/t5328-unpack-large-objects.sh
@@ -9,7 +9,11 @@ test_description='git unpack-objects with large objects'
 
 prepare_dest () {
 	test_when_finished "rm -rf dest.git" &&
-	git init --bare dest.git
+	git init --bare dest.git &&
+	if test -n "$1"
+	then
+		git -C dest.git config core.bigFileThreshold $1
+	fi
 }
 
 test_no_loose () {
@@ -33,16 +37,29 @@ test_expect_success 'set memory limitation to 1MB' '
 '
 
 test_expect_success 'unpack-objects failed under memory limitation' '
-	prepare_dest &&
+	prepare_dest 2m &&
 	test_must_fail git -C dest.git unpack-objects <test-$PACK.pack 2>err &&
 	grep "fatal: attempting to allocate" err
 '
 
 test_expect_success 'unpack-objects works with memory limitation in dry-run mode' '
-	prepare_dest &&
+	prepare_dest 2m &&
 	git -C dest.git unpack-objects -n <test-$PACK.pack &&
 	test_no_loose &&
 	test_dir_is_empty dest.git/objects/pack
 '
 
+test_expect_success 'unpack big object in stream' '
+	prepare_dest 1m &&
+	git -C dest.git unpack-objects <test-$PACK.pack &&
+	test_dir_is_empty dest.git/objects/pack
+'
+
+test_expect_success 'do not unpack existing large objects' '
+	prepare_dest 1m &&
+	git -C dest.git index-pack --stdin <test-$PACK.pack &&
+	git -C dest.git unpack-objects <test-$PACK.pack &&
+	test_no_loose
+'
+
 test_done
-- 
2.34.1.52.gc288e771b4.agit.6.5.6
Previous: Han XinNext: Han Xin
Message 137 of 211 in “unpack-objects: unpack large object in stream”
  1. unpack-objects: unpack large object in streamHan Xin, Oct 9, 2021
  2. Han XinOct 19, 2021
  3. Philip OakleyOct 20, 2021
  4. Han XinOct 21, 2021
  5. Philip OakleyOct 21, 2021
  6. Han XinNov 3, 2021
  7. Philip OakleyNov 3, 2021
  8. 1/6 object-file: refactor write_loose_object() to support inputstreamHan Xin, Nov 12, 2021
  9. Jiang XinNov 18, 2021
  10. Junio C HamanoNov 18, 2021
  11. 2/6 object-file.c: add dry_run mode for write_loose_object()Han Xin, Nov 12, 2021
  12. Jiang XinNov 18, 2021
  13. 3/6 object-file.c: handle nil oid in write_loose_object()Han Xin, Nov 12, 2021
  14. Jiang XinNov 18, 2021
  15. 4/6 object-file.c: read input stream repeatedly in write_loose_object()Han Xin, Nov 12, 2021
  16. Jiang XinNov 18, 2021
  17. 5/6 object-store.h: add write_loose_object()Han Xin, Nov 12, 2021
  18. 6/6 unpack-objects: unpack large object in streamHan Xin, Nov 12, 2021
  19. Jiang XinNov 18, 2021
  20. 0/5 unpack large objects in streamHan Xin, Nov 22, 2021
  21. Han XinNov 29, 2021
  22. Jeff KingNov 29, 2021
  23. Han XinNov 30, 2021
  24. 0/5 unpack large objects in streamHan Xin, Dec 3, 2021
  25. Derrick StoleeDec 7, 2021
  26. 0/6 unpack large blobs in streamHan Xin, Dec 10, 2021
  27. 0/6 unpack large blobs in streamHan Xin, Dec 17, 2021
  28. 0/5 unpack large blobs in streamHan Xin, Dec 21, 2021
  29. 1/5 unpack-objects.c: add dry_run mode for get_data()Han Xin, Dec 21, 2021
  30. Ævar Arnfjörð BjarmasonDec 21, 2021
  31. René ScharfeDec 21, 2021
  32. Ævar Arnfjörð BjarmasonDec 21, 2021
  33. Jiang XinDec 22, 2021
  34. Jiang XinDec 22, 2021
  35. Jiang XinDec 31, 2021
  36. 2/5 object-file API: add a format_object_header() functionHan Xin, Dec 21, 2021
  37. René ScharfeDec 21, 2021
  38. C99 %z (was: [PATCH v7 2/5] object-file API: add a format_object_header() function)Ævar Arnfjörð Bjarmason, Feb 1, 2022
  39. Jiang XinDec 31, 2021
  40. 3/5 object-file.c: refactor write_loose_object() to reuse in stream versionHan Xin, Dec 21, 2021
  41. Ævar Arnfjörð BjarmasonDec 21, 2021
  42. Jiang XinDec 22, 2021
  43. 4/5 object-file.c: add "write_stream_object_file()" to support read in streamHan Xin, Dec 21, 2021
  44. Ævar Arnfjörð BjarmasonDec 21, 2021
  45. Ævar Arnfjörð BjarmasonDec 21, 2021
  46. 5/5 unpack-objects: unpack_non_delta_entry() read data in a streamHan Xin, Dec 21, 2021
  47. Ævar Arnfjörð BjarmasonDec 21, 2021
  48. Jiang XinDec 31, 2021
  49. 0/6 unpack large blobs in streamHan Xin, Jan 8, 2022
  50. 1/5 unpack-objects: low memory footprint for get_data() in dry_run modeHan Xin, Jan 20, 2022
  51. 0/5 unpack large blobs in streamHan Xin, Jan 20, 2022
  52. Ævar Arnfjörð BjarmasonFeb 1, 2022
  53. Han XinFeb 2, 2022
  54. Ævar Arnfjörð BjarmasonFeb 2, 2022
  55. 0/6 unpack-objects: support streaming large objects to diskÆvar Arnfjörð Bjarmason, Feb 4, 2022
  56. 1/6 unpack-objects: low memory footprint for get_data() in dry_run modeÆvar Arnfjörð Bjarmason, Feb 4, 2022
  57. 2/6 object-file.c: do fsync() and close() before post-write die()Ævar Arnfjörð Bjarmason, Feb 4, 2022
  58. 4/6 object-file.c: add "stream_loose_object()" to handle large objectÆvar Arnfjörð Bjarmason, Feb 4, 2022
  59. 3/6 object-file.c: refactor write_loose_object() to several stepsÆvar Arnfjörð Bjarmason, Feb 4, 2022
  60. 5/6 core doc: modernize core.bigFileThreshold documentationÆvar Arnfjörð Bjarmason, Feb 4, 2022
  61. 6/6 unpack-objects: use stream_loose_object() to unpack large objectsÆvar Arnfjörð Bjarmason, Feb 4, 2022
  62. 0/8 unpack-objects: support streaming blobs to diskÆvar Arnfjörð Bjarmason, Mar 19, 2022
  63. 1/8 unpack-objects: low memory footprint for get_data() in dry_run modeÆvar Arnfjörð Bjarmason, Mar 19, 2022
  64. 2/8 object-file.c: do fsync() and close() before post-write die()Ævar Arnfjörð Bjarmason, Mar 19, 2022
  65. 3/8 object-file.c: refactor write_loose_object() to several stepsÆvar Arnfjörð Bjarmason, Mar 19, 2022
  66. René ScharfeMar 19, 2022
  67. 4/8 object-file.c: factor out deflate part of write_loose_object()Ævar Arnfjörð Bjarmason, Mar 19, 2022
  68. 5/8 object-file.c: add "stream_loose_object()" to handle large objectÆvar Arnfjörð Bjarmason, Mar 19, 2022
  69. 6/8 core doc: modernize core.bigFileThreshold documentationÆvar Arnfjörð Bjarmason, Mar 19, 2022
  70. 7/8 unpack-objects: refactor away unpack_non_delta_entry()Ævar Arnfjörð Bjarmason, Mar 19, 2022
  71. 8/8 unpack-objects: use stream_loose_object() to unpack large objectsÆvar Arnfjörð Bjarmason, Mar 19, 2022
  72. 0/8 unpack-objects: support streaming blobs to diskÆvar Arnfjörð Bjarmason, Mar 29, 2022
  73. 2/8 object-file.c: do fsync() and close() before post-write die()Ævar Arnfjörð Bjarmason, Mar 29, 2022
  74. 1/8 unpack-objects: low memory footprint for get_data() in dry_run modeÆvar Arnfjörð Bjarmason, Mar 29, 2022
  75. 3/8 object-file.c: refactor write_loose_object() to several stepsÆvar Arnfjörð Bjarmason, Mar 29, 2022
  76. Han XinMar 30, 2022
  77. Ævar Arnfjörð BjarmasonMar 30, 2022
  78. 4/8 object-file.c: factor out deflate part of write_loose_object()Ævar Arnfjörð Bjarmason, Mar 29, 2022
  79. 5/8 object-file.c: add "stream_loose_object()" to handle large objectÆvar Arnfjörð Bjarmason, Mar 29, 2022
  80. Neeraj SinghMar 31, 2022
  81. 6/8 core doc: modernize core.bigFileThreshold documentationÆvar Arnfjörð Bjarmason, Mar 29, 2022
  82. 7/8 unpack-objects: refactor away unpack_non_delta_entry()Ævar Arnfjörð Bjarmason, Mar 29, 2022
  83. René ScharfeMar 30, 2022
  84. Ævar Arnfjörð BjarmasonMar 31, 2022
  85. René ScharfeMar 31, 2022
  86. 8/8 unpack-objects: use stream_loose_object() to unpack large objectsÆvar Arnfjörð Bjarmason, Mar 29, 2022
  87. 0/7 unpack-objects: support streaming blobs to diskÆvar Arnfjörð Bjarmason, Jun 4, 2022
  88. 1/7 unpack-objects: low memory footprint for get_data() in dry_run modeÆvar Arnfjörð Bjarmason, Jun 4, 2022
  89. Junio C HamanoJun 6, 2022
  90. Han XinJun 9, 2022
  91. Junio C HamanoJun 9, 2022
  92. Han XinJun 10, 2022
  93. Ævar Arnfjörð BjarmasonJun 10, 2022
  94. Han XinJun 10, 2022
  95. 2/7 object-file.c: do fsync() and close() before post-write die()Ævar Arnfjörð Bjarmason, Jun 4, 2022
  96. Junio C HamanoJun 6, 2022
  97. 3/7 object-file.c: refactor write_loose_object() to several stepsÆvar Arnfjörð Bjarmason, Jun 4, 2022
  98. 4/7 object-file.c: factor out deflate part of write_loose_object()Ævar Arnfjörð Bjarmason, Jun 4, 2022
  99. 5/7 object-file.c: add "stream_loose_object()" to handle large objectÆvar Arnfjörð Bjarmason, Jun 4, 2022
  100. Junio C HamanoJun 6, 2022
  101. Junio C HamanoJun 6, 2022
  102. Han XinJun 9, 2022
  103. Han XinJun 9, 2022
  104. Neeraj SinghJun 7, 2022
  105. Junio C HamanoJun 8, 2022
  106. object-file.c: batched disk flushes for stream_loose_object()Han Xin, Jun 9, 2022
  107. Neeraj SinghJun 9, 2022
  108. Johannes SchindelinJun 9, 2022
  109. Han XinJun 10, 2022
  110. 7/7 unpack-objects: use stream_loose_object() to unpack large objectsÆvar Arnfjörð Bjarmason, Jun 4, 2022
  111. 6/7 core doc: modernize core.bigFileThreshold documentationÆvar Arnfjörð Bjarmason, Jun 4, 2022
  112. Junio C HamanoJun 6, 2022
  113. 0/7 unpack-objects: support streaming blobs to diskHan Xin, Jun 10, 2022
  114. 1/7 unpack-objects: low memory footprint for get_data() in dry_run modeHan Xin, Jun 10, 2022
  115. 2/7 object-file.c: do fsync() and close() before post-write die()Han Xin, Jun 10, 2022
  116. René ScharfeJun 10, 2022
  117. Junio C HamanoJun 10, 2022
  118. Han XinJun 11, 2022
  119. 3/7 object-file.c: refactor write_loose_object() to several stepsHan Xin, Jun 10, 2022
  120. 4/7 object-file.c: factor out deflate part of write_loose_object()Han Xin, Jun 10, 2022
  121. 5/7 object-file.c: add "stream_loose_object()" to handle large objectHan Xin, Jun 10, 2022
  122. 6/7 core doc: modernize core.bigFileThreshold documentationHan Xin, Jun 10, 2022
  123. Junio C HamanoJun 10, 2022
  124. 7/7 unpack-objects: use stream_loose_object() to unpack large objectsHan Xin, Jun 10, 2022
  125. 0/6 unpack-objects: support streaming blobs to diskHan Xin, Jun 11, 2022
  126. 1/6 unpack-objects: low memory footprint for get_data() in dry_run modeHan Xin, Jun 11, 2022
  127. 2/6 object-file.c: refactor write_loose_object() to several stepsHan Xin, Jun 11, 2022
  128. 3/6 object-file.c: factor out deflate part of write_loose_object()Han Xin, Jun 11, 2022
  129. 4/6 object-file.c: add "stream_loose_object()" to handle large objectHan Xin, Jun 11, 2022
  130. 5/6 core doc: modernize core.bigFileThreshold documentationHan Xin, Jun 11, 2022
  131. 6/6 unpack-objects: use stream_loose_object() to unpack large objectsHan Xin, Jun 11, 2022
  132. Junio C HamanoJul 1, 2022
  133. 0/1 unpack-objects: low memory footprint for get_data() in dry_run modeHan Xin, May 20, 2022
  134. 1/1 unpack-objects: low memory footprint for get_data() in dry_run modeHan Xin, May 20, 2022
  135. 2/5 object-file.c: refactor write_loose_object() to several stepsHan Xin, Jan 20, 2022
  136. 3/5 object-file.c: add "stream_loose_object()" to handle large objectHan Xin, Jan 20, 2022
  137. 4/5 unpack-objects: unpack_non_delta_entry() read data in a streamHan Xin, Jan 20, 2022
  138. 5/5 object-file API: add a format_object_header() functionHan Xin, Jan 20, 2022
  139. 1/6 unpack-objects: low memory footprint for get_data() in dry_run modeHan Xin, Jan 8, 2022
  140. René ScharfeJan 8, 2022
  141. Han XinJan 11, 2022
  142. 2/6 object-file.c: refactor write_loose_object() to several stepsHan Xin, Jan 8, 2022
  143. René ScharfeJan 8, 2022
  144. Han XinJan 11, 2022
  145. 3/6 object-file.c: remove the slash for directory_size()Han Xin, Jan 8, 2022
  146. René ScharfeJan 8, 2022
  147. Han XinJan 11, 2022
  148. 4/6 object-file.c: add "stream_loose_object()" to handle large objectHan Xin, Jan 8, 2022
  149. 6/6 object-file API: add a format_object_header() functionHan Xin, Jan 8, 2022
  150. 5/6 unpack-objects: unpack_non_delta_entry() read data in a streamHan Xin, Jan 8, 2022
  151. 1/6 object-file.c: release strbuf in write_loose_object()Han Xin, Dec 17, 2021
  152. René ScharfeDec 17, 2021
  153. Junio C HamanoDec 18, 2021
  154. 2/6 object-file.c: refactor object header generation into a functionHan Xin, Dec 17, 2021
  155. object-file API: add a format_loose_header() functionÆvar Arnfjörð Bjarmason, Dec 20, 2021
  156. Philip OakleyDec 20, 2021
  157. Junio C HamanoDec 20, 2021
  158. Ævar Arnfjörð BjarmasonDec 21, 2021
  159. Junio C HamanoDec 21, 2021
  160. Ævar Arnfjörð BjarmasonDec 21, 2021
  161. Han XinDec 21, 2021
  162. 3/6 object-file.c: refactor write_loose_object() to reuse in stream versionHan Xin, Dec 17, 2021
  163. 4/6 object-file.c: make "write_object_file_flags()" to support read in streamHan Xin, Dec 17, 2021
  164. René ScharfeDec 17, 2021
  165. 5/6 unpack-objects.c: add dry_run mode for get_data()Han Xin, Dec 17, 2021
  166. René ScharfeDec 17, 2021
  167. 6/6 unpack-objects: unpack_non_delta_entry() read data in a streamHan Xin, Dec 17, 2021
  168. 1/6 object-file: refactor write_loose_object() to support read from streamHan Xin, Dec 10, 2021
  169. 2/6 object-file.c: handle undetermined oid in write_loose_object()Han Xin, Dec 10, 2021
  170. Ævar Arnfjörð BjarmasonDec 13, 2021
  171. 3/6 object-file.c: read stream in a loop in write_loose_object()Han Xin, Dec 10, 2021
  172. 4/6 unpack-objects.c: add dry_run mode for get_data()Han Xin, Dec 10, 2021
  173. 5/6 object-file.c: make "write_object_file_flags()" to support "HASH_STREAM"Han Xin, Dec 10, 2021
  174. 6/6 unpack-objects: unpack_non_delta_entry() read data in a streamHan Xin, Dec 10, 2021
  175. Ævar Arnfjörð BjarmasonDec 13, 2021
  176. 1/5 object-file: refactor write_loose_object() to read buffer from streamHan Xin, Dec 3, 2021
  177. Ævar Arnfjörð BjarmasonDec 3, 2021
  178. Han XinDec 6, 2021
  179. 2/5 object-file.c: handle undetermined oid in write_loose_object()Han Xin, Dec 3, 2021
  180. Ævar Arnfjörð BjarmasonDec 3, 2021
  181. Han XinDec 6, 2021
  182. Ævar Arnfjörð BjarmasonDec 3, 2021
  183. Han XinDec 6, 2021
  184. 3/5 object-file.c: read stream in a loop in write_loose_object()Han Xin, Dec 3, 2021
  185. 4/5 unpack-objects.c: add dry_run mode for get_data()Han Xin, Dec 3, 2021
  186. Ævar Arnfjörð BjarmasonDec 3, 2021
  187. Han XinDec 6, 2021
  188. 5/5 unpack-objects: unpack_non_delta_entry() read data in a streamHan Xin, Dec 3, 2021
  189. Ævar Arnfjörð BjarmasonDec 3, 2021
  190. Han XinDec 7, 2021
  191. Ævar Arnfjörð BjarmasonDec 3, 2021
  192. Han XinDec 7, 2021
  193. Ævar Arnfjörð BjarmasonDec 3, 2021
  194. Han XinDec 7, 2021
  195. 2/5 object-file.c: handle undetermined oid in write_loose_object()Han Xin, Nov 22, 2021
  196. Derrick StoleeNov 29, 2021
  197. Junio C HamanoNov 29, 2021
  198. Derrick StoleeNov 29, 2021
  199. Han XinNov 30, 2021
  200. 1/5 object-file: refactor write_loose_object() to read buffer from streamHan Xin, Nov 22, 2021
  201. Junio C HamanoNov 23, 2021
  202. Han XinNov 24, 2021
  203. 3/5 object-file.c: read stream in a loop in write_loose_object()Han Xin, Nov 22, 2021
  204. 4/5 unpack-objects.c: add dry_run mode for get_data()Han Xin, Nov 22, 2021
  205. 5/5 unpack-objects: unpack_non_delta_entry() read data in a streamHan Xin, Nov 22, 2021
  206. Derrick StoleeNov 29, 2021
  207. Han XinNov 30, 2021
  208. Derrick StoleeNov 30, 2021
  209. "git hyperfine" (was: [PATCH v3 5/5] unpack-objects[...])Ævar Arnfjörð Bjarmason, Dec 1, 2021
  210. Han XinDec 2, 2021
  211. Derrick StoleeDec 2, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.