How to get git-status of a single subfolder?

Solution 1:

git status .

will show the status of the current directory and subdirectories.

For instance, given files (numbers) in this tree:

a/1
a/2
b/3
b/4
b/c/5
b/c/6

from subdirectory "b", git status shows new files in the whole tree:

% git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   ../a/1
#   new file:   ../a/2
#   new file:   3
#   new file:   4
#   new file:   c/5
#   new file:   c/6
#

but git status . just shows files in "b" and below.

% git status .
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   3
#   new file:   4
#   new file:   c/5
#   new file:   c/6
#

Just this subdirectory, not below

git status . shows all files below "b" recursively. To show just the files in the "b" but not below, you need to pass a list of just the files (and not directories) to git status. This is a bit fiddly, depending on your shell.

Zsh

In zsh you can select ordinary files with the "glob qualifier" (.). For example:

% git status *(.)
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4

Bash

Bash doesn't have glob qualifiers but you can use GNU find to select ordinary files and then pass them along to git status like so:

bash-3.2$ find . -type f -maxdepth 1 -exec git status {} +
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4

This uses -maxdepth which is a GNU find extension. POSIX find doesn't have -maxdepth, but you can do this:

bash-3.2$ find . -path '*/*' -prune -type f -exec git status {} +
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4

Solution 2:

It is possible to restrict git status to the current directory (without child folders) by giving a pathspec using the magic word glob and *::

git status ':(glob)*'