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

[PATCH v14 0/7] unpack-objects: support streaming blobs to disk

From
HXHan Xin <chiyutianyi@gmail.com>
Date
Jun 10, 2022, 14:46 UTC
Message-ID
<cover.1654871915.git.chiyutianyi@gmail.com>
In-Reply-To
<cover-v13-0.7-00000000000-20220604T095113Z-avarab@gmail.com>

This series makes "unpack-objects" capable of streaming large objects to disk.

As 7/7 shows streaming e.g. a 100MB blob now uses ~5MB of memory instead of ~105MB. This streaming method is slower if you've got memory to handle the blobs in-core, but if you don't it allows you to unpack objects at all, as you might otherwise OOM.

Changes since v13:
* Make the error checking in the loop of get_data() the same way as
  we do in the non dry-run mode.
* Add batched disk flushes for stream_loose_object(). This is pointed
  out by Neeraj Singh[1].
* Minor typo/grammar/comment etc. fixes throughout.
1. https://lore.kernel.org/git/7ba4858a-d1cc-a4eb-b6d6-4c04a5dd6ce7@gmail.com/
Han Xin (4):
  unpack-objects: low memory footprint for get_data() in dry_run mode
  object-file.c: refactor write_loose_object() to several steps
  object-file.c: add "stream_loose_object()" to handle large object
  unpack-objects: use stream_loose_object() to unpack large objects
Ævar Arnfjörð Bjarmason (3):
  object-file.c: do fsync() and close() before post-write die()
  object-file.c: factor out deflate part of write_loose_object()
  core doc: modernize core.bigFileThreshold documentation
 Documentation/config/core.txt   |  33 +++--
 builtin/unpack-objects.c        | 106 ++++++++++++--
 object-file.c                   | 240 +++++++++++++++++++++++++++-----
 object-store.h                  |   8 ++
 t/t5351-unpack-large-objects.sh |  76 ++++++++++
 5 files changed, 408 insertions(+), 55 deletions(-)
 create mode 100755 t/t5351-unpack-large-objects.sh
Range-diff against v13:
1:  6703df6350 ! 1:  bf600a2fa8 unpack-objects: low memory footprint for get_data() in dry_run mode
    @@ Commit message
     
         Because in dry_run mode, "get_data()" is only used to check the
         integrity of data, and the returned buffer is not used at all, we can
    -    allocate a smaller buffer and reuse it as zstream output. Therefore,
    -    in dry_run mode, "get_data()" will release the allocated buffer and
    -    return NULL instead of returning garbage data.
    +    allocate a smaller buffer and use it as zstream output. Make the function
    +    return NULL in the dry-run mode, as no callers use the returned buffer.
     
         The "find [...]objects/?? -type f | wc -l" test idiom being used here
         is adapted from the same "find" use added to another test in
    @@ builtin/unpack-objects.c: static void use(int bytes)
      }
      
     +/*
    -+ * Decompress zstream from stdin and return specific size of data.
    ++ * Decompress zstream from the standard input into a newly
    ++ * allocated buffer of specified size and return the buffer.
     + * The caller is responsible to free the returned buffer.
     + *
     + * But for dry_run mode, "get_data()" is only used to check the
    @@ builtin/unpack-objects.c: static void *get_data(unsigned long size)
     +		if (dry_run) {
     +			/* reuse the buffer in dry_run mode */
     +			stream.next_out = buf;
    -+			stream.avail_out = bufsize;
    ++			stream.avail_out = bufsize > size - stream.total_out ?
    ++						   size - stream.total_out :
    ++						   bufsize;
     +		}
      	}
      	git_inflate_end(&stream);
2:  6e289d25c1 = 2:  a327f484f7 object-file.c: do fsync() and close() before post-write die()
3:  46f9def06c ! 3:  9bc8002282 object-file.c: refactor write_loose_object() to several steps
    @@ object-file.c: static int create_tmpfile(struct strbuf *tmp, const char *filenam
     + *
     + * - End the compression of zlib stream.
     + * - Get the calculated oid to "oid".
    -+ * - fsync() and close() the "fd"
     + */
     +static int end_loose_object_common(git_hash_ctx *c, git_zstream *stream,
     +				   struct object_id *oid)
4:  5a95ebede6 = 4:  7c73815f18 object-file.c: factor out deflate part of write_loose_object()
5:  26847541aa ! 5:  28a9588f9c object-file.c: add "stream_loose_object()" to handle large object
    @@ Commit message
         path.
     
         "freshen_packed_object()" or "freshen_loose_object()" will be called
    -    inside "stream_loose_object()" after obtaining the "oid".
    +    inside "stream_loose_object()" after obtaining the "oid". After the
    +    temporary file is written, we wants to mark the object to recent and we
    +    may find that where indeed is already the object. We should remove the
    +    temporary and do not leave a new copy of the object.
     
         Helped-by: René Scharfe <l.s.r@web.de>
         Helped-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
    @@ object-file.c: static int freshen_packed_object(const struct object_id *oid)
     +	char hdr[MAX_HEADER_LEN];
     +	int hdrlen;
     +
    ++	if (batch_fsync_enabled(FSYNC_COMPONENT_LOOSE_OBJECT))
    ++		prepare_loose_object_bulk_checkin();
    ++
     +	/* Since oid is not determined, save tmp file to odb path. */
     +	strbuf_addf(&filename, "%s/", get_object_directory());
     +	hdrlen = format_object_header(hdr, sizeof(hdr), OBJ_BLOB, len);
    @@ object-file.c: static int freshen_packed_object(const struct object_id *oid)
     +		die(_("write stream object %ld != %"PRIuMAX), stream.total_in,
     +		    (uintmax_t)len + hdrlen);
     +
    -+	/* Common steps for write_loose_object and stream_loose_object to
    ++	/*
    ++	 * Common steps for write_loose_object and stream_loose_object to
     +	 * end writing loose oject:
     +	 *
     +	 *  - End the compression of zlib stream.
6:  eb962b60b9 ! 6:  dea5c4172b core doc: modernize core.bigFileThreshold documentation
    @@ Documentation/config/core.txt: You probably do not need to adjust this value.
     +Files above the configured limit will be:
      +
     -Common unit suffixes of 'k', 'm', or 'g' are supported.
    -+* Stored deflated, without attempting delta compression.
    ++* Stored deflated in packfiles, without attempting delta compression.
     ++
     +The default limit is primarily set with this use-case in mind. With it
     +most projects will have their source code and other text files delta
    @@ Documentation/config/core.txt: You probably do not need to adjust this value.
     +usage, at the slight expense of increased disk usage.
     ++
     +* Will be treated as if though they were labeled "binary" (see
    -+  linkgit:gitattributes[5]). This means that e.g. linkgit:git-log[1]
    -+  and linkgit:git-diff[1] will not diffs for files above this limit.
    ++  linkgit:gitattributes[5]). e.g. linkgit:git-log[1] and
    ++  linkgit:git-diff[1] will not diffs for files above this limit.
     ++
     +* Will be generally be streamed when written, which avoids excessive
     +memory usage, at the cost of some fixed overhead. Commands that make
7:  88a2754fcb ! 7:  d236230a4c unpack-objects: use stream_loose_object() to unpack large objects
    @@ t/t5351-unpack-large-objects.sh: test_description='git unpack-objects with large
      }
      
      test_expect_success "create large objects (1.5 MB) and PACK" '
    +@@ t/t5351-unpack-large-objects.sh: test_expect_success "create large objects (1.5 MB) and PACK" '
    + 	test_commit --append foo big-blob &&
    + 	test-tool genrandom bar 1500000 >big-blob &&
    + 	test_commit --append bar big-blob &&
    +-	PACK=$(echo HEAD | git pack-objects --revs pack)
    ++	PACK=$(echo HEAD | git pack-objects --revs pack) &&
    ++	git verify-pack -v pack-$PACK.pack >out &&
    ++	sed -n -e "s/^\([0-9a-f][0-9a-f]*\).*\(commit\|tree\|blob\).*/\1/p" \
    ++		<out >obj-list
    + '
    + 
    + test_expect_success 'set memory limitation to 1MB' '
     @@ t/t5351-unpack-large-objects.sh: test_expect_success 'set memory limitation to 1MB' '
      '
      
    @@ t/t5351-unpack-large-objects.sh: test_expect_success 'set memory limitation to 1
     +	test_dir_is_empty dest.git/objects/pack
     +'
     +
    ++BATCH_CONFIGURATION='-c core.fsync=loose-object -c core.fsyncmethod=batch'
    ++
    ++test_expect_success 'unpack big object in stream (core.fsyncmethod=batch)' '
    ++	prepare_dest 1m &&
    ++	GIT_TRACE2_EVENT="$(pwd)/trace2.txt" \
    ++		git -C dest.git $BATCH_CONFIGURATION unpack-objects <pack-$PACK.pack &&
    ++	grep fsync/hardware-flush trace2.txt &&
    ++	test_dir_is_empty dest.git/objects/pack &&
    ++	git -C dest.git cat-file --batch-check="%(objectname)" <obj-list >current &&
    ++	cmp obj-list current
    ++'
    ++
     +test_expect_success 'do not unpack existing large objects' '
     +	prepare_dest 1m &&
     +	git -C dest.git index-pack --stdin <pack-$PACK.pack &&
-- 
2.36.1
Previous: Junio C HamanoNext: Han Xin
Message 113 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.