我已经在这里工作了好几个小时了,尽管我感觉很接近,但我似乎无法解决这个问题。
我试图创建一个带有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])
添加子模块本身(根据文档应该是可能的),似乎没有任何事情发生。答案 0 :(得分:4)
有两种方法可以将新的子模块提交添加到父存储库。一个将直接使用git
命令,另一个将在pure-python中实现。
所有示例均基于问题中提供的代码。
repos.git.add(submodule.path)
repos.index.commit("updated submodule to 'wanted commit'")
上面的代码将调用git
命令,这类似于在shell中执行git add <submodule.path>
。
submodule.binsha = submodule.module().head.commit.binsha
repos.index.add([submodule])
repos.index.commit("updated submodule to 'wanted commit'")
IndexFile.add(...)
实现添加了它在子模块对象中找到的binsha
。这个将是父存储库当前提交中的那个,而不是在子模块中检出的提交。可以看到Submodule
对象是子模块的单个快照,它不会改变,也不会知道对子模块库的更改。
在这种情况下,将子模块对象的binsha
字段覆盖到其存储库中实际检出的字段似乎最简单,因此将其添加到索引将具有所需的效果。