Programmatically `git checkout .` with dulwich

前端 未结 3 1129
[愿得一人]
[愿得一人] 2020-12-30 15:50

Having this code

from dulwich.objects import Blob, Tree, Commit, parse_timezone
from dulwich.repo import Repo
from time import time

repo = Repo.init(\"myrep         


        
相关标签:
3条回答
  • 2020-12-30 16:08

    It is now possible since release 0.8.4, with the method dulwich.index.build_index_from_tree().

    It writes a tree to both the index file and the filesystem (working copy), which is a very basic form of checkout.

    See the note

    existing index is wiped and contents are not merged in a working dir. Suiteable only for fresh clones

    I could get it work with the following code

    from dulwich import index, repo
    #get repository object of current directory
    repo = repo.Repo('.')
    indexfile = repo.index_path()
    #we want to checkout HEAD
    tree = repo["HEAD"].tree
    
    index.build_index_from_tree(repo.path, indexfile, repo.object_store, tree)
    
    0 讨论(0)
  • 2020-12-30 16:16
    from dulwich.repo import Repo
    
    repo = Repo.init('myrepo', mkdir=True)
    f = open('myrepo/spam', 'w+')
    f.write('my file content\n')
    f.close()
    repo.stage(['spam'])
    repo.do_commit('initial commit', 'Flav <foo@bar.com>')
    

    Found by looking at dulwich/tests/test_repository.py:371. dulwich is powerful but the docs are a bit lacking, unfortunately.

    May also want to consider using GitFile instead.

    0 讨论(0)
  • Git status says it's deleted because the file doesn't exist in the working copy, that's why checking it out fixes the status.

    It looks like there's no support for high-level working copy classes and functions in dulwich yet. You'd have to deal with trees and blobs and unpacking objects.

    OK, took the challenge: I could make a basic checkout with Dulwich :

    #get repository object of current directory
    repo = Repo('.')
    #get tree corresponding to the head commit
    tree_id = repo["HEAD"].tree
    #iterate over tree content, giving path and blob sha.
    for entry in repo.object_store.iter_tree_contents(tree_id):
      path = entry.in_path(repo.path).path
      dulwich.file.ensure_dir_exists(os.path.split(path)[0])
      with open(path, 'wb') as file:
        #write blob's content to file
        file.write(repo[entry.sha].as_raw_string()) 
    

    It won't delete files that must be deleted, won't care about your index, etc.
    See also Mark Mikofski's github project for more complete code based on this.

    0 讨论(0)
提交回复
热议问题