Есть ли способ получить корневой каталог git одной командой? - PullRequest
575 голосов
/ 06 июня 2009

Mercurial имеет способ печати корневого каталога (который содержит .hg) через

hg root

Есть ли что-то эквивалентное в git для получения каталога, содержащего каталог .git?

Ответы [ 22 ]

8 голосов
/ 28 июля 2010

Чтобы немного изменить ответ "git config":

git config --global --add alias.root '!pwd -P'

и очисти путь. Очень мило.

7 голосов
/ 31 июля 2012

Если вы ищете хороший псевдоним для этого, плюс не взрывайте cd, если вы не в git dir:

alias ..g='git rev-parse && cd "$(git rev-parse --show-cdup)"'
6 голосов
/ 14 ноября 2013

Этот псевдоним оболочки работает независимо от того, находитесь ли вы в подкаталоге git или на верхнем уровне:

alias gr='[ ! -z `git rev-parse --show-toplevel` ] && cd `git rev-parse --show-toplevel || pwd`'

обновлено для использования современного синтаксиса вместо обратных галочек:

alias gr='[ ! -z $(git rev-parse --show-toplevel) ] && cd $(git rev-parse --show-toplevel || pwd)'
6 голосов
/ 31 августа 2015

git-extras

добавляет $ git root
см https://github.com/tj/git-extras/blob/master/Commands.md#git-root

$ pwd
.../very-deep-from-root-directory
$ cd `git root`
$ git add . && git commit

Наличие git-дополнений

5 голосов
/ 20 августа 2013

Вот скрипт, который я написал, который обрабатывает оба случая: 1) хранилище с рабочим пространством, 2) пустое хранилище.

https://gist.github.com/jdsumsion/6282953

git-root (исполняемый файл на вашем пути):

#!/bin/bash
GIT_DIR=`git rev-parse --git-dir` &&
(
  if [ `basename $GIT_DIR` = ".git" ]; then
    # handle normal git repos (with a .git dir)
    cd $GIT_DIR/..
  else
    # handle bare git repos (the repo IS a xxx.git dir)
    cd $GIT_DIR
  fi
  pwd
)

Надеюсь, это полезно.

5 голосов
/ 17 октября 2011
alias git-root='cd \`git rev-parse --git-dir\`; cd ..'

Все остальное терпит неудачу в какой-то момент, либо идет в домашний каталог, либо просто терпит неудачу. Это самый быстрый и короткий способ вернуться к GIT_DIR.

4 голосов
/ 12 января 2013
$ git config alias.root '!pwd'
# then you have:
$ git root
3 голосов
/ 16 мая 2018

Начиная с Git 2.13.0 , он поддерживает новую опцию для отображения пути корневого проекта, которая работает даже при использовании изнутри подмодуля:

git rev-parse --show-superproject-working-tree
2 голосов
/ 11 апреля 2018

Предварительно настроенные псевдонимы оболочки в оболочках

Если вы используете оболочку оболочки, возможно, уже существует псевдоним оболочки:

  • $ grt in oh-my-zsh (68k) (cd $(git rev-parse --show-toplevel || echo "."))
  • $ git-root in prezto (8.8k) (отображает путь к корню рабочего дерева)
  • $ g.. zimfw (1k) (изменяет текущий каталог на верхний уровень рабочего дерева.)
1 голос
/ 23 июля 2018

В случае, если кому-то нужен POSIX-совместимый способ сделать это, не требуя git исполняемого файла:

git-root

#$1: Path to child directory
git_root_recurse_parent() {
    # Check if cwd is a git root directory
    if [ -d .git/objects -a -d .git/refs -a -f .git/HEAD ] ; then
        pwd
        return 0
    fi

    # Check if recursion should end (typically if cwd is /)
    if [ "${1}" = "$(pwd)" ] ; then
        return 1
    fi

    # Check parent directory in the same way
    local cwd=$(pwd)
    cd ..
    git_root_recurse_parent "${cwd}"
}

git_root_recurse_parent

Если вы просто хотите, чтобы функциональность была частью сценария, удалите шебанг и замените последнюю строку git_root_recurse_parent на:

git_root() {
    (git_root_recurse_parent)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...