Почему git ls-remote и git ls-files не работают с некоторыми относительными путями?
Предположим, у меня есть репозиторий git в ~/dev/company/products/company-common
. Из нескольких других мест файловой системы я пытаюсь выполнитьls-files
или ls-remote
по этому репо. Все работают, кроме последнего. В чем может быть причина того, что последний не работает?
(NB, у меня есть двухстрочное приглашение bash):
user@machine:products (~/dev/company/products)
$ git ls-remote company-common HEAD
f25b342b384de1b82cb67b6f530303b4fac37ff0 HEAD
user@machine:products (~/dev/company/products)
$ git ls-remote ../products/company-common HEAD
f25b342b384de1b82cb67b6f530303b4fac37ff0 HEAD
user@machine:products (~/dev/company/products)
$ git ls-remote ../../company/products/company-common HEAD
f25b342b384de1b82cb67b6f530303b4fac37ff0 HEAD
user@machine:products (~/dev/company/products)
$ cd gui
user@machine:gui [master] (~/dev/company/products/gui)
$ git ls-remote ../company-common HEAD
f25b342b384de1b82cb67b6f530303b4fac37ff0 HEAD
user@machine:gui [master] (~/dev/company/products/gui)
$ cd dummy/
user@machine:dummy-application [master] (~/dev/company/products/gui/dummy)
$ git ls-remote ../../company-common HEAD
fatal: '../../company-common' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
Ни один из задействованных каталогов не является символической ссылкой. Я показал только одну строку вывода каждой команды (кроме последней)
1 ответ
Интересно то, что git ls-remote
здесь вообще работает.
Первый аргумент, который вы передаете git ls-remote
должен быть URL-адрес (https://host/...
, ssh://git@github.com/...
и так далее) или имя удаленного (обычно origin
). Однако Git принимает пути локальной файловой системы вместоfile://...
URL-адреса.
Когда Git проделывает этот последний трюк, кажется, что он делает это несколько странно и непоследовательно. В своих экспериментах у меня было несколько иное поведение, но все же странное.
Помимо академического любопытства и / или возможных внутренних ошибок, вам следует просто прекратить использовать git ls-remote
здесь и используйте git rev-parse
прямо. Если вы хотите получить идентификатор хэша ревизии из текущего репозитория, просто запуститеgit rev-parse
:
git rev-parse HEAD
например. Если вы хотите получить его из другого репозитория Git в расположении файловой системы X, используйте:
git -C X rev-parse HEAD
например. Это ведет себя хорошо - в отличие от странных результатов, которые мы с вами наблюдаем дляgit ls-remote
здесь -C
аргумент делает Git внутренне chdir
на время rev-parse - и работает быстрее, с ним проще и легче справиться. Это работает дляgit ls-files
и все другие команды Git тоже, поскольку они реализованы в git
внешний интерфейс.