lab - git repository
alias de git que causan el error "Permiso denegado" (3)
¿Es posible que hayas creado inadvertidamente un archivo git-co
no ejecutable git-co
algún lugar? Puedo recrear tu situación si hago eso, como se muestra a continuación.
$ 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''
Otra cosa que quizás desee probar es habilitar el registro de seguimiento para obtener más información sobre lo que está haciendo Git. A continuación se muestra un ejemplo:
GIT_TRACE=$HOME/trace.log git co master
Debe usar rutas absolutas si desea enviar resultados a un archivo. De lo contrario, use true
o 1
para enviar la salida al error estándar; por ejemplo, GIT_TRACE=1
. El archivo trace.log
contiene:
trace: exec: ''git-co'' ''master''
trace: run_command: ''git-co'' ''master''
trace: alias expansion: co => ''checkout''
trace: built-in: git ''checkout'' ''master''
Si no ve la salida del registro de seguimiento trace: alias expansion: co=> ''checkout''
, Git está encontrando un archivo git-co
en la PATH
entorno PATH
. Git utiliza un PATH
como sigue:
- Comience con un
PATH
vacío, guardando cualquierPATH
"antiguo" como referencia. - Si se encuentra la
--exec-path=<my git commands path>
Git, agregue<my git commands path>
a laPATH
. - Si no se
--exec-path=<my git commands path>
y la variable de entornoGIT_EXEC_PATH
está establecida, agregue esto a laPATH
. - Si llamó a
git
utilizando una ruta relativa o absoluta, agregue la ruta absoluta del ejecutable degit
a laPATH
. - Si
PATH
se definió previamente, adjúntelo aPATH
. - Si
PATH
no se definió previamente, agregue/usr/local/bin:/usr/bin:/bin
a laPATH
.
Puedes usar otro alias para que Git te diga cómo está configurando la PATH
entorno 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
Luego revise cada directorio listado para la existencia de un archivo git-co
. No es suficiente hacer which git-co
y asumir que si no se encuentra nada, no tiene un archivo de git-co
ubicado en uno de los directorios en la PATH
de Git; puede existir un archivo que no sea ejecutable y which
no lo mostrará.
Los siguientes comandos
$ git co -b newbranch
$ git co oldbranch
da como resultado un error "fatal: no se puede ejecutar ''git-co'': permiso denegado".
Al mismo tiempo,
$ git checkout -b newbranch
$ git checkout oldbranch
y
$ sudo git co -b newbranch
$ sudo git co oldbranch
trabajar como se esperaba. Los derechos de propiedad de la carpeta .git se establecen para el usuario propietario de la carpeta de inicio y 0755/0644 es el modo para la carpeta .git / subcarpeta / archivos. No hay ningún script de git-co
en ningún lugar del sistema (es decir, un alias expandible para git-checkout
, que reside en / usr / libexec / git-core` dir).
Los alias se definen en .gitconfig
de la carpeta de inicio:
[alias]
co = checkout
No hay diferencia en la salida de git config -l
para usuarios root o sin privilegios. Todavía sudo git co oldbranch
funciona y git co oldbranch
no.
¿Qué me estoy perdiendo?
Gentoo / kernel 3.0.6 / git 1.7.3.4
La respuesta correcta a esto fue en realidad diferente. Antes de que git ejecute los alias, comprueba el $PATH
. En caso de que el directorio no exista, o carezca de permisos, git produce el "fatal: cannot exec ''git-co'': Permission denied"
. Nunca se comprueban los alias, por lo que git foobar
producirá el mismo error.
La gente buena de la lista de correo de git también me recordó una herramienta de strace
, que puede ayudar a encontrar la entrada que está devolviendo EACCES, como en: strace -f -e execve git foobar
El crédito es para Jeff King de la lista de correo de git. :)
Verifique si tiene permisos de ejecución en los alias de git. Proporcionar los permisos de ejecución solucionó este problema para mí.
Descargué "git-credential-osxkeychain", lo agregué a / usr / local / bin y proporcioné los derechos de ejecución y pude ejecutar el comando sin ningún problema.