2012-05-23 24 views
6

Tôi đang sử dụng GitPython với kho lưu trữ trống và tôi đang cố gắng lấy đối tượng git cụ thể bằng sha của nó. Nếu tôi sử dụng git trực tiếp, tôi sẽ chỉ làm điều nàyGitPython lấy đối tượng cây và blob bởi sha

git ls-tree sha_of_tree 
git show sha_of_blob 

Vì tôi đang sử dụng GitPython và tôi muốn có cây cụ thể, tôi làm như sau.

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

Và có được điều này lại

<git.Tree "b466a6098a0287ac568ef0ad783ae2c35d86362b"> 

Bây giờ tôi có một đối tượng cây nhưng tôi không thể truy cập atributes của nó giống như con đường, tên, các đốm màu, vv

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 

Nhưng nếu loại như sau nó hoạt động

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

Khác một phần của câu hỏi của tôi là làm thế nào để có được đối tượng blob với GitPython. Tôi nhận thấy rằng cây đối tượng duy nhất có các đốm màu thuộc tính để có được blob bởi sha, trước tiên tôi phải biết cây nào thuộc về nó, tìm blob này và sau đó gọi phương thức data_stream. Tôi chỉ có thể làm

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

nhưng tôi muốn biết đầu tiên rằng đây là cách duy nhất để thực hiện việc này.

Trả lời

3

Nói chung, một cây có con là những đốm màu và nhiều cây hơn. Các đốm màu là các tập tin là con trực tiếp của cây đó và các cây khác là các thư mục là hướng con của cây đó.

Truy cập vào các tập tin trực tiếp bên dưới cái cây đó:

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

Truy cập vào các thư mục trực tiếp bên dưới cái cây đó:

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

Làm thế nào về cách nhìn vào các đốm màu trong các thư mục con:

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

Hãy lấy đường dẫn của đốm màu đầu tiên từ trước:

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

Hy vọng điều này sẽ cho bạn ý tưởng tốt hơn về cách điều hướng cấu trúc dữ liệu này và cách truy cập các thuộc tính của các đối tượng này.

1

tôi đang tìm kiếm này vì tôi đã có cùng một vấn đề, và tôi tìm thấy một giải pháp:

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

tôi cảm thấy như không nên có một cách để tham khảo Blob qua repo, nhưng tôi không thể tìm thấy nó.

3

Hãy thử điều này:

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

Vui lòng thêm một số giải thích thêm mã của bạn. Câu trả lời chỉ có mã không phải là rất hữu ích. Cảm ơn. –

Các vấn đề liên quan