Python 以编程方式“git checkout.”与dulwich
有这个代码吗Python 以编程方式“git checkout.”与dulwich,python,git,dulwich,Python,Git,Dulwich,有这个代码吗 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, blo
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
从dulwich.objects导入Blob、Tree、Commit、parse_时区
从dulwich.repo导入repo
从时间导入时间
repo=repo.init(“myrepo”,mkdir=True)
blob=blob.from\u字符串(“我的文件内容\n”)
tree=tree()
添加(“垃圾邮件”,0100644,blob.id)
commit=commit()
commit.tree=tree.id
作者=“弗拉夫”
commit.author=commit.committer=author
commit.commit\u time=commit.author\u time=int(time())
tz=parse_时区('+0200')[0]
commit.commit\u timezone=commit.author\u timezone=tz
commit.encoding=“UTF-8”
commit.message=“初始提交”
o_sto=repo.object_存储
o_sto.add_对象(blob)
o_sto.add_对象(树)
o_sto.add_对象(提交)
repo.refs[“HEAD”]=commit.id
我以历史记录中的提交结束,但创建的文件正在等待删除(git status
这样说)
git签出。修复了它
我的问题是:如何执行
git签出。
以编程方式使用dulwich?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())
它不会删除必须删除的文件,也不会关心您的索引等。另请参阅以此为基础的更完整代码。
来自dulwich.repo import repo
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>')
repo=repo.init('myrepo',mkdir=True)
f=开放('myrepo/spam','w+'))
f、 写入('我的文件内容\n')
f、 关闭()
回购阶段(['spam'])
回购协议提交(“初始提交”、“Flav”)
通过查看dulwich/tests/test\u repository.py:371
找到。德威治很强大,但不幸的是,文档有点缺乏
也可以考虑使用。这是可能的,因为方法>代码> DulWICH.Index。p>
它将树写入索引文件和文件系统(工作副本),这是一种非常基本的签出形式
见附注
现有索引将被擦除,而内容不会被合并
在一个工作目录中。仅适用于新克隆
我可以用下面的代码让它工作
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)
-1看到源,它不签出提交;它是OP代码的包装器实际上它可以工作,因为您将文件写入工作副本,因此无需签出,但它不能回答OP的问题。它是OP代码的包装器,用更少的代码行生成他想要的最终结果。它不仅仅是将文件写入工作目录;它使用它来执行提交。这是使用dulwich执行OP操作的“正确”方式。当然,这是一种更好的提交方式,但它没有说明如何签出,这是一个有趣的问题。这个解决方案对我来说也很好,因为我将首先获得数据,然后再添加数据。但是它没有回答这个问题,我仍然很好奇如何签出分支。您的代码没有设置为当前提交,修复了它。是的,它在那里,但我的复制/粘贴技能截断了代码:|+1用于使用
打开…
而不是f.close()
!您还可以将添加到entry.path
中,该路径将
附加到树的命名元组中。看看我能不能想出更好的办法。仅供参考d.repo.BaseRepo.get\u blob(sha)
引发NotBlob
错误,而不是get\u object
,否则完全相同。另外d.file。确保目录存在(os.path.split(entry.in\u path(repo.path).path)[0])
可以很好地创建目录,如果它们还不存在的话。最后,d.GitFile(路径,模式)
执行与文件
相同的操作。你知道as_raw_string
和as_pretty_string
之间的区别吗?他们看起来一样。我在github上为更多这些代码片段启动了一个dulwich Cellar repo。这并没有设置模式,所以git状态仍然表示已删除或未跟踪,所以使用chmod entry.mode entry.in_path(repo.path).path
。有一件事,我不确定“文件模式就像是你可以给chmod命令的八进制参数。除了它是扩展形式,用来区分目录和其他类型的常规文件。”我发誓,Blob.data
与as_raw_string()