Git псевдонимы, вызывающие ошибку "Разрешение отказа"
Следующие команды
$ git co -b newbranch
$ git co oldbranch
приведет к ошибке "fatal: can not exec" git -co ': Permission denied ".
В то же время
$ git checkout -b newbranch
$ git checkout oldbranch
и
$ sudo git co -b newbranch
$ sudo git co oldbranch
работает как ожидалось. Права на владение для папки .git установлены для пользователя, владеющего домашней папкой, а 0755/0644 - это режим для папки .git/subfolder/files. В системе нет git-co
script (это расширяемый псевдоним git-checkout
), который находится в каталоге /usr/libexec/ git -core`).
Псевдонимы определены в .gitconfig
исходной папки:
[alias]
co = checkout
Нет никакой разницы в выходе git config -l
для root или непривилегированного пользователя. Тем не менее sudo git co oldbranch
работает, а git co oldbranch
не работает.
Что мне не хватает?
Gentoo/kernel 3.0.6/ git 1.7.3.4
Ответы
Ответ 1
Правильный ответ на это был действительно другим. Перед тем, как git запускает псевдонимы, он проверяет $PATH
. Если каталог не существует или не имеет разрешений, git создает "fatal: cannot exec 'git-co': Permission denied"
. Для проверки псевдонимов никогда не приходит, поэтому git foobar
будет вызывать ту же ошибку.
Хорошие люди из списка рассылки git также напомнили мне инструмент strace
, который может помочь найти запись, возвращающую EACCES, как в: strace -f -e execve git foobar
Кредит принадлежит Джеффу Кингу из списка рассылки git.:)
Ответ 2
Возможно ли, что вы случайно создали не исполняемый файл git-co
где-нибудь? Я могу воссоздать вашу ситуацию, если я это сделаю, как показано ниже.
$ git --version
git version 1.7.7.1.475.g997a1
$ git config --get-regexp '^alias\.co$'
alias.co checkout
$ git co b1
Switched to branch 'b1'
$ touch $HOME/bin/git-co
$ ls -al $HOME/bin/git-co
-rw-r--r-- 1 user user 0 2011-11-03 12:59 /home/user/bin/git-co
$ git co master
fatal: cannot exec 'git-co': Permission denied
$ for p in $(echo "$PATH" | sed -e 's/:/ /g'); do if [ -f "${p}/git-co" ]; then echo "Found git-co in ${p}"; fi; done
Found git-co in /home/user/bin
$ rm $HOME/bin/git-co
rm: remove regular empty file `/home/user/bin/git-co'? y
$ git co master
Switched to branch 'master'
Еще одна вещь, которую вы можете попробовать - это включить отслеживание трассировки, чтобы получить больше информации о том, что делает Git. Ниже приведен пример:
GIT_TRACE=$HOME/trace.log git co master
Вы должны использовать абсолютные пути, если вы хотите отправить вывод в файл. В противном случае используйте true
или 1
для отправки вывода на стандартную ошибку; например GIT_TRACE=1
. Файл trace.log
содержит:
trace: exec: 'git-co' 'master'
trace: run_command: 'git-co' 'master'
trace: alias expansion: co => 'checkout'
trace: built-in: git 'checkout' 'master'
Если вы не видите вывод журнала трассировки trace: alias expansion: co=> 'checkout'
, Git находит файл git-co
в переменной среды PATH
. Git использует PATH
следующим образом:
- Начните с пустого
PATH
, сохранив любой "старый" PATH
для справки.
- Если параметр
--exec-path=<my git commands path>
Git найден, добавьте <my git commands path>
в PATH
.
- Если
--exec-path=<my git commands path>
не найден и переменная среды GIT_EXEC_PATH
установлена, добавьте ее в PATH
.
- Если вы вызвали
git
с использованием относительного или абсолютного пути, добавьте абсолютный путь к исполняемому файлу git
к PATH
.
- Если ранее был определен
PATH
, добавьте его в PATH
.
- Если
PATH
ранее не было определено, добавьте /usr/local/bin:/usr/bin:/bin
в PATH
.
Вы можете использовать другой псевдоним, чтобы получить Git, чтобы сообщить вам, что он устанавливает переменную среды PATH
.
$ git config --global alias.whatpath '!echo $PATH'
$ git whatpath
/usr/local/libexec/git-core:/home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Затем проверьте каждый каталог, указанный для существования файла git-co
. Недостаточно сделать which git-co
и предположить, что если ничего не найдено, что у вас нет файла git-co
, расположенного в одном из каталогов в Git PATH
; может существовать файл, который не является исполняемым, а which
не отображает его.
Ответ 3
Проверьте, есть ли у вас права на выполнение для псевдонимов git.
Предоставление разрешений на выполнение разрешило эту проблему для меня.
Я загрузил "git -credential-osxkeychain" и добавил его в /usr/local/bin и предоставил права exec и смог запустить команду без каких-либо проблем.