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

Ale*_*kov 18 git

以下命令

$ git co -b newbranch
$ git co oldbranch
Run Code Online (Sandbox Code Playgroud)

导致"致命:不能执行'git-co':权限被拒绝"错误.

在同一时间,

$ git checkout -b newbranch
$ git checkout oldbranch
Run Code Online (Sandbox Code Playgroud)

$ sudo git co -b newbranch
$ sudo git co oldbranch
Run Code Online (Sandbox Code Playgroud)

按预期工作..git文件夹的所有权权限是为拥有主文件夹的用户设置的,而0755/0644是.git文件夹/子文件夹/文件的模式.git-co系统中没有任何脚本(这是一个可扩展的别名git-checkout,驻留在/ usr/libexec/git-core`目录中).

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

[alias]
co = checkout
Run Code Online (Sandbox Code Playgroud)

git config -lroot或nonrivileged用户的输出没有区别.仍然sudo git co oldbranch有效,git co oldbranch但没有.

我错过了什么?

Gentoo/kernel 3.0.6/git 1.7.3.4

Ale*_*kov 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.:)

  • 我在Gentoo w/git 1.7.3.4上,并且/ usr/games/bin上的公共执行权限对我没有影响.它在我的路径中,Git未能在我的PATH中找到对dir的适当权限,因此它为别名产生了此错误.`chmod + x/usr/games/bin`就是为我修复它所需要的.抓住这个单线来快速查看PATH权限`echo $ PATH | tr':''\n'| xargs ls -ld` (7认同)
  • 或者更好:strace -f -e execve git foobar 2>&1 | grep -i否认 (2认同)

Dan*_*ruz 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'
Run Code Online (Sandbox Code Playgroud)

您可能想要尝试的另一件事是启用跟踪日志记录以获取有关Git正在执行的操作的更多信息.以下是一个例子:

GIT_TRACE=$HOME/trace.log git co master
Run Code Online (Sandbox Code Playgroud)

如果要将输出发送到文件,则必须使用绝对路径.否则,使用true1发送输出到标准错误; 例如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'
Run Code Online (Sandbox Code Playgroud)

如果您没有看到trace: alias expansion: co=> 'checkout'跟踪日志输出,Git将git-coPATH环境变量中查找文件.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:/binPATH.

您可以使用另一个别名来让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
Run Code Online (Sandbox Code Playgroud)

然后检查列出的每个目录是否存在git-co文件.这不是足以完成which git-co,并假设如果没有被发现,你没有一个git-co位于Git的一个目录中的文件PATH; 可能存在不可执行which且不显示的文件.