以下命令
$ 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根用户和非特权用户的git config -l输出没有区别。尽管如此,sudo git co oldbranch可以工作,而git co oldbranch不能。
我遗漏了什么?
Gentoo / kernel 3.0.6 / git 1.7.3.4
发布于 2011-11-05 19:59: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。:)
发布于 2011-11-04 01:05:17
有没有可能您无意中在某个地方创建了一个不可执行的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在PATH环境变量中找到了一个git-co文件。Git使用PATH,如下所示:
Git从一个空PATH开始,为reference.
PATH找到--exec-path=<my git commands path> <my git commands path>选项,找不到PATH追加PATH并设置了--exec-path=<my git commands path>环境变量,使用相对或绝对路径将其追加到您调用的PATH.
--exec-path=<my git commands path>,将可执行文件d31GIT_EXEC_PATH >的绝对路径追加到先前定义的d35--exec-path=<my git commands 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的PATH中的某个目录中就没有git-co文件;可能存在一个不可执行的文件,并且which不会显示它。
发布于 2012-06-03 12:12:08
检查您是否拥有对git别名的执行权限。提供execute权限为我解决了这个问题。
我下载了“git-credential osxkeychain”并将其添加到/usr/local/bin中,并提供了exec权限,可以顺利地运行该命令。
https://stackoverflow.com/questions/7997700
复制相似问题