git aliases operate in the wrong directory

Summary: the current working directory of commands run through git aliases is wrong.

The easiest way to demonstrate this is to have a git alias like so:

  • Correctly ignore all files recursively under a specific folder except for a specific file type
  • Why isn't tilde (~) expanding inside double quotes?
  • .gitignore entire directory with whitespace in name
  • How do I preserve DIRECTORY file mode or permission in git?
  • Git: Renaming a directory in a branch
  • Git does not recognize new folder adds and its sub directories
  • [alias]
        pwd = !pwd

    So git pwd is just running the bash command pwd. One would think that the two commands’ outputs would be the same. Now, let’s try this out a few times:

    $ cd ~
    $ pwd && git pwd
    /home/limpchimp    # great!
    $ mkdir foo && cd foo && git init
    Initialized empty Git repository in /home/limpchimp/foo/.git/
    $ pwd && git pwd
    /home/limpchimp/foo  # great!
    $ mkdir bar && cd bar
    $ pwd && git pwd
    /home/limpchimp/foo   # uuhhhhhhhh...?

    It seems that git is changing the current working directory to be the first parent directory that has a .git folder (if one exists). This is very problematic; it’s screwing up certain scripts that I’ve written, which are meant to operate in a specific directory, and making me unable to use certain things as git aliases. Is there a way around this? How can I fix it?

  • How would I mount docker container filesystem?
  • How to draw(edit) an ascii git tree
  • Git - Bare repo cannot have a worktree for master branch - WHY?
  • How can I make a Pull request using Tortoise Git
  • Why is merge-based SCM better than a lock-based system?
  • Where is git Fetch data stored?
  • 2 Solutions collect form web for “git aliases operate in the wrong directory”

    This is clearly specified in the documentation as by design along with a workaround if needed.

    Git Config Alias

    Note that shell commands will be executed from the top-level directory
    of a repository, which may not necessarily be the current directory.
    GIT_PREFIX is set as returned by running git rev-parse –show-prefix
    from the original current directory

    This is a (mis?)feature, but you can work around it with $GIT_PREFIX as noted in this other stackoverflow question and answer:

    #! /bin/sh
    # script to do stuff in a git dir
    # since we're sometimes run from a git alias we need
    # to cd back into $GIT_PREFIX if it's set
    [ "$GIT_PREFIX" != "" ] && cd "$GIT_PREFIX"
    ... rest of script ...
    Git Baby is a git and github fan, let's start git clone.