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

Re: git add --patch newfile doesn't add newfile to cache ?

From
MWMarc Weber <marco-oweber@gmx.de>
Date
Oct 22, 2008, 13:12 UTC
Message-ID
<20081022131232.GL3988@gmx.de>
In-Reply-To
<20081020235049.GA23120@coredump.intra.peff.net>
On Mon, Oct 20, 2008 at 07:50:50PM -0400, Jeff King wrote:
Show 12 quoted lines
> On Mon, Oct 20, 2008 at 04:36:36PM +0200, Marc Weber wrote:
> 
> > Is this desired behaviour?
> > [...]
> >         git init
> >         echo test > test
> >         git add --patch test
> >         echo "running status, nothing has been added"
> >         git status
> 
> I think your example makes sense, but nobody ever really tried it
> before. [..]
I came across this use case because I'm lazy. eg
        git add --patch file-to-be-committed-partly  newfile
is shorter than
        git add --patch file-to-be-committed-partly
        git add newfile
Show 27 quoted lines
> I use "git add -p" all the time, but almost always when I am
> adding a new file, I add the whole contents.
> 
> I think there are two ways to go about fixing it:
> 
>   - in git-add--interactive.perl, the function patch_update_cmd
>     explicitly looks at the list of modified files. It would have to
>     also check for untracked files, which is easy. But we also need to
>     keep track of which files are modified and which are untracked
>     through the whole patching procedure, which is a bit more invasive.
> 
>   - the recently-added "git add -N" adds an empty file into the index,
>     at which point we could add content in the normal way. So:
> 
>       git add -N test
>       git add -p test
> 
>     should just work (but obviously requires two steps from the user).
>     You could do something more automatic like the patch below, but I
>     think the semantics aren't quite right. If you stage nothing for a
>     newly added file, then you still end up with an empty version of the
>     staged file in the index. I would expect the semantics to be:
> 
>       1. if you stage any content, then the file is added to the index
>          with that content
> 
>       2. if you stage no content, then the file remains untracked
Show 10 quoted lines
> ---
> diff --git a/git-add--interactive.perl b/git-add--interactive.perl
> [...]
>  sub patch_update_cmd {
> +	my @new = list_untracked();
> +	if (@new) {
> +		system(qw(git add -N), @new)
> +			and die "git add reported failure";
> +	}
> +
 

I've tried the patch. However I'm not fully satisified. I often use --patch to have another second look at each change to be committed. Your patch adds new files to the cache silently without giving the user the change to omit or edit the patch. But exatly that's the reason I'm using --patch. So maybe I can work on this in some days.. Maybe I've also injected those lines into the wrong git version (1.6.0.2.GIT)

May I try rewriting your semantics proposal to this ?
      1) when using git add --patch untracked-file the user should be
         given the default patch view (only containing + lines)
         so that he can use edit to only commit parts of the file in the
         usual way. (I guess this is similar to having used git add -N
         before, I haven't tried yet)
      2) if he wants to skip the entire patch / file nothing should be
         added to the index.
Thanks for your reply.

Sincerly Marc Weber

Previous: Jeff KingNext: Jeff King
Message 3 of 4 in “git add --patch newfile doesn't add newfile to cache ?”
  1. Marc WeberOct 20, 2008
  2. Jeff KingOct 20, 2008
  3. Marc WeberOct 22, 2008
  4. Jeff KingOct 22, 2008

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.