Estoy escribiendo una serie de scripts para la gestión de Git en zsh.
¿Cómo verifico si el directorio actual es un repositorio Git? (Cuando no estoy en un repositorio de Git, no quiero ejecutar un montón de comandos y obtener un montón de fatal: Not a git repository
respuestas).
$GIT_DIR
o$GIT_WORK_TREE
variables de entorno, o la forma en que interactúan.Respuestas:
Copiado del archivo de finalización de bash, la siguiente es una forma ingenua de hacerlo
Podrías envolverlo en una función o usarlo en un script.
Condensado en una condición de una línea adecuada para bash y zsh
fuente
git rev-parse --is-inside-git-dir
. Yo personalmente usogit rev-parse --is-inside-work-tree
antes de configurar mi PS1.--is-inside-git-dir
solo devolverá verdadero si realmente está dentro del.git
directorio de un repositorio. No creo que el OP esté buscando eso.--is-inside-work-tree
tampoco--is-inside-git-dir
va a funcionar cuando está fuera de un repositorio git. ver: groups.google.com/forum/#!topic/git-users/dWc23LFhWxE.git
. Para mayor robustez, omita el[ -d .git ]
y solo usegit rev-parse ...
.Puedes usar:
Lo cual imprimirá 'verdadero' si está en un árbol de trabajo de repositorios git.
Tenga en cuenta que aún devuelve la salida a STDERR si está fuera de un repositorio git (y no imprime 'falso').
Tomado de esta respuesta: https://stackoverflow.com/a/2044714/12983
fuente
git rev-parse --show-toplevel
partidos con la subcarpeta estoy comprobandoUtilice git rev-parse --git-dir
fuente
O podrías hacer esto:
fuente
-e
modo:[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]
No estoy seguro si hay una forma públicamente documentada de hacer esto (hay algunas funciones internas de git que puede usar / abusar en la fuente de git)
Podrías hacer algo como;
fuente
Basado en la respuesta de @Alex Cory :
no contiene operaciones redundantes y funciona en
-e
modo.git rev-parse
éxito, ignorando su salida.git
comandos solo son válidos dentro de un árbol de trabajo. Entonces, para fines de secuencias de comandos, lo más probable es que esté interesado en estar no solo dentro de un "git repo" sino dentro de un árbol de trabajo.fuente
[
en absoluto. Solo hazloif git rev-parse --is-inside-work-tree; then ...
(con las redirecciones que desees)Otra solución es verificar el código de salida del comando.
Esto imprimirá 1 si está en una carpeta de repositorio de git.
fuente
.git
directorio, lo que puede querer o no.git rev-parse 2>&-
,.Esta respuesta proporciona una función de shell POSIX de muestra y un ejemplo de uso para complementar la respuesta de @ jabbie .
git
devuelve errorlevel0
si está dentro de un repositorio git, de lo contrario, devuelve errorlevel128
. (También regresatrue
ofalse
si está dentro de un repositorio git).Ejemplo de uso
fuente
.git
, tendrá éxito pero imprimefalse
.git rev-parse --is-inside-work-tree
vuelvetrue
ofalse
entonces es dentro de un repositorio git, y eso es lo que devuelve la función. es decir, la función es correctaesto funciona para mi Todavía obtienes los errores, pero son lo suficientemente fáciles de suprimir. ¡también funciona desde dentro de subcarpetas!
git status> / dev / null 2> & 1 && echo ¡Hola Mundo!
Puede poner esto en una declaración if then si necesita hacer más condicionalmente.
fuente
git status
puede ser muy lento en un repositorio grande / antiguo. No lo usaría para este propósito.¿Por qué no usar códigos de salida? Si existe un repositorio git en el directorio actual, a continuación,
git branch
ygit tag
los comandos de devolver el código de salida de 0; de lo contrario, se devolverá un código de salida distinto de cero. De esta manera, puede determinar si existe un repositorio git o no. Simplemente, puedes ejecutar:Ventaja : Flexibe. Funciona para repositorios desnudos y no desnudos, y en sh, zsh y bash.
Explicación
git tag
: Obtener etiquetas del repositorio para determinar si existe o no.> /dev/null 2>&1
: Evita imprimir cualquier cosa, incluidas las salidas normales y de error.[ $? -eq 0 ]
: Verifique si el comando anterior regresó con el código de salida 0 o no. Como sabrá, cada salida distinta de cero significa que algo malo sucedió.$?
recibe el código de salida de la orden anterior, y[
,-eq
y]
realizar la comparación.Como ejemplo, puede crear un archivo
check-git-repo
con el siguiente contenido, hacerlo ejecutable y ejecutarlo:fuente
# comprobar si git repo
fuente
[
aquí en absoluto. Solo hazlo:if git rev-parse --is-inside-work-tree > /dev/null 2>&1; then ....
Gracias ivan_pozdeev , ahora tengo una prueba si dentro del directorio .git el código no se ejecutará, por lo que no se imprimen errores o el estado de salida es falso.
El " ! [[$ (Pwd) = .git / || $ (pwd) = * .git]] " prueba si no está dentro de un repositorio .git, entonces ejecutará el comando git. El comando de tipo incorporado se usa para verificar si tiene instalado git o si está dentro de su RUTA. ver tipo de ayuda
fuente
¿Qué tal esto?
fuente
Puede agregar o reemplazar su $ PS1 en su zshrc con una u otra herramienta git-prompt. De esta manera, puede ser convenientemente informado de si está en un repositorio de git y del estado del repositorio.
fuente
Los ! niega así que incluso si ejecuta esto en un directorio que no es un repositorio de git, no le dará algunos errores fatales
El > / dev / null 2> & 1 envía los mensajes a / dev / null ya que estás justo después del estado de salida. Los {} son para agrupaciones de comandos, por lo que todos los comandos después de || se ejecutará si el git rev-parse tuvo éxito ya que usamos a! que negó el estado de salida de git rev-parse. El printf es sólo para imprimir algún mensaje y git estado para imprimir el estado de la cesión temporal.
Envuélvalo en una función o póngalo en un script. Espero que esto ayude
fuente
.git
, tendrá éxito pero imprimefalse
.