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

Re: [PATCH v7 0/2] diff-files: integrate with sparse index

From
Victoria Dye <vdye@github.com>
Date
Mar 23, 2023, 17:25 UTC
Message-ID
<29eb319d-baf0-22d5-12b4-3e8ee7323050@github.com>
In-Reply-To
<CAMO4yUFshQ_bP3gXeZhfHQ3OevC+_3qKwa-iy2nNGScvRouu6Q@mail.gmail.com>
Shuqi Liang wrote:
Show 16 quoted lines
> On Wed, Mar 22, 2023 at 7:36 PM Junio C Hamano <gitster@pobox.com> wrote:
> 
>>> 3. Use `--stat` to ignore file creation time differences in unrefreshed
>>> index.
>>
>> I am curious about this one.  Why is this a preferred solution over
>> say "run 'update-index --refresh' before running diff-files"?
>>
>> Note that this is merely "I am curious", not "I think it is wrong".
> 
> Hi Junio
> 
> Thank you for your question, it has prompted me to consider the matter
> further =)  I think both solutions, using git diff-files --stat and using git
> update-index --refresh before git diff-files, can produce the same output but
> in different ways.

While they'll (ideally) give the same user-facing result, there is a difference in how they exercise 'diff-files' because of how 'update-index --refresh' will affect SKIP_WORKTREE and sparse directories.

Using the same scenario you've set up for your test, suppose I start with a fresh copy of the 't1092' repo. In the 'sparse-index' repo copy, 'folder1/' will be a sparse directory:

$ git ls-files -t --sparse folder1/ S folder1/

(note: "S" indicates that SKIP_WORKTREE is applied to the entry)

Now suppose I copy 'a' into 'folder1/' and run 'update-index --refresh' then 'ls-files' again:

$ git update-index --refresh $ git ls-files -t --sparse folder1/ S folder1/0/ H folder1/a

(note: "H" indicates that 'folder1/a' does not have SKIP_WORKTREE applied)

The sparse directory has been expanded and SKIP_WORKTREE has been removed from the file that's now present on-disk. This was an intentional "safety" measure added in [1] to address the growing volume of bugs and complexities in scenarios where SKIP_WORKTREE files existed on disk.

Ultimately, the main difference between this test with & without 'update-index' is who applies those index corrections when initially reading the index: 'update-index' or 'diff-files'. I lean towards the latter because the former is tested (almost identically) in 'update-index modify outside sparse definition' earlier in 't1092'.

[1] https://lore.kernel.org/git/pull.1114.v2.git.1642175983.gitgitgadget@gmail.com/
Show 5 quoted lines
> 
> When the index file is not up-to-date, git diff-files may show differences
> between the working directory and the index that are caused by file creation
> time differences, rather than actual changes to the file contents. By using git
> diff-files --stat, which ignores file creation time differences.

More or less, yes. Internally, 'diff-files' will "see" the file creation differences, but the '--stat' format doesn't print them.

Show 5 quoted lines
> 
> While 'git update-index --refresh' updates the index file to match the contents
> of the working tree. By running this command before git diff-files, we can
> ensure that the index file is up-to-date and that the output of git diff-files
> accurately reflects the differences between the working directory and the index.

This isn't quite true - 'update-index' only updates the *contents* of index entries (or, colloquially, "stage them for commit") for files explicitly provided as arguments. Separately, though, '--refresh' updates *all* index entries' cached 'stat' information.

Going a bit deeper: with no arguments, 'update-index' will read the index, do nothing to it, then write it only if something has changed. In almost all cases, reading the index doesn't cause any changes to it, making it a no-op. However, the removal of SKIP_WORKTREE is done on read (including a refresh of the entry's stat information), so a even plain 'update-index' *without* '--refresh' would write a modified index to disk. In your test, that means:

	run_on_sparse mkdir -p folder1 &&
	run_on_sparse cp a folder1/a &&
	run_on_all git update-index &&
	test_all_match git diff-files
would get you the same result as:
	run_on_sparse mkdir -p folder1 &&
	run_on_sparse cp a folder1/a &&
	run_on_all git update-index --refresh &&
	test_all_match git diff-files
Show 5 quoted lines
> 
> Maybe using git update-index --refresh would be more direct and
> straightforward solution.
> 
> (Hi Victoria, do you have any comments?  =)

I hope the above explanation is helpful. I still think '--stat' is the best way to test this case, but I'm interested to hear your/others' thoughts on the matter given the additional context.

> 
> 
> Thanks
> Shuqi
Previous: Shuqi LiangNext: Junio C Hamano
Message 47 of 73 in “t1092: add tests for `git diff-files`”
  1. Shuqi LiangMar 4, 2023
  2. Derrick StoleeMar 6, 2023
  3. 0/2 diff-files: integrate with sparse indexShuqi Liang, Mar 7, 2023
  4. 2/2 diff-files: integrate with sparse indexShuqi Liang, Mar 7, 2023
  5. 1/2 t1092: add tests for `git diff-files`Shuqi Liang, Mar 7, 2023
  6. Junio C HamanoMar 7, 2023
  7. Shuqi LiangMar 8, 2023
  8. Junio C HamanoMar 8, 2023
  9. 0/2 diff-files: integrate with sparse indexShuqi Liang, Mar 9, 2023
  10. 1/2 t1092: add tests for `git diff-files`Shuqi Liang, Mar 9, 2023
  11. Junio C HamanoMar 9, 2023
  12. 2/2 diff-files: integrate with sparse indexShuqi Liang, Mar 9, 2023
  13. 0/2 diff-files: integrate with sparse indexShuqi Liang, Mar 9, 2023
  14. 2/2 diff-files: integrate with sparse indexShuqi Liang, Mar 9, 2023
  15. 1/2 t1092: add tests for `git diff-files`Shuqi Liang, Mar 9, 2023
  16. Junio C HamanoMar 9, 2023
  17. Shuqi LiangMar 9, 2023
  18. Junio C HamanoMar 9, 2023
  19. 0/2 diff-files: integrate with sparse indexShuqi Liang, Mar 10, 2023
  20. 1/2 t1092: add tests for `git diff-files`Shuqi Liang, Mar 10, 2023
  21. Victoria DyeMar 10, 2023
  22. Shuqi LiangMar 20, 2023
  23. 2/2 diff-files: integrate with sparse indexShuqi Liang, Mar 10, 2023
  24. Victoria DyeMar 10, 2023
  25. 0/2 diff-files: integrate with sparse indexShuqi Liang, Mar 20, 2023
  26. 2/2 diff-files: integrate with sparse indexShuqi Liang, Mar 20, 2023
  27. Victoria DyeMar 21, 2023
  28. 1/2 t1092: add tests for `git diff-files`Shuqi Liang, Mar 20, 2023
  29. Victoria DyeMar 21, 2023
  30. Junio C HamanoMar 21, 2023
  31. Victoria DyeMar 21, 2023
  32. Victoria DyeMar 21, 2023
  33. 0/2 diff-files: integrate with sparse indexShuqi Liang, Mar 22, 2023
  34. 1/2 t1092: add tests for `git diff-files`Shuqi Liang, Mar 22, 2023
  35. Victoria DyeApr 13, 2023
  36. 2/2 diff-files: integrate with sparse indexShuqi Liang, Mar 22, 2023
  37. Victoria DyeApr 13, 2023
  38. Shuqi LiangApr 20, 2023
  39. Victoria DyeApr 20, 2023
  40. Shuqi LiangApr 21, 2023
  41. Victoria DyeApr 21, 2023
  42. Shuqi LiangApr 22, 2023
  43. Junio C HamanoMar 22, 2023
  44. Shuqi LiangMar 23, 2023
  45. Junio C HamanoMar 23, 2023
  46. Shuqi LiangMar 23, 2023
  47. Victoria DyeMar 23, 2023
  48. Junio C HamanoApr 13, 2023
  49. Victoria DyeApr 13, 2023
  50. 0/2 diff-files: integrate with sparse indexShuqi Liang, Apr 23, 2023
  51. 1/2 t1092: add tests for `git diff-files`Shuqi Liang, Apr 23, 2023
  52. 2/2 diff-files: integrate with sparse indexShuqi Liang, Apr 23, 2023
  53. Victoria DyeMay 1, 2023
  54. Junio C HamanoApr 25, 2023
  55. Junio C HamanoMay 1, 2023
  56. 0/2 diff-files: integrate with sparse indexShuqi Liang, May 2, 2023
  57. 1/2 t1092: add tests for `git diff-files`Shuqi Liang, May 2, 2023
  58. Junio C HamanoMay 2, 2023
  59. Victoria DyeMay 3, 2023
  60. 2/2 diff-files: integrate with sparse indexShuqi Liang, May 2, 2023
  61. 0/2 diff-files: integrate with sparse indexShuqi Liang, May 3, 2023
  62. 1/2 t1092: add tests for `git diff-files`Shuqi Liang, May 3, 2023
  63. Junio C HamanoMay 3, 2023
  64. 2/2 diff-files: integrate with sparse indexShuqi Liang, May 3, 2023
  65. 0/2 diff-files: integrate with sparse indexShuqi Liang, May 8, 2023
  66. 1/2 t1092: add tests for `git diff-files`Shuqi Liang, May 8, 2023
  67. Victoria DyeMay 8, 2023
  68. 2/2 diff-files: integrate with sparse indexShuqi Liang, May 8, 2023
  69. 0/2 diff-files: integrate with sparse indexShuqi Liang, May 9, 2023
  70. 1/2 t1092: add tests for `git diff-files`Shuqi Liang, May 9, 2023
  71. 2/2 diff-files: integrate with sparse indexShuqi Liang, May 9, 2023
  72. Victoria DyeMay 11, 2023
  73. Junio C HamanoMay 11, 2023

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.