你是否不小心在某个地方创建了一个非可执行的 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
:
- 从空的
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的PATH
目录中没有git-co
文件是不够的;可能存在一个不可执行的文件,而which
命令将不会显示它。
git config --get-regexp '^alias\.'
的输出结果。 - manojlds/usr/libexec/git-core
、/usr/lib/git-core
或其中一个,将/usr
更改为/usr/local
。您应该看到一堆可执行文件,用于所有git命令。看看那里是否还有一个git-co
,它可以由root执行,但不能由您执行。如果这个git-co
文件不在git安装目录中,它也可能在您的PATH
中定位。如果不在git安装目录中,也可以使用sudo which git-co
来定位它。 - Cascabelalias.co checkout
- Alexei Danchenkovgit-co
的文件。sudo which git-co
通过which: no git-co in (...)
进行了确认。 - Alexei Danchenkov