Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 以编程方式“git checkout.”与dulwich_Python_Git_Dulwich - Fatal编程技术网

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()