2012-05-23 34 views
6

Używam GitPython z gołym repozytorium i próbuję uzyskać określony obiekt git przez jego sha. Jeżeli użyłem git bezpośrednio, ja po prostu to zrobićGitPython uzyskać obiekt drzewa i blob przez sha

git ls-tree sha_of_tree 
git show sha_of_blob 

Ponieważ używam GitPython i chcę, aby uzyskać konkretne drzewo, I wykonaj następujące czynności.

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

i otrzymaj powrotem

<git.Tree "b466a6098a0287ac568ef0ad783ae2c35d86362b"> 

Teraz mam obiekt drzewa, ale nie może uzyskać dostępu do jego ATUTY jak ścieżki, nazwy, bąble, itd

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 

ale jeśli typ następujących działa

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

Pozostałe częścią mojego pytania jest jak uzyskać obiekt blob z GitPython. Zauważyłem, że tylko drzewo obiektów ma bloby atrybutów, więc aby uzyskać blob po sha, muszę najpierw wiedzieć, do którego drzewa należy, znaleźć ten obiekt typu blob, a następnie wywołać metodę strumienia danych. mogę tylko zrobić

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

ale chciałbym najpierw wiedzieć, że jest to jedyny sposób, aby to zrobić.

Odpowiedz

3

Ogólnie rzecz biorąc, drzewo ma dzieci, które są plamami i więcej drzew. Bloby są plikami, które są bezpośrednimi potomkami tego drzewa, a pozostałe drzewa są katalogami, które kierują potomkami tego drzewa.

dostępu do plików bezpośrednio poniżej tego drzewa:

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

Dostęp do katalogów bezpośrednio poniżej tego drzewa:

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

Jak o patrząc na bąble w podkatalogów:

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

Przejdźmy do ścieżki pierwszego bloba z wcześniejszego:

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

Mamy nadzieję, że dzięki temu dowiesz się, jak poruszać się po strukturze danych i jak uzyskać dostęp do atrybutów tych obiektów.

1

Szukałem tego powodu miałem ten sam problem, i znalazłem rozwiązanie:

>>> 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"> 

czuję się jak nie powinno być sposobem na odniesienie Blob przez repo, ale nie mogłem znaleźć to.

3

Spróbuj tego:

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

proszę dodać trochę więcej wyjaśnień swojego kodu. Odpowiedzi tylko na kod nie są zbyt pomocne. Dzięki. –