拥有此代码
from dulwich.objects import Blob, Tree, Commit, parse_timezone
from dulwich.repo import Repo
from time import time
repo = Repo.init("myrepo", mkdir=True)
blob = Blob.from_string("my file contentn")
tree = Tree()
tree.add("spam", 0100644, blob.id)
commit = Commit()
commit.tree = tree.id
author = "Flav <foo@bar.com>"
commit.author = commit.committer = author
commit.commit_time = commit.author_time = int(time())
tz = parse_timezone('+0200')[0]
commit.commit_timezone = commit.author_timezone = tz
commit.encoding = "UTF-8"
commit.message = "initial commit"
o_sto = repo.object_store
o_sto.add_object(blob)
o_sto.add_object(tree)
o_sto.add_object(commit)
repo.refs["HEAD"] = commit.id
我最终在历史中完成了提交,但创建的文件正在等待删除(git status
是这样说的(。
git checkout .
修复了它。
我的问题是:如何使用dulwich以编程方式执行git checkout .
?
Git状态表示它已被删除,因为工作副本中不存在该文件,这就是为什么签出它会修复状态。
看起来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())
它不会删除必须删除的文件,不会关心您的索引等。
另请参阅Mark Mikofski的github项目,以获取基于此的更完整的代码。
自0.8.4版本以来,现在可以使用方法dulwich.index.build_index_from_tree()
。
它向索引文件和文件系统(工作副本(写入一个树,这是一种非常基本的签出形式。
参见注释
现有索引已擦除,内容未合并在工作目录中。仅适用于新克隆
我可以用以下代码让它工作
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)
如果您想从远程存储库中签出现有分支,我最终是这样做的:
from dulwich import porcelain
gitlab_server_address = 'gitlab.example.com/foo/my_remote_repo.git'
username = 'foo@bar.com'
password = 'mocraboof'
repo = porcelain.clone(gitlab_server_address, target='myrepo', username=username, password=password)
# or if repo already exists:
# repo = porcelain.open_repo('gholam')
branch_name = 'thebranch'
porcelain.branch_create(repo, branch_name)
porcelain.update_head(repo, target=branch_name, detached=False, new_branch=None)
porcelain.pull(repo, gitlab_server_address, refspecs=f'refs/heads/{branch_name}', username=username, password=password)
问题是,当您使用dulwich克隆存储库时,它只会获取主/主分支,而我找不到其他方法来获取它们。因此,我从main/master将分支创建为新分支,然后从remote提取。
(如果您的主分支在启动远程分支的初始提交之前,则这可能不起作用。(
from dulwich.repo import Repo
repo = Repo.init('myrepo', mkdir=True)
f = open('myrepo/spam', 'w+')
f.write('my file contentn')
f.close()
repo.stage(['spam'])
repo.do_commit('initial commit', 'Flav <foo@bar.com>')
通过查看dulwich/tests/test_repository.py:371
找到。德威很强大,但遗憾的是,医生们有点欠缺。
可能还想考虑使用GitFile。