Digamos que tengo un directorio /X/Y
, que es un repositorio git. ¿Es posible llamar de alguna manera a un comando como git pull
desde adentro /X
, pero dirigido al /X/Y
directorio?
EDITAR: Supongo que me preguntaba específicamente: ¿es posible hacer esto usando el comando a git, pero sin tener que cambiar los directorios?
NOTA: He aceptado la respuesta de VonC ya que es mucho más elegante que las opciones anteriores. Para las personas que ejecutan Git anteriores a 1.8.5, consulte la respuesta de bstpierre a continuación .
Respuestas:
A partir de git 1.8.5 (cuarto trimestre de 2013) , podrá "utilizar un comando Git, pero sin tener que cambiar los directorios".
Ver commit 44e1e4 de Nazri Ramliy :
Desde Git 2.3.4 (marzo de 2015), y cometer 6a536e2 por Karthik Nayak (
KarthikNayak
) ,git
tratará "git -C '<path>'
" como un no-op cuando<path>
esté vacío.4 años después, Git 2.23 (Q3 2019) documenta que '
git -C ""
' funciona y no cambia el directorioEso significa que la documentación ahora (finalmente) incluye:
Puede ver
git -C
usado con Git 2.26 (Q1 2020), como un ejemplo.Ver commit b441717 , commit 9291e63 , commit 5236fce , commit 10812c2 , commit 62d58cd , commit b87b02c , commit 9b92070 , commit 3595d10 , commit f511bc0 , commit f6041ab , commit f46c243 , commit 99c049b , commit 3738439 , commit 7717242 , commit 208b ) por Denton Liu (
Denton-L
) .(Fusión por Junio C Hamano -
gitster
- en commit 381e8e9 , 05 de febrero de 2020)fuente
apt-get install software-properties-common python-software-properties
luego agregue el repositorio gitadd-apt-repository ppa:git-core/ppa
. El último paso consiste en la actualización git:apt-get update && apt-get upgrade
.Editar :
Hay un error
git pull
o no puedes hacer lo que intentas hacer con ese comando. Usted puede , sin embargo, hacerlo con traer y fusión:Respuesta original :
Suponiendo que esté ejecutando bash o similar, puede hacerlo
(cd /X/Y; git pull)
.La página de manual de git especifica algunas variables (ver "El repositorio de git") que parecen ayudar, pero no puedo hacer que funcionen correctamente (con mi repositorio en / tmp / ggg2):
Ejecutando el siguiente comando mientras mi cwd es / tmp actualiza ese repositorio, pero el archivo actualizado aparece en / tmp en lugar del árbol de trabajo / tmp / ggg2:
Vea también esta respuesta a una pregunta similar , que demuestra las banderas
--git-dir
y--work-tree
.fuente
.git
directorio.git --git-dir=/tmp/ggg2/.git --work-tree=/tmp/ggg2 pull
, recibo un mensaje de error. Pero si lo hagogit --git-dir=/tmp/ggg2/.git --work-tree=. pull
mientras estoy en / tmp, coloca los archivos actualizados en / tmp como debería.--work-tree
este momento--work-tree=/tmp/ggg2/
y--work-tree=/tmp/ggg2/.
ya que podría ser un problema con cómo analiza el camino.Puede envolverlo en un script bash o alias git:
fuente
pushd/popd
par en lugar decd/cd-
(cd xyz && git pull)
Esta publicación es un poco antigua, por lo que podría haber un error y se solucionó, pero acabo de hacer esto:
Y funcionó. Me tomó un minuto darme cuenta de que quería el archivo de puntos y el directorio padre (en una configuración estándar, siempre son padre / hijo pero no en TODAS las configuraciones, por lo que deben especificarse explícitamente.
fuente
Como algunos de mis servidores están en versiones antiguas de Ubuntu LTS, no puedo actualizar fácilmente git a la última versión (que admite la opción -C como se describe en algunas respuestas).
Este truco funciona bien para mí, especialmente porque no tiene el efecto secundario de algunas otras respuestas que lo dejan en un directorio diferente desde donde comenzó.
O, haciéndolo como una frase:
Tanto Linux como Windows tienen comandos pushd y popd.
fuente
Usando la combinación
pushd
,git pull
ypopd
, podemos lograr esta funcionalidad:Por ejemplo:
fuente
Puedes escribir un script como este:
Puedes llamarlo algo así
gitpull
.Si prefiere que haga directorios arbitrarios en lugar de
/X/Y
:Luego puede llamarlo con
gitpull /X/Z
Lastly, puede intentar encontrar repositorios. Tengo una
~/git
carpeta que contiene repositorios, y puede usar esto para extraerlos todos.fuente
(cd /X/Y && git pull)
.Para cualquiera como yo que intentara hacer esto a través de un comando drush (Drupal shell) en un servidor remoto, no podrá usar la solución que requiere que coloque un CD en el directorio de trabajo:
En su lugar, debe usar la solución que divide la extracción en una búsqueda y fusión:
fuente
Este podría ser un problema similar, pero también puede simplemente encadenar sus comandos. p.ej
En una linea
O a través de SSH.
fuente