Dan
Dan

Reputation: 4502

How can I get git's `.git` path from git itself?

I am trying to write a shell script that needs to be able to find the .git folder for the current directory, correctly handling all of the following possibilities:

I have this:

seemsToBeGitdir() {
    # Nothing special about "config --local -l" here, it's just a git
    # command that errors out if the `--git-dir` argument is wrong.
    git --git-dir "$1" config --local -l >/dev/null 2>/dev/null
    return $?
}

gitdir() {
    local cursor relpath
    if [ "$GIT_DIR" ]; then
        echo "$GIT_DIR"
        return 0
    fi
    cursor="$(pwd)"
    while [ -e "$cursor" ] && ! seemsToBeGitdir "$cursor"; do
        # Git won't traverse mountpoints looking for .git
        if mountpoint -q "$cursor"; then
            return 1
        fi

        # We might be in a submodule
        if [ -f "$cursor/.git" ]; then
            # If .git is a file, its syntax is "gitdir: " followed by a
            # relative path.
            relpath="$(awk '/^gitdir:/{print$2}' "$cursor/.git")"
            # convert the relative path to an absolute path.
            cursor="$(readlink -f "$cursor/$relpath")"
            continue
        fi

        if seemsToBeGitdir "$cursor/.git"; then
            echo "$cursor/.git"
            return 0
        fi

        cursor="$(dirname "$cursor")"
    done
    echo "$cursor"
}

And it works, but seems way too complicated -- clearly, git itself does this sort of calculation every time it's invoked. Is there a way to make git itself tell me where .git is?

Upvotes: 2

Views: 365

Answers (1)

torek
torek

Reputation: 487755

Use git rev-parse, which has options specifically for this:

git rev-parse --git-dir

See also:

git rev-parse --absolute-git-dir

(new in Git version 2.13.0), and:

git rev-parse --show-toplevel

and:

git rev-parse --show-cdup

(note that its output is empty if you are already in the top level of the repository). View your own documentation to find out which options your Git supports; most of these have been around since Git 1.7, though.

Upvotes: 4

Related Questions