2009-09-06 11 views
176

Estoy tratando de ejecutar git desde un directorio diferente que estoy en Así por ejemplo, si estoy en:.git --git-dir no funciona como debería

cd /home/domain/ 
git status << runs perfect ie 
# On branch master 
# Your branch is ahead of 'origin/master' by 6 commits. 

Así que ahora quiero ejecutar este comando desde un directorio diferente utilizando la opción --git-dir.

lo que permite decir que estoy en root/ e intento esto:

git --git-dir="/home/domain/" status 
## Error 
fatal: Not a git repository: '/home/domain/' 

También he intentado incluir el .git carpeta es decir

git --git-dir="/home/domain/.git/" status 

Pero esto parece que está tratando de ejecutar git desde la raíz, es decir, eliminar todo de mi carpeta de dominio y agregar todo en la raíz.

Espero que alguien pueda aconsejarme sobre lo que estoy haciendo mal.

+4

Ahora tengo estado de trabajo perfecto, pero tirón está dando errores es decir root @ erx [/] # git --git-dir =/home/Dominio/.git --work-árbol =/home/Dominio/pull origin master fatal:/usr/local/libexec/git-core/git-pull no se puede utilizar sin un árbol de trabajo. ¿Pero el estado funciona? any ideas Jon – Lee

+4

Este es el mayor error en git en este momento. No respetando los parámetros --work-tree y/o --git-dir. –

+3

Al iniciar git 1.8.5, tendrá la opción de * no * establecer '--git-dir' y' -work-tree' para un comando simple: vea [mi respuesta a continuación] (http: // stackoverflow. com/a/20115678/6309) – VonC

Respuesta

258

También debe definir el directorio de trabajo. Confuso lo sé pero es una cuestión de flexibilidad.

git --git-dir=/mycode/.git --work-tree=/mycode status 

se puede leer un poco más here

+2

¡Gracias, funcionó! Acordó que esto es confuso. Se llama Keep It Simple Stupid. Casi siempre se puede permitir flexibilidad y, al mismo tiempo, ofrecer valores predeterminados que tengan más sentido si VS tiene un comando que no funciona en absoluto. – Nay

+3

@Nick estuvo de acuerdo, usted pensaría que si '--git-dir' no se especificara, verificaría si'/mycode/.git' existía y lo usa antes de lanzar un error. – GP89

+3

@NickYeates secundó! También tuve un problema al usar ~ para referirme a mi directorio de inicio, por ejemplo 'git --git-dir = ~/src/s3cmd/.git --work-tree = ~/src/s3cmd pull' no funcionó pero 'git --git-dir =/home/username/src/s3cmd/.git --work-tree =/home/username/src/s3cmd pull' hizo –

38

Basado en su comentario anterior, parece que todavía se está ejecutando en un problema:

 
[email protected] [/]# git --git-dir=/home/domain/.git --work-tree=/home/domain/ pull origin master 
fatal: /usr/local/libexec/git-core/git-pull cannot be used without a working tree 

Suena como usted puede ser la intención de ejecutar esto desde crontab o algo. Puede ser mejor utilizar cd para cambiar primero a su directorio de trabajo. Por ejemplo:

 
[email protected] [/]# (cd /home/domain && git pull origin master) 

Esta mantendrán temporalmente (en un subnivel, que es lo que hacen los paréntesis) cambia el directorio actual a /home/domain y ejecute git pull origin master. Una vez que se completa el comando, su directorio actual permanece como estaba antes del comando.

+0

Usar una subcadena es simple y elegante. ¡No sé por qué no pensé en eso antes! –

+0

Lo siento @Greg, voté por la otra respuesta de Jon al responder la pregunta, pero creo que eres acertada para detectar y responder a la intención y tu idea, es decir, la() s, es exactamente lo que estaba buscando +10 –

96

partir git 1.8.5 (que debería ser la próxima semana), será aún más simple:

git -C "/home/domain/" status 

No hay necesidad de establecer --git-dir y --work-tree más!


Ver commit 44e1e4 por Nazri Ramliy:

se necesita más pulsaciones de teclas para invocar comandos git en un directorio diferente sin salir del directorio actual:

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-dir=~/foo status
    GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status
  2. (cd ../..; git grep foo)
  3. for d in d1 d2 d3; do (cd $d && git svn rebase); done

Los métodos mostrados anteriormente son aceptables para secuencias de comandos, pero son demasiado engorroso para invocaciones de línea de comandos rápidos.

Con esta nueva opción, lo anterior se puede hacer con menos pulsaciones:

  1. git -C ~/foo status
  2. git -C ../.. grep foo
  3. for d in d1 d2 d3; do git -C $d svn rebase; done
Cuestiones relacionadas