2012-05-23 12 views
6

Ich benutze GitPython mit einem nackten Repository und ich versuche, bestimmte Git-Objekt durch seine sha erhalten. Wenn ich git direkt verwendet, würde ich ihn nur tunGitPython get Baum und Blob-Objekt von sha

git ls-tree sha_of_tree 
git show sha_of_blob 

Da ich GitPython bin mit und ich möchte bestimmten Baum bekommen, muss ich folgendes.

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

Und wieder

<git.Tree "b466a6098a0287ac568ef0ad783ae2c35d86362b"> 

Jetzt habe ich einen Objektbaum, aber ich kann nicht sein atributes wie Pfad zugreifen, name, Blobs, 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 

Aber wenn Typ des folgenden es funktioniert

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

Das andere Teil meiner Frage ist, wie man ein Blob-Objekt mit GitPython bekommt. Ich habe bemerkt, dass nur der Objektbaum Attribut-Blobs hat, also muss ich zuerst wissen, zu welchem ​​Baum er gehört, diesen Blob finden und dann die Methode data_stream aufrufen. konnte ich nur

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

aber ich möchte zunächst wissen, dass dies der einzige Weg ist, dies zu tun.

Antwort

3

Im Allgemeinen hat ein Baum Kinder, die Blobs und mehr Bäume sind. Die Blobs sind Dateien, die direkte Kinder dieses Baumes sind, und die anderen Bäume sind Verzeichnisse, die Richtungskinder dieses Baums sind.

die Dateien Zugriff direkt unter dem Baum:

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

die Verzeichnisse Zugriff direkt unter dem Baum:

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

Wie wäre es in den Unterverzeichnissen an den Blobs suchen:

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

Lassen Sie uns den Pfad des ersten Blobs von früher erhalten:

Hoffentlich gibt Ihnen das eine bessere Vorstellung davon, wie Sie durch diese Datenstruktur navigieren und wie Sie auf die Attribute dieser Objekte zugreifen können.

1

Ich war dafür suchen, weil ich hatte das gleiche Problem, und ich fand eine Lösung:

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

Ich fühle mich wie es eine Möglichkeit sein sollte Blob durch die Repo zu verweisen, aber ich konnte nicht finden es.

3

Try this:

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

Bitte etwas mehr Erklärung des Codes hinzufügen. Code-only-Antworten sind nicht sehr hilfreich. Vielen Dank. –