Потому что вы не пишели оператор сравнения для своей структуры. Компилятор не генерирует его для вас, поэтому, если вы хотите сравнить, вы должны написать его самостоятельно.
Да:
git rev-parse --show-toplevel
Примечание : В подмодуле будет отображаться корневой каталог подмодуля, а не родительский репозиторий. Если вы используете Git> = 2.13 или выше, вот способ, которым подмодули могут отображать корневой каталог суперпроекта. Если ваш git старше этого, см. Другой ответ.
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
Если вы уже находитесь на верхнем уровне или не находитесь в репозитории git cd $ (git rev-parse --show-cdup)
приведет вас домой (просто cd). cd ./$(git rev-parse --show-cdup)
- один из способов исправить это.
Страница man
для git-config
(под Псевдоним ]) говорит:
Если расширение псевдонима предваряется восклицательным знаком, оно будет рассматриваться как оболочка команда. [...] Обратите внимание, что оболочка команды будут выполняться из каталога верхнего уровня репозитория, что не может обязательно должен быть текущим каталогом.
Итак, в UNIX вы можете сделать:
git config --global --add alias.root '!pwd'
Для вычисления абсолютного пути к текущему корневому каталогу 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.
Мне пришлось сегодня решить эту проблему. Решил его на 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;
}
Как отмечали другие, суть решения заключается в использовании git rev-parse --show-cdup
. Однако есть несколько крайних случаев, которые следует рассмотреть:
Когда cwd уже является корнем рабочего дерева, команда возвращает пустую строку.
На самом деле это создает пустую строку, но при подстановке команд убирается разрыв конечной строки. Конечный результат - пустая строка.
В большинстве ответов предлагается добавить к выводу ./
, чтобы пустой вывод превратился в "./"
перед подачей на cd
.
Когда GIT_WORK_TREE установлен в расположение, которое не является родительским для cwd, вывод может быть абсолютным путем.
Добавление ./
в эту ситуацию неверно. Если ./
добавляется к абсолютному пути, он становится относительным путем (и они относятся только к тому же месту, если cwd является корневым каталогом системы).
Вывод может содержать пробелы.
На самом деле это применимо только ко второму случаю, но исправить это легко: используйте двойные кавычки вокруг подстановки команды (и любого последующего использования значения).
Как отмечали другие ответы, мы можем сделать 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:-.}"
Чтобы изменить "git config", ответьте немного:
git config --global --add alias.root '!pwd -P'
и очистите путь. Очень хорошо.