# git ls-files unreliable?

2 messages from 2010-04-02 to 2010-04-02. Participants: Gabor Gombas, Alex Riesen.
Thread: https://gitlist.dev/t/23305

## Gabor Gombas, 2010-04-02 18:08

Subject: git ls-files unreliable?
Message-ID: <20100402180842.GA5798@twister.home>
URL: https://gitlist.dev/e/20100402180842.GA5798%40twister.home

```
Hi,

I want to verify from a script that the working directory is clean. Some
time ago Linus suggested to use "git diff --quiet --cached" followed by
"git ls-files --exclude-standard -o -d -m -u". But:

$ git status
# On branch git_workdir_check
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   ../../../test
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working
#   directory)
#
#       modified:   ../../../test
#
$ git ls-files --exclude-standard -o -d -m -u
$ echo $?
0

So there _were_ uncommitted changes, "git status" showed them, but "git
ls-files" did not. Unstaging the staged changes did not help, changing a
different file did not help. Tried git versions 1.5.4.2 and 1.7.0-rc2,
both showed the same behavior.

When I did a "commit" and changed a file after that, then ls-files
started to take notice. I don't know how to reproduce the state shown
above. But this means that I cannot rely on "git ls-files" to check if
the working directory is clean; so what should I use instead?
Restriction: any solutions must work with git versions as old as 1.5.4.

Gabor

```

## Alex Riesen, 2010-04-02 20:54

Subject: Re: git ls-files unreliable?
Message-ID: <n2p81b0412b1004021354z1ca4f6b4sa4400b484d97b46e@mail.gmail.com>
URL: https://gitlist.dev/e/n2p81b0412b1004021354z1ca4f6b4sa4400b484d97b46e%40mail.gmail.com
In-Reply-To: <20100402180842.GA5798@twister.home>

```
On Fri, Apr 2, 2010 at 20:08, Gabor Gombas <gombasg@digikabel.hu> wrote:
> Hi,
>
> I want to verify from a script that the working directory is clean. Some
> time ago Linus suggested to use "git diff --quiet --cached" followed by

In your script, you seem to have missed the "diff" part

> "git ls-files --exclude-standard -o -d -m -u". But:
>
> $ git status
> # On branch git_workdir_check
> # Your branch is ahead of 'origin/master' by 1 commit.
> #
> # Changes to be committed:
> #   (use "git reset HEAD <file>..." to unstage)
> #
> #       modified:   ../../../test
> #
> # Changed but not updated:
> #   (use "git add <file>..." to update what will be committed)
> #   (use "git checkout -- <file>..." to discard changes in working
> #   directory)
> #
> #       modified:   ../../../test
> #

Here. Were is your call to "git diff --cached"?

> $ git ls-files --exclude-standard -o -d -m -u
> $ echo $?
> 0

This is correct.

> So there _were_ uncommitted changes, "git status" showed them, but "git
> ls-files" did not.

Because it is not supposed to. The command "git ls-files" just shows
the files not known to git. You have to parse the output. Not that it
is complicated in this particular case: you consider the workdir unclean
on any output.

> Restriction: any solutions must work with git versions as old as 1.5.4.

It probably will, but please check "git diff --cached" exit code.
It may be always 0, in which case you'll have to fallback to
output parsing here too.

```
