How to get git-status of a single subfolder?

Git

Git Problem Overview


When I do git status in a subfolder of my repository it includes the status of parent folders also.

Is there a way to constrain git-status to just a particular folder?

Git Solutions


Solution 1 - Git

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 - Git

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)*'

Solution 3 - Git

Imperfect, but this works as well from within the the directory you are interested in:

git status | grep -v ' \.\./'

That will hide all directories that would require an upward reference in their relative path.

If you want to get color spitting out the other end, set color.status to always:

git config color.status always

Solution 4 - Git

Some plumbing commands do take a directory as parameter:

git ls-files -t -o -m aDirectory

would give you all files changed but not updated (not added to stage), or untracked. And that for a directory.

As written in this thread, git ls-files does not support a '--added option.

> more fundamental reason is because ls-files plumbing is about the index.
> Added is not about comparison between the index and the work tree.
> It is between the HEAD commit and the index, and it does not belong to ls-files plumbing.

So, using commands mentioned here:

git diff-index --name-only -B -R -M -C HEAD src

would give you both non-added and added files

git diff-files --name-only -B -R -M -C src

would give you only non-added files. (while detecting rewrites, renames, copies, ...)

As usual with plumbing commands, some scripting is in order ;)

Solution 5 - Git

For me this worked:

git status -uall

Solution 6 - Git

When I tried git, I didn't find a way to do that.

I ended up doing:

x@x:~/x$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       b
#       main/a
nothing added to commit but untracked files present (use "git add" to track)

x@x:~/x$ git status | grep main
#       main/a

Solution 7 - Git

cd YOUR_REQUIRED_DIRECTORY , then,
git status .

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionEoghanMView Question on Stackoverflow
Solution 1 - GitMatt CurtisView Answer on Stackoverflow
Solution 2 - GitJoël ConraudView Answer on Stackoverflow
Solution 3 - GitMarcus GriepView Answer on Stackoverflow
Solution 4 - GitVonCView Answer on Stackoverflow
Solution 5 - Gitsauravjoshi23View Answer on Stackoverflow
Solution 6 - GitMacarseView Answer on Stackoverflow
Solution 7 - GitRatna HalderView Answer on Stackoverflow