以编程方式"git checkout"和德威



拥有此代码

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。

相关内容

  • 没有找到相关文章

最新更新