Подтвердить что ты не робот

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

4b9b3361

Ответ 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 и смог запустить команду без каких-либо проблем.