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

Bob*_*ork 10 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)
Run Code Online (Sandbox Code Playgroud)

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

我尝试过的:

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

Byr*_*ron 6

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

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

简单的

repos.git.add(submodule.path)
repos.index.commit("updated submodule to 'wanted commit'")
Run Code Online (Sandbox Code Playgroud)

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

蟒蛇式

submodule.binsha = submodule.module().head.commit.binsha
repos.index.add([submodule])
repos.index.commit("updated submodule to 'wanted commit'")
Run Code Online (Sandbox Code Playgroud)

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

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