GitPython:如何提交更新的子模块
GitPython: how to commit updated submodule
我已经在这几个小时了,虽然我有一种感觉,我很接近,但似乎无法弄清楚。
我正在尝试制作一个脚本,该脚本采用 git 存储库,将该存储库中的子模块更新为指定版本,并提交该更改。
什么有效:
我可以找到存储库,获取子模块并检查我想要的提交。
什么不起作用:
我似乎无法添加更新的子模块哈希,所以我可以提交它。
我的代码:
repos = Repo('path/to/repos')
submodule = repos.submodule('submodule-name')
submodule.module().git.checkout('wanted commit')
diff = repos.index.diff(None)
此时我可以看到子模块的变化。如果我检查 sourcetree,我可以在 'unstaged files' 中看到更改的子模块。
问题是,我不知道如何进行更改以便我可以提交它。
我尝试过的:
- 如果我使用
repos.index.commit('')
提交,它会创建一个空提交。
- 如果我尝试使用
repos.index.add([submodule.path])
添加子模块的路径,子模块中的所有文件都会添加到存储库中,这肯定不是我想要的。
- 如果我尝试使用
repos.index.add([submodule])
添加子模块本身(根据文档应该是可能的),似乎没有任何反应。
有两种方法可以将新的子模块提交添加到父存储库。一种会直接使用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
字段覆盖为实际在其存储库中检出的字段似乎最简单,因此将其添加到索引中将达到预期的效果。
我已经在这几个小时了,虽然我有一种感觉,我很接近,但似乎无法弄清楚。
我正在尝试制作一个脚本,该脚本采用 git 存储库,将该存储库中的子模块更新为指定版本,并提交该更改。
什么有效:
我可以找到存储库,获取子模块并检查我想要的提交。
什么不起作用:
我似乎无法添加更新的子模块哈希,所以我可以提交它。
我的代码:
repos = Repo('path/to/repos')
submodule = repos.submodule('submodule-name')
submodule.module().git.checkout('wanted commit')
diff = repos.index.diff(None)
此时我可以看到子模块的变化。如果我检查 sourcetree,我可以在 'unstaged files' 中看到更改的子模块。 问题是,我不知道如何进行更改以便我可以提交它。
我尝试过的:
- 如果我使用
repos.index.commit('')
提交,它会创建一个空提交。 - 如果我尝试使用
repos.index.add([submodule.path])
添加子模块的路径,子模块中的所有文件都会添加到存储库中,这肯定不是我想要的。 - 如果我尝试使用
repos.index.add([submodule])
添加子模块本身(根据文档应该是可能的),似乎没有任何反应。
有两种方法可以将新的子模块提交添加到父存储库。一种会直接使用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
字段覆盖为实际在其存储库中检出的字段似乎最简单,因此将其添加到索引中将达到预期的效果。