2012-05-23 15 views
6

Estoy usando GitPython con un repositorio simple y estoy tratando de obtener un objeto git específico por su sha. Si usara git directamente, sólo quiero hacer estoGitPython obtén el objeto tree y blob por sha

git ls-tree sha_of_tree 
git show sha_of_blob 

Desde que estoy usando GitPython y quiero conseguir árbol específico, hago lo siguiente.

repo = Repo("path_to_my_repo") 
repo.tree("b466a6098a0287ac568ef0ad783ae2c35d86362b") 

Y conseguir esto de vuelta

<git.Tree "b466a6098a0287ac568ef0ad783ae2c35d86362b"> 

ahora tengo un objeto del árbol, pero no puedo acceder a sus atributos como la ruta, el nombre, manchas, etc.

repo.tree("b466a6098a0287ac568ef0ad783ae2c35d86362b").path 

Traceback (most recent call last): 

File "<stdin>", line 1, in <module> 
File "c:\Python27\lib\site-packages\gitdb\util.py", line 238, in __getattr__ 
self._set_cache_(attr) 
File "c:\Python27\lib\site-packages\git\objects\tree.py", line 147, in _set_cache_ 
super(Tree, self)._set_cache_(attr) 
File "c:\Python27\lib\site-packages\git\objects\base.py", line 157, in _set_cache_ 
raise AttributeError("path and mode attributes must have been set during %s object creation" % type(self).__name__) 
AttributeError: path and mode attributes must have been set during Tree object creation 

Pero si el tipo de la siguiente funciona

repo.tree().trees[0].path 

el otro Parte de mi pregunta es cómo obtener el objeto blob con GitPython. Noté que solo el árbol de objetos tiene blobs de atributos, así que para obtener blob por sha, primero tengo que saber a qué árbol pertenece, encontrar este blob y luego llamar al método data_stream. tan sólo pudiera hacer

repo.git.execute("git show blob_sha") 

pero me gustaría saber en primer lugar que esta es la única manera de hacer esto.

Respuesta

3

En general, un árbol tiene hijos que son manchas y más árboles. Los blobs son archivos que son hijos directos de ese árbol y los otros árboles son directorios que son hijos de ese árbol en la dirección.

Acceso a los archivos directamente debajo de ese árbol:

repo.tree().blobs # returns a list of blobs 

Acceso a los directorios directamente debajo de ese árbol:

repo.tree().trees # returns a list of trees 

¿Qué tal mirando las manchas en los subdirectorios:

for t in repo.tree().trees: 
    print t.blobs 

Veamos la ruta del primer blob anterior:

repo.tree().blobs[0].path # gives the relative path 
repo.tree().blobs[0].abspath # gives the absolute path 

Espero que esto le dé una mejor idea de cómo navegar esta estructura de datos y cómo acceder a los atributos de estos objetos.

1

que estaba buscando esto porque he tenido el mismo problema, y ​​he encontrado una solución:

>>> import binascii 
>>> id_to_find = repo.head.commit.tree['README'].hexsha # For example 
>>> id_to_find 
"aee35f14ee5515ee98d546a170be60690576db4b" 
>>> git.objects.blob.Blob(repo, binascii.a2b_hex(id_to_find)) 
<git.Blob "aee35f14ee5515ee98d546a170be60690576db4b"> 

Siento que debe haber una manera de hacer referencia a gota a través de la cesión temporal, pero no pude encontrar eso.

3

Prueba esto:

def read_file_from_branch(self, repo, branch, path, charset='ascii'): 
      ''' 
      return the contents of a file in a branch, without checking out the 
      branch 
      ''' 
      if branch in repo.heads: 
       blob = (repo.heads[branch].commit.tree/path) 
       if blob: 
        data = blob.data_stream.read() 
        if charset: 
         return data.decode(charset) 
        return data 
      return None 
+0

Por favor, añadir un poco más de explicación de su código. Las respuestas de solo código no son muy útiles. Gracias. –

Cuestiones relacionadas