Есть ли способ получить корневой каталог git в одной команде?

Потому что вы не пишели оператор сравнения для своей структуры. Компилятор не генерирует его для вас, поэтому, если вы хотите сравнить, вы должны написать его самостоятельно.

581
задан Rob Kennedy 9 April 2012 в 18:10
поделиться

8 ответов

Да:

git rev-parse --show-toplevel

Примечание : В подмодуле будет отображаться корневой каталог подмодуля, а не родительский репозиторий. Если вы используете Git> = 2.13 или выше, вот способ, которым подмодули могут отображать корневой каталог суперпроекта. Если ваш git старше этого, см. Другой ответ.

1011
ответ дан 22 November 2019 в 21:58
поделиться

How about "git rev-parse --git-dir" ?

F:\prog\git\test\copyMerge\dirWithConflicts>git rev-parse --git-dir
F:/prog/git/test/copyMerge/.git

The --git-dir option seems to work.

From git rev-parse manual page:

--git-dir

    Show $GIT_DIR if defined else show the path to the .git directory.

You can see it in action in this git setup-sh script.

If you are in a submodule folder, with Git >=2.13, use:

git rev-parse --show-superproject-working-tree
46
ответ дан 22 November 2019 в 21:58
поделиться

Если вы уже находитесь на верхнем уровне или не находитесь в репозитории git cd $ (git rev-parse --show-cdup) приведет вас домой (просто cd). cd ./$(git rev-parse --show-cdup) - один из способов исправить это.

26
ответ дан 22 November 2019 в 21:58
поделиться

Страница man для git-config (под Псевдоним ]) говорит:

Если расширение псевдонима предваряется восклицательным знаком, оно будет рассматриваться как оболочка команда. [...] Обратите внимание, что оболочка команды будут выполняться из каталога верхнего уровня репозитория, что не может обязательно должен быть текущим каталогом.

Итак, в UNIX вы можете сделать:

git config --global --add alias.root '!pwd'
95
ответ дан 22 November 2019 в 21:58
поделиться

Для вычисления абсолютного пути к текущему корневому каталогу git , скажем, для использования в сценарии оболочки, используйте эту комбинацию readlink и git rev-parse:

gitroot=$(readlink -f ./$(git rev-parse --show-cdup))

git-rev-parse --show-cdup дает вам правильное количество "..", чтобы получить в корень из вашего cwd или пустую строку, если вы находитесь в корне. Затем добавьте "./", чтобы обработать регистр пустой строки, и используйте readlink -f для преобразования в полный путь.

Вы также можете создать команду git-root в вашем PATH в качестве сценария оболочки, чтобы применить этот метод:

cat > ~/bin/git-root << EOF
#!/bin/sh -e
cdup=$(git rev-parse --show-cdup)
exec readlink -f ./$cdup
EOF
chmod 755 ~/bin/git-root

(Вышеупомянутое можно вставить в терминал, чтобы создать git-root и установить выполнение бит; фактический сценарий находится в строках 2, 3 и 4.)

И тогда вы сможете запустить git root , чтобы получить корень вашего текущего дерева. Обратите внимание, что в сценарии оболочки используйте «-e», чтобы заставить оболочку завершить работу в случае сбоя rev-parse, чтобы вы могли правильно получить статус выхода и сообщение об ошибке, если вы не находитесь в каталоге git.

16
ответ дан 22 November 2019 в 21:58
поделиться

Мне пришлось сегодня решить эту проблему. Решил его на C #, так как он мне нужен для программы, но, думаю, его можно сильно переписать. Считайте это общественным достоянием.

public static string GetGitRoot (string file_path) {

    file_path = System.IO.Path.GetDirectoryName (file_path);

    while (file_path != null) {

        if (Directory.Exists (System.IO.Path.Combine (file_path, ".git")))
            return file_path;

        file_path = Directory.GetParent (file_path).FullName;

    }

    return null;

}
0
ответ дан 22 November 2019 в 21:58
поделиться

Как отмечали другие, суть решения заключается в использовании git rev-parse --show-cdup . Однако есть несколько крайних случаев, которые следует рассмотреть:

  1. Когда cwd уже является корнем рабочего дерева, команда возвращает пустую строку.
    На самом деле это создает пустую строку, но при подстановке команд убирается разрыв конечной строки. Конечный результат - пустая строка.

    В большинстве ответов предлагается добавить к выводу ./ , чтобы пустой вывод превратился в "./" перед подачей на cd .

  2. Когда GIT_WORK_TREE установлен в расположение, которое не является родительским для cwd, вывод может быть абсолютным путем.

    Добавление ./ в эту ситуацию неверно. Если ./ добавляется к абсолютному пути, он становится относительным путем (и они относятся только к тому же месту, если cwd является корневым каталогом системы).

  3. Вывод может содержать пробелы.

    На самом деле это применимо только ко второму случаю, но исправить это легко: используйте двойные кавычки вокруг подстановки команды (и любого последующего использования значения).

Как отмечали другие ответы, мы можем сделать cd "./$(git rev-parse --show-cdup)" , но это нарушает второй крайний случай (и третий крайний случай если опустить двойные кавычки).

Многие оболочки рассматривают cd "" как бездействующие, поэтому для этих оболочек мы могли бы сделать cd "$ (git rev-parse --show-cdup)" ( двойные кавычки защищают пустую строку как аргумент в первом краевом случае и сохраняют пробелы в третьем краевом случае). POSIX сообщает, что результат cd "" не указан, поэтому лучше избегать этого предположения.

Решение, которое работает во всех вышеперечисленных случаях, требует некоторого теста. В явном виде это может выглядеть так:

cdup="$(git rev-parse --show-cdup)" && test -n "$cdup" && cd "$cdup"

Нет cd не выполняется для первого пограничного случая.

Если допустимо запустить cd. для первого пограничного случая, тогда условное условие может быть выполнено в раскрытии параметра:

cdup="$(git rev-parse --show-cdup)" && cd "${cdup:-.}"
17
ответ дан 22 November 2019 в 21:58
поделиться

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

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

и очистите путь. Очень хорошо.

8
ответ дан 22 November 2019 в 21:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: