5

有这个代码

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 content\n")
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这样说)。

Agit checkout .修复它。

我的问题是:如何以git checkout .编程方式使用德威?

4

4 回答 4

9

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 项目。

于 2011-07-10T11:20:24.760 回答
3

从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)
于 2012-09-17T18:33:45.967 回答
0
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>')

通过查看发现dulwich/tests/test_repository.py:371。德威很强大,但不幸的是,文档有点缺乏。

可能还想考虑改用GitFile

于 2011-07-10T11:29:42.407 回答
0

如果您想从远程存储库中签出现有分支,这就是我最终设法做到的方式:

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 分支,而我找不到另一种获取它们的方法。所以我从主/主创建分支作为新分支,然后从远程拉。

(如果您的主分支在启动远程分支的初始提交之前,这可能不起作用。)

于 2021-11-10T07:23:27.463 回答