Re: [BUG] 'add -u' doesn't work from untracked subdir
From: Jeff King <hidden>
Date: 2016-06-15 22:47:20
On Wed, Sep 02, 2009 at 10:03:05AM +0200, SZEDER Gábor wrote:
As the subject says, 'git add -u' does not work from an untracked subdir, because it doesn't add modified files to the index. The following script reproduces the issue: mkdir repo cd repo git init echo 1 >foo git add foo git commit -m first echo 2 >foo mkdir untracked_subdir cd untracked_subdir git add -u git diff It worked in the initial 'git add -u' implementation (dfdac5d, git-add -u: match the index with working tree, 2007-04-20), but 2ed2c222 (git-add -u paths... now works from subdirectory, 2007-08-16) broke it later, and is broken ever since.
It is not just untracked subdirs. Try:
mkdir repo && cd repo && git init
echo 1 >foo
mkdir subdir
echo 1 >subdir/bar
git add . && git commit -m first
echo 2 >foo
echo 2 >subdir/bar
cd subdir
git add -u
git diff ;# still shows foo/1 in index
git diff --cached ;# shows subdir/bar was updated
While I have sometimes found the behavior a bit annoying[1], I always
assumed that was the intended behavior.
And indeed, in modern builtin-add.c, we find this:
if ((addremove || take_worktree_changes) && !argc) {
static const char *here[2] = { ".", NULL };
argc = 1;
argv = here;
}
which seems pretty explicit.
-Peff
[1] I would prefer "git add -u ." to add only the current directory, and
"git add -u" to touch everything. But then, I am one of the people who
turn off status.relativepaths, so I think I may be in the minority in
always wanting to think of the project as a whole.