git aliases, вызывающий ошибку «Отказано в доступе» - PullRequest
18 голосов
/ 03 ноября 2011

Следующие команды

$ git co -b newbranch
$ git co oldbranch

приводят к ошибке «fatal: 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 / подпапки / файлы.В системе нет ни одного скрипта git-co (это псевдоним с возможностью расширения до git-checkout, который находится в / usr / libexec / git-core` dir).

Псевдонимы определены в .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

Ответы [ 3 ]

24 голосов
/ 05 ноября 2011

Правильный ответ на этот вопрос на самом деле был другим.Перед тем, как git запускает псевдонимы, он проверяет $PATH.Если каталог не существует или не имеет прав доступа, git создает "fatal: cannot exec 'git-co': Permission denied".Он никогда не проверяет псевдонимы, поэтому git foobar выдаст такую ​​же ошибку.

Хорошие люди из списка рассылки git также напомнили мне об инструменте strace, который может помочь найти запись, котораявозвращая EACCES, как в: strace -f -e execve git foobar

Кредит переходит к Джеффу Кингу из списка рассылки git.:)

8 голосов
/ 03 ноября 2011

Возможно ли, что вы случайно создали где-то неисполняемый файл 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 следующим образом:

  1. Начните с пустого PATH, сохранив любой "старый" PATH для справки.
  2. Если найден параметр --exec-path=<my git commands path> Git, добавьте <my git commands path> к PATH.
  3. Если --exec-path=<my git commands path> не был найден и установлена ​​переменная окружения GIT_EXEC_PATH, добавьте это к PATH.
  4. Если вы вызвали git, используя относительный или абсолютный путь, добавьте абсолютный путь к исполняемому файлу git к PATH.
  5. Если PATH был ранее определен, добавьте его к PATH.
  6. Если 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's PATH; может существовать файл, который не является исполняемым, и which не будет отображать его.

1 голос
/ 03 июня 2012

Проверьте, есть ли у вас права на выполнение для псевдонимов git.Предоставление разрешений на выполнение решило эту проблему для меня.

Я скачал «git-credential-osxkeychain» и добавил его в / usr / local / bin, предоставил права exec и мог выполнить команду без проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...