我想知道如何用dulwich执行等效的git status
添加/更改/重命名某些文件并暂存它们以进行提交后,这就是我尝试过的方法:
from dulwich.repo import Repo
from dulwich.index import changes_from_tree
r = Repo('my-git-repo')
index = r.open_index()
changes = index.changes_from_tree(r.object_store, r['HEAD'].tree)
输出以下内容:
>>> list(changes)
(('Makefile', None), (33188, None), ('9b20...', None))
(('test/README.txt', 'test/README.txt'), (33188, 33188), ('484b...', '4f89...'))
((None, 'Makefile.mk'), (None, 33188), (None, '9b20...'))
((None, 'TEST.txt'), (None, 33188), (None, '2a02...'))
但是这个输出要求我进一步处理它以检测:
README.txt
。Makefile
重命名为Makefile.mk
。TEST.txt
添加到了存储库。 dulwich.diff_tree
中的函数为树更改提供了更好的界面......在实际提交之前这是不可能的吗?
答案 0 :(得分:2)
您应该能够使用dulwich.diff_tree.tree_changes
来检测两棵树之间的变化。
其中一个要求是将相关的树对象添加到对象库中 - 您可以使用dulwich.index.commit_index
来实现此目的。
答案 1 :(得分:1)
为了完整,一个工作样本:
from dulwich.repo import Repo
from dulwich.diff_tree import tree_changes
repo = Repo("./")
index = repo.open_index()
try:
head_tree = repo.head().tree
except KeyError: # in case of empty tree
head_tree = dulwich.objects.Tree()
changes = list(tree_changes(repo, head_tree, index.commit(repo.object_store)))
for change in changes:
print "%s: %s"%(change.type,change.new.path)