git别名导致“权限被拒绝”错误

时间:2011-11-03 15:40:51

标签: git

以下命令

$ git co -b newbranch
$ git co oldbranch

导致“致命:不能执行'git-co':权限被拒绝”错误。

同时,

$ 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`目录中。

别名在主文件夹的.gitconfig中定义:

[alias]
co = checkout

root或nonrivileged用户的git config -l输出没有区别。仍有sudo git co oldbranch有效且git co oldbranch没有。

我错过了什么?

Gentoo / kernel 3.0.6 / git 1.7.3.4

3 个答案:

答案 0 :(得分:24)

对此的正确答案实际上是不同的。在git运行别名之前,它会检查$PATH。如果目录不存在或缺少权限,git将生成"fatal: cannot exec 'git-co': Permission denied"。它不会检查别名,因此git foobar将产生相同的错误。

git邮件列表中的好人也提醒我一个strace工具,它可以帮助找到返回EACCES的条目,如:strace -f -e execve git foobar

来自git邮件列表的Jeff King。 :)

答案 1 :(得分:8)

您是否有可能无意中在某处创建了不可执行的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

如果要将输出发送到文件,则必须使用绝对路径。否则,使用true1将输出发送到标准错误;例如GIT_TRACE=1trace.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
  7. 您可以使用其他别名让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是不够的,并假设如果没有发现您没有{G}的git-co目录中的PATH文件;可能存在不可执行的文件,which将不会显示该文件。

答案 2 :(得分:1)

检查您是否对git别名具有执行权限。 提供执行权限为我解决了这个问题。

我下载了“git-credential-osxkeychain”并将其添加到/ usr / local / bin并提供了exec权限,可以毫无问题地运行命令。