Mercurial имеет способ печати корневого каталога (который содержит .hg) через
hg root
Есть ли что-то эквивалентное в git, чтобы получить каталог, содержащий каталог .git?
git
version-control
wojo
источник
источник
bzr root
часто пользовался Базаромgit rev-parse --git-dir
, как объяснено в этом комментарииОтветы:
Да:
Если вы хотите реплицировать команду Git более напрямую, вы можете создать псевдоним :
и теперь
git root
будет функционировать так же, какhg root
.Примечание . В подмодуле будет отображаться корневой каталог подмодуля, а не родительский репозиторий. Если вы используете Git> = 2.13 или выше, есть способ, чтобы подмодули могли показать корневой каталог суперпроекта. Если ваш мерзавец старше этого, посмотрите этот другой ответ.
источник
git config --global alias.exec '!exec '
чтобы я мог делать такие вещи, какgit exec make
. Это работает, потому что псевдонимы оболочки всегда выполняются в каталоге верхнего уровня.hg root
делает. Он распечатывает каталог верхнего уровня вашего извлеченного хранилища. Он не переключает вас на это (и на самом деле он не мог этого сделать из-за того, как взаимодействует вся концепция текущего каталога и вашей оболочки).~/my.proj/foo/bar
и~/my.proj
имеете символическую ссылку~/src/my.proj
, приведенная выше команда переместит вас в~/src/my.proj
. Может быть проблемой, если то, что вы хотите сделать после этого, не зависит от дерева..git
каталоге проекта .man
Страницаgit-config
(под псевдонимом ) говорит:Итак, в UNIX вы можете сделать:
источник
.zshrc
, и я определю `alias cg =" cd $ (git root) ", то часть $ () будет вычислена в исходное время и всегда будет указывать на ~ / dotfiles, так как именно там находится мой zshrc ,Был
--show-toplevel
добавлен только недавноgit rev-parse
или почему никто не упоминает об этом?Со
git rev-parse
страницы руководства :источник
git-rev-parse
- из-за названия, предполагающего, что он обрабатывает спецификации ревизий. Кстати, я был бы рад видетьgit --work-tree
работу, похожую наgit --exec-path[=<path>]
: «Если путь не указан, git напечатает текущую настройку»; по крайней мере, IMO, было бы логично найти такую функцию.root = rev-parse --show-toplevel
в вашем gitconfig.git config --global alias.root "rev-parse --show-toplevel"
а затемgit root
сможете сделать работуgit rev-parse --show-toplevel
работает, когда я пробовал это в подмодуле. Он печатает корневой каталог подмодуля git. Что это печатает для вас?--show-cdup
до--show-top-level
в феврале 2011 года (после того, как этот ответ был представлен).Как насчет "
git rev-parse --git-dir
"?--git-dir
Вариант представляется на работу.Со страницы руководства git rev-parse :
Вы можете увидеть это в действии в этом
git setup-sh
сценарии .Если вы находитесь в папке подмодулей, с Git> = 2.13 , используйте :
Если вы используете
git rev-parse --show-toplevel
, убедитесь, что это с Git 2.25+ (первый квартал 2020 года) .источник
.git
если вы уже находитесь в корневом каталоге. (По крайней мере, на msysgit.)Чтобы написать простой ответ здесь, чтобы мы могли использовать
чтобы сделать работу, просто настройте свой мерзавец с помощью
и тогда вы можете добавить следующее к вашему
~/.bashrc
:так что вы можете просто использовать,
cdroot
чтобы перейти к верхней части вашего репо.источник
Если вы уже находитесь на верхнем уровне или не в репозитории git
cd $(git rev-parse --show-cdup)
, вы вернетесь домой (просто cd).cd ./$(git rev-parse --show-cdup)
это один из способов исправить это.источник
cd "$(git rev-parse --show-cdup)"
. Это работает, потому чтоcd ""
уносит вас в никуда, а не обратно$HOME
. В любом случае, лучше всего вызывать вызовы $ (), если они выводят что-то с пробелами (хотя в этом случае эта команда не будет).$PWD
. Этот пример разрешит корень git относительно$PWD
вместоrealpath $PWD
.Чтобы вычислить абсолютный путь к текущему корневому каталогу git, скажем, для использования в сценарии оболочки, используйте эту комбинацию readlink и git rev-parse:
git-rev-parse --show-cdup
дает вам правильное число "..", чтобы добраться до корня с вашего cwd, или пустую строку, если вы находитесь в корне. Затем добавьте «./» для обработки пустого регистра строки и используйтеreadlink -f
для перевода на полный путь.Вы также можете создать
git-root
команду в своем PATH в качестве сценария оболочки, чтобы применить эту технику:(Выше можно вставить в терминал, чтобы создать git-root и установить биты выполнения; фактический скрипт находится в строках 2, 3 и 4.)
И тогда вы сможете запустить,
git root
чтобы получить корень вашего текущего дерева. Обратите внимание, что в сценарии оболочки используйте «-e», чтобы заставить оболочку завершиться, если rev-parse завершился неудачно, чтобы вы могли правильно получить статус выхода и сообщение об ошибке, если вы не находитесь в каталоге git.источник
"$(git rev-parse ...)"
вместо хаков, как./$(git rev-parse ...)
.readlink -f
не работает то же самое на BSD. Смотрите это ТАК для обходных путей. Ответ Python вероятно , будет работать без установки каких - либо:python -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' "$(git rev-parse --show-cdup)"
.Как уже отмечали другие, суть решения заключается в использовании
git rev-parse --show-cdup
. Тем не менее, есть несколько крайних случаев:Когда cwd уже является корнем рабочего дерева, команда выдает пустую строку.
На самом деле он выдает пустую строку, но подстановка команды удаляет разрыв задней строки. Конечный результат - пустая строка.
В большинстве ответов предлагается добавлять к выводу выходные данные,
./
так что пустой вывод становится"./"
до его подачиcd
.Когда для GIT_WORK_TREE задано местоположение, которое не является родительским для cwd, выходные данные могут быть абсолютным путем.
Предвосхищение
./
неправильно в этой ситуации. Если a./
добавляется к абсолютному пути, он становится относительным путем (и они ссылаются на одно и то же местоположение, только если cwd является корневым каталогом системы).Вывод может содержать пробелы.
Это действительно применимо только во втором случае, но это легко исправить: используйте двойные кавычки вокруг подстановки команд (и любые последующие использования значения).
Как уже отмечалось в других ответах, мы можем это сделать
cd "./$(git rev-parse --show-cdup)"
, но это нарушается в случае второго ребра (и случае третьего ребра, если мы исключим двойные кавычки).Многие оболочки обрабатываются
cd ""
как неиспользуемые, поэтому для этих оболочек мы могли бы сделать этоcd "$(git rev-parse --show-cdup)"
(двойные кавычки защищают пустую строку в качестве аргумента в случае первого ребра и сохраняют пробелы в случае третьего ребра). POSIX говорит, что результатcd ""
не определен, поэтому лучше не делать этого предположения.Решение, которое работает во всех вышеперечисленных случаях, требует некоторого теста. Сделано явно, это может выглядеть так:
Нет
cd
сделано для первого краевого случая.Если
cd .
для первого граничного случая допустимо выполнение , то условное выражение может быть выполнено в расширении параметра:источник
git root
', который использует ответ выше, который вы используете?На всякий случай, если вы подаете этот путь к самому Git, используйте
:/
источник
Короткие решения, которые работают с подмодулями, в хуках и внутри
.git
каталогаВот краткий ответ, который больше всего захочется:
Это будет работать в любом месте рабочего дерева git (в том числе внутри
.git
каталога), но предполагается, что каталог (ы) хранилища вызываются.git
(что является значением по умолчанию). С подмодулями это пойдет в корень самого внешнего содержащего репозитория.Если вы хотите добраться до корня текущего субмодуля, используйте:
Чтобы легко выполнить команду в корне вашего подмодуля,
[alias]
в вашем.gitconfig
, добавьте:Это позволяет вам легко делать такие вещи, как
git sh ag <string>
Прочные решение , которое поддерживает по- разному поименованные или внешние
.git
или$GIT_DIR
каталоги.Обратите внимание, что
$GIT_DIR
может указывать куда-то внешнее (и не называться.git
), отсюда и необходимость дальнейшей проверки.Поместите это в свой
.bashrc
:Выполнить его ввода
git_root
(после перезагрузки оболочки:exec bash
)источник
(root=$(git rev-parse --git-dir)/ && cd ${root%%/.git/*} && git rev-parse && pwd)
но это не распространяется на внешние$GIT_DIR
s, имена которых отличаются от.git
Чтобы немного изменить ответ «git config»:
и очистить путь. Очень хорошо.
источник
Если вы ищете хороший псевдоним для этого, плюс не взрывайтесь,
cd
если вы не в git dir:источник
git-extras
добавления
$ git root
см. https://github.com/tj/git-extras/blob/master/Commands.md#git-root.
Наличие GIT-Extras
$ brew install git-extras
$ apt-get install git-extras
источник
Этот псевдоним оболочки работает независимо от того, находитесь ли вы в подкаталоге git или на верхнем уровне:
обновлен для использования современного синтаксиса вместо обратных галочек:
источник
Все остальное терпит неудачу в некоторый момент или идет в домашний каталог или просто терпит неудачу. Это самый быстрый и короткий способ вернуться к GIT_DIR.
источник
$GIT_DIR
отсоединяется от рабочего дерева с помощью.git
-Files иgitdir: SOMEPATH
. Следовательно, это не работает и для подмодулей, где$GIT_DIR
содержится.git/modules/SUBMODULEPATH
.Вот скрипт, который я написал, который обрабатывает оба случая: 1) хранилище с рабочим пространством, 2) пустое хранилище.
https://gist.github.com/jdsumsion/6282953
git-root
(исполняемый файл на вашем пути):Надеюсь, это полезно.
источник
git exec
идея более полезна в не голых репозиториях. Однако этот сценарий в моем ответе правильно обрабатывает случай «голый» или «не голый», который может быть кому-то полезен, поэтому я оставляю этот ответ здесь.git submodule
s, где$GIT_DIR
содержится что-то вроде/.git/modules/SUBMODULE
. Также вы предполагаете, что.git
каталог является частью рабочего дерева в не голом случае.источник
[alias] findroot = "!f () { [[ -d ".git" ]] && echo "Found git in [
pwd]" && exit 0; cd .. && echo "IN
pwd" && f;}; f"
git config --global alias.root '!pwd'
работает. Я не смог обнаружить ни одного случая, когда он действует иначе, чем неглобальный вариант. (Unix, git 1.7.10.4) Кстати:findroot
вам требуется a,/.git
чтобы избежать бесконечной рекурсии.Начиная с Git 2.13.0 , он поддерживает новую опцию для отображения пути корневого проекта, которая работает даже при использовании изнутри подмодуля:
источник
Предварительно настроенные псевдонимы оболочки в оболочках
Если вы используете оболочку оболочки, возможно, уже существует псевдоним оболочки:
$ grt
в о-о-о (68k) (cd $(git rev-parse --show-toplevel || echo ".")
)$ git-root
в презто (8.8к) (отображает путь к корню рабочего дерева)$ g..
zimfw (1k) (изменяет текущий каталог на верхний уровень рабочего дерева.)источник
Я хотел бы остановиться на превосходном комментарии Дэниела Брокмана.
Определение
git config --global alias.exec '!exec '
позволяет вам делать что-то вроде,git exec make
потому что, какman git-config
говорится:Также удобно знать, что
$GIT_PREFIX
это будет путь к текущему каталогу относительно каталога верхнего уровня репозитория. Но, зная, что это только полдела ™. Расширение переменной оболочки делает его довольно сложным в использовании. Поэтому я предлагаю использоватьbash -c
так:другие команды включают в себя:
источник
На случай, если кому-то понадобится POSIX-совместимый способ сделать это без использования
git
исполняемого файла:git-root
:Если вы просто хотите, чтобы функциональность была частью сценария, удалите shebang и замените последнюю
git_root_recurse_parent
строку на:источник
if
утверждение должно было проверить, изменили ли вы каталог в рекурсии. Если он остается в том же каталоге, он предполагает, что вы застряли где-то (например/
), и тормозит рекурсию. Ошибка исправлена и теперь должна работать как положено. Спасибо за указание на это.Пришлось решить это самому сегодня. Решил это в C # так, как мне было нужно для программы, но, думаю, это можно переписать. Считайте, что это общественное достояние.
источник