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

RE: [PATCH 1/1] reset: fix reset when using the sparse-checkout feature.

From
KWKevin Willford <kewillf@microsoft.com>
Date
Sep 9, 2017, 04:54 UTC
Message-ID
<SN1PR21MB00140C84DC02F3491F4E8469B76A0@SN1PR21MB0014.namprd21.prod.outlook.com>
In-Reply-To
<xmqqr2vgy2yt.fsf@gitster.mtv.corp.google.com>
Show 34 quoted lines
> From: Junio C Hamano [mailto:gitster@pobox.com]
> Sent: Friday, September 8, 2017 9:18 PM
> 
> Kevin Willford <kewillf@microsoft.com> writes:
> 
> > 1. reset mixed when there were files that were added
> >
> > In this case the index will no longer have the entry at all because
> > the reset is making the index look like before the file was added
> > which didn't have it. When not using the sparse-checkout this is fine
> > because the file is in the working directory and the reset didn't touch
> > it.  But using the sparse-checkout on that file and if the file was not
> > in the working directory, the index gets reset and the entry for that
> > file is gone and if we don't put the index version of the file before the
> > reset into the working directory, then we have lost the content for
> > that file
> 
> I do not quite understand this argument.  If you do
> 
> 	edit $path
> 	git add $path
> 	rm $path
> 	git reset
> 
> for a $path that is not involved in the sparse thing, the version
> that was previously indexed will be lost, but that is fine---the
> user said that version is expendable by saying "reset".
> 
> How would that be different when the $path were not to be
> materialized in the working tree due to sparseness?  Where did that
> "blob" object in the index immediately before you called "reset"
> came from, and why do you say that the user does *not* consider that
> one expendable, unlike the case for non-sparse path example above?
> 
I guess that I should have said files that were newly added, meaning they
are new files that were created and added in the previous commit.
 
I think that the difference is that the user explicitly removed the file. When
using sparse it is git that is causing the removal of the file.  For example
if I have /file in my spare-checkout file so that I am only working on the one
file.  The previous commit had new file2 added and I run a git reset HEAD~1.
I as the user do not expect that file2 just disappear, but yet that is what
happens.  So from you example above if I do.
	create $path
	git add $path
	git commit
	git checkout // where $path is not in the sparse-checkout
	git reset HEAD~1

$path will be gone yet I the user did not remove it. I guess you could argue that the user did when they specified their sparse-checkout and ran checkout but I wouldn't know what would go missing unless I ran a diff before the reset to see. There could have been X number of files created and added in the previous commit(s) and status after the reset would not report them and they are gone. So I could clone, setup sparse-checkout, checkout, reset HEAD~X and possibly lose data I didn't expect to.

In the modified case where the previous commits have modifications to files outside the sparse-checkout at least the status after the reset reports the file as deleted so the user sees that something has happened to it.

I suppose the entry could stay in the index with the skip-worktree bit on and not removed like it is now so that a git reset will only apply to the entries in the sparse-checkout? That seems like it would be changing the meaning of reset.

Show 12 quoted lines
> I suspect that a similar reasoning would apply to your 2., but I
> didn't think it through.
> 
> The possible misconception, which I perceive in both of these, is
> that you are somehow disagreeing with this basic assumption: by
> saying "git reset [<tree-ish>]", the user is telling us that the
> version in the index, even if that is different from HEAD,
> <tree-ish>, or the file in the working tree, is *unwanted* and be
> replaced with the one in HEAD (or <tree-ish> when given).  Touching
> the working tree files upon "git reset" is the last thing the user
> expects to happen.
> 

I agree with this when you are not dealing with a sparse-checkout. When using a sparse-checkout I expect git not to touch things outside of what I have specified in my sparse-checkout file. If it does, it should let me know or put my working directory in a state that is expected. Especially when it is changing the skip-worktree bits causing files outside the sparse-checkout to be reported incorrectly by status.

 
Previous: Junio C HamanoNext: Junio C Hamano
Message 10 of 23 in “reset: fix mixed reset when using sparse-checkout”
  1. 0/1 reset: fix mixed reset when using sparse-checkoutKevin Willford, Sep 8, 2017
  2. 1/1 reset: fix reset when using the sparse-checkout feature.Kevin Willford, Sep 8, 2017
  3. Torsten BögershausenSep 8, 2017
  4. Junio C HamanoSep 8, 2017
  5. Junio C HamanoSep 8, 2017
  6. Kevin WillfordSep 8, 2017
  7. Junio C HamanoSep 8, 2017
  8. Kevin WillfordSep 8, 2017
  9. Junio C HamanoSep 9, 2017
  10. Kevin WillfordSep 9, 2017
  11. Junio C HamanoSep 11, 2017
  12. Johannes SchindelinSep 11, 2017
  13. Junio C HamanoSep 12, 2017
  14. Kevin WillfordSep 12, 2017
  15. Jacob KellerSep 12, 2017
  16. Kevin WillfordSep 12, 2017
  17. Jacob KellerSep 13, 2017
  18. Kevin WillfordSep 13, 2017
  19. Junio C HamanoSep 13, 2017
  20. Kevin WillfordSep 14, 2017
  21. Junio C HamanoSep 15, 2017
  22. Kevin WillfordSep 15, 2017
  23. Jacob KellerSep 15, 2017

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.