Can anyone explain, why “git status” touches the .git directory?

I currently maintain a project for a git-prompt for bash (https://github.com/magicmonty/bash-git-prompt) and I just got a bug report (https://github.com/magicmonty/bash-git-prompt/issues/97) from someone who works with Docker, who tells me, that everytime he uses the prompt, the cache is invalidated, because the .git directory is constantly touched.

I have looked into this, and found out, that it is the command git status, which touches the .git directory.
It seems, that only the directory entry itself and no contents are touched.
Can anyone explain, why this is needed, or is this maybe a bug in Git.

  • Git: Show content of file as it will look like after committing
  • Is there a 'git sed' or equivalent?
  • How to set the correct shebang for the needed Ruby version
  • Automating svn update
  • Git Autocompletion looks weird (and only half-functional)
  • How do I use git-new-workdir on windows?
  • Is there a way to show all status info, without touching the .git directory?

    Thanks for the help

    Update:

    Since the whole reason to use the git status command was, to determine the number of untracked files, I replaced it with git ls-files --others --exclude-standard | wc -l, which doesn’t need a lock.

  • What's the recommended usage of a Git symbolic reference?
  • git-tf checkin Exception in thread “main” java.lang.StackOverflowError
  • What is libintl.h and where can I get it?
  • git Undo auto merging on a specific file only not the whole branch
  • How do I get TeamCity to automatically merge a Git feature branch with master and fail the build in case of merge conflicts?
  • Jenkins unable to fetch repo - code 255 permission denied
  • One Solution collect form web for “Can anyone explain, why “git status” touches the .git directory?”

    strace git status shows that this action uses the lock file .git/index.lock, that’s why the .git‘s mtime is updated.

    git being cool, it uses the environment variable GIT_INDEX_FILE to decide which lock file to use. If unset, git uses.git/index (this is the default), but if set, git uses its value. From man git:

    GIT_INDEX_FILE

    This environment allows the specification of an alternate index file. If not specified, the default of $GIT_DIR/index is used.

    So:

    GIT_INDEX_FILE=banana git status
    

    will not update your .git‘s mtime.

    So you now have to make a decision as whether you want to go along this path or not (which certainly has many caveats).

    Good luck!

    Git Baby is a git and github fan, let's start git clone.