GitPython:如何提交更新的子模块

时间:2015-08-05 14:46:53

标签: python git git-submodules gitpython

我已经在这里工作了好几个小时了,尽管我感觉很接近,但我似乎无法解决这个问题。

我试图创建一个带有git存储库的脚本,将该存储库中的子模块更新为指定版本,然后提交更改。

什么有效:

我可以找到存储库,获取子模块并查看我想要的提交。

什么不起作用:

我似乎无法添加更新的子模块哈希,因此我可以提交它。

我的代码:

repos = Repo('path/to/repos')
submodule = repos.submodule('submodule-name')
submodule.module().git.checkout('wanted commit')

diff = repos.index.diff(None)

此时我可以看到子模块的变化。如果我检查sourcetree,我可以在未分页的文件中看到更改的子模块'。 问题是,我不知道如何进行更改以便我可以提交。

我尝试过:

  • 如果我使用repos.index.commit('')提交,则会创建一个空提交。
  • 如果我尝试使用repos.index.add([submodule.path])添加子模块的路径,则子模块中的所有文件都会添加到存储库中,这绝对不是我想要的。
  • 如果我尝试使用repos.index.add([submodule])添加子模块本身(根据文档应该是可能的),似乎没有任何事情发生。

1 个答案:

答案 0 :(得分:4)

有两种方法可以将新的子模块提交添加到父存储库。一个将直接使用git命令,另一个将在pure-python中实现。

所有示例均基于问题中提供的代码。

简单

repos.git.add(submodule.path)
repos.index.commit("updated submodule to 'wanted commit'")

上面的代码将调用git命令,这类似于在shell中执行git add <submodule.path>

Python化

submodule.binsha = submodule.module().head.commit.binsha
repos.index.add([submodule])
repos.index.commit("updated submodule to 'wanted commit'")

IndexFile.add(...)实现添加了它在子模块对象中找到的binsha。这个将是父存储库当前提交中的那个,而不是在子模块中检出的提交。可以看到Submodule对象是子模块的单个快照,它不会改变,也不会知道对子模块库的更改。

在这种情况下,将子模块对象的binsha字段覆盖到其存储库中实际检出的字段似乎最简单,因此将其添加到索引将具有所需的效果。