example python git

example - python git pull



Determine si el directorio está bajo control de git (10)

¿Cómo puedo saber si un directorio determinado es parte de un repositorio git?

(Lo siguiente está en python, pero bash o algo estaría bien).

os.path.isdir(''.svn'')

le dirá si el directorio actual está controlado por Subversion. Mercurial y Git solo tienen un .hg / .git en la parte superior del repositorio, así que para hg puedo usar

os.system(''hg -q stat 2> /dev/null > /dev/null'') == 0)

pero el git status devuelve un estado de salida distinto de cero (error) si no cambia nada.

¿Está iterando por el camino buscando yo mismo lo mejor que puedo hacer?


Acabo de encontrar esto en git help rev-parse

git rev-parse --is-inside-work-tree

imprime true si está en el árbol de trabajo, false si está en el árbol ''.git'', y error fatal si no es ninguno. Tanto ''verdadero'' como ''falso'' se imprimen en stdout con un estado de salida de 0, el error fatal se imprime en stderr con un estado de salida de 128.


Agregue esto a .bash_profile, y su mensaje siempre mostrará la rama activa de git y si tiene cambios no confirmados.

function parse_git_dirty { [[ $(git status 2> /dev/null | tail -n1) != "nothing to commit (working directory clean)" ]] && echo "*" } function parse_git_branch { git branch --no-color 2> /dev/null | sed -e ''/^[^*]/d'' -e "s/* /(.*/)/[/1$(parse_git_dirty)]/" } export PS1='' /[/033[0;33m/]/w/[/033[00m/]/[/033[01;00m/]$(parse_git_branch): '' #PS1=''/w> ''

Verás esto:

~: ~: cd code/scala-plugin/ ~/code/scala-plugin[master*]:


Bueno, el directorio también puede ser ignorado por el archivo .gitignore, por lo que debe buscar un repositorio .git, y si hay uno, analizar el .gitignore para ver si ese directorio está realmente en el repositorio git.

¿Qué es exactamente lo que quiere hacer? Puede haber una manera más simple de hacer esto.

EDITAR: ¿Quiere decir "este directorio es la raíz de un repositorio GIT" o, quiere decir "¿este directorio es parte de un repositorio GIT"?

Para la primera, simplemente comprueba si hay un .git, ya que está en la raíz, y listo. Para el segundo, una vez que haya determinado que está dentro de un repositorio de GIT, debe marcar .gitignore para el subdirectorio en cuestión.


Con gitpython , puedes hacer una función como esta:

import git ... def is_git_repo(path): try: _ = git.Repo(path).git_dir return True except git.exc.InvalidGitRepositoryError: return False


De la ayuda de git rev-analizar nuevamente, creo que puedes hacer algo como:

git rev-parse --resolve-git-dir <directory>

y verificar si el comando devuelve la ruta del directorio. Según el manual, git rev-parse devuelve la ruta al directorio si el argumento contiene un git repo o es un archivo que contiene la ruta a un git repo.


En ruby, system(''git rev-parse'') devolverá true si el directorio actual está en un repositorio git, y de lo contrario es falso. Me imagino que el equivalente pitonico debería funcionar de manera similar.

EDITAR: Efectivamente:

# in a git repo, running ipython >>> system(''git rev-parse'') 0 # not in a git repo >>> system(''git rev-parse'') 32768

Tenga en cuenta que hay algo de salida en STDERR cuando no está en un repositorio, si eso le importa.


Para el registro, use el estado de git o similar, esto es solo para completar: :)

La búsqueda hacia arriba de un árbol no es nada complicado, en bash puedes hacer este simple un-liner (si lo pones en una línea ...);) Devuelve 0 si se encuentra uno, de lo contrario 1.

d=`pwd` while [ "$d" != "" ]; do [ -d "$d"/.git ] && exit 0 d=${d%/*} done exit 1

buscará hacia arriba buscando una carpeta .git.


Si prefieres buscar un directorio .git , aquí hay una linda forma de hacerlo en Ruby:

require ''pathname'' def gitcheck() Pathname.pwd.ascend {|p| return true if (p + ".git").directory? } false end

No puedo encontrar algo similar para ascender en Python.


Usando git rev-parse --is-inside-work-tree junto con subprocess.Popen , puedes verificar si se imprime "verdadero" desde la salida, lo que indica que el directorio tiene un git repo:

import subprocess repo_dir = "../path/to/check/" command = [''git'', ''rev-parse'', ''--is-inside-work-tree''] process = subprocess.Popen(command, stdout=subprocess.PIPE, cwd=repo_dir, universal_newlines=True) process_output = process.communicate()[0] is_git_repo = str(process_output.strip()) if is_git_repo == "true": print("success! git repo found under {0}".format(repo_dir)) else: print("sorry. no git repo found under {0}".format(repo_dir))


Es difícil definir qué es un .git/ repositorio

Hice un poco de experimentación para ver lo que Git considera como un repositorio de Git.

A partir de 1.9.1, la estructura de directorio mínima que debe estar dentro de un directorio .git para que Git la considere es:

mkdir objects refs printf ''ref: refs/'' > HEAD

como lo reconoce rev-parse .

También es obviamente un repositorio corrupto en el que la mayoría de los comandos útiles fallarán.

La moral es: como cualquier otra detección de formato, los falsos positivos son inevitables, especialmente aquí que el repositorio mínimo es tan simple.

Si desea algo sólido, en lugar de detectar si se trata de un repositorio de Git, intente hacer lo que quiera hacer, y plantee errores y trate con ellos si falla.

Es más fácil pedir perdón que obtener permiso.