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

标签 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]) 添加子模块本身(根据文档,这应该是可能的),似乎没有任何反应。

最佳答案

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

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

简单

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

上面的代码将调用 git命令,类似于执行 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它在子模块对象中找到。这一个将是父存储库当前提交中的一个,而不是在子模块中 checkout 的提交。可以看到 Submodule对象作为子模块的单一快照,它不会更改,也不知道子模块存储库的更改。

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

关于python - GitPython:如何提交更新的子模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31835812/

相关文章:

Python 分节阅读 pdf

python - sklearn 特征不影响准确性

python - 如何使用 matplotlib 在同一个图上绘制多个轨迹

git - 直接在博客中显示 Github 存储库文件

git - 我可以用子模块制作 "deep copy"的 git 存储库吗?

git - 删除 Git 子模块中的旧分支是安全的 w.r.t. 'supermodules' 的可用历史记录?

python - 在pygame中彼此相邻放置时尝试删除两个对象

git - "git submodule absorbgitdirs"的对面/反面?

Git:一个文件夹中有多个子树/子模块?

git - 如何将 git 存储库添加为另一个 git 存储库的共享依赖项?