我在 python 项目中使用 git-submodule。
子模块项目如下所示:
-submodule_project
- __init__.py
- debug_util.py
- parsing_util
- __init__.py
- parse.py
- consts.py
parse.py
导入 debug_util.py
。
这种结构工作正常,因为子模块是一个独立的项目。
我的项目是这样构建的:
-project
- __init__.py
- file1.py
- some_dir
- __init__.py
- main.py
因此,一旦我在项目中使用该子模块作为 git 子模块,parse.py
就会引发 ImportError
。一旦运行导入 debug_util.py
的行,就会发生这种情况。
只是为了澄清: main.py
导入 parse.py
,它导入 debug_util.py
您能否解释一下我做错了什么,以及解决此问题的可用解决方案是什么?
这是我的 .gitmodules
文件:
[submodule "submodule_project"]
path = submodule_project
url = ../submodule_project.git
提前感谢大家!
最佳答案
Git Submodules与他们一起工作非常烦人(至少我上次和他们一起玩时是这样)。我建议不要使用子模块,而只使用 python 自己的依赖管理。因此,您的 submodule_project
将拥有自己的唯一名称,并打包在 myparser-1.2.1
等版本中,然后您的主项目将依赖于其 中的该包>setup.py
.
git 子模块的问题(来自 git 文档):
- 当您克隆[包含子模块的项目]时,默认情况下您会获得包含子模块的目录,但其中还没有任何文件
- 您必须运行两个命令:
git submodule init
来初始化本地配置文件,以及git submodule update
来从该项目中获取所有数据并检查相应的数据。提交在您的 super 项目中列出 - 如果您创建一个新分支,在其中添加一个子模块,然后切换回没有该子模块的分支,则子模块目录仍然是未跟踪的目录
- 删除该目录并不困难,但将其放在那里可能会有点困惑。如果您确实删除了它,然后切换回具有该子模块的分支,则需要运行
submodule update --init
来重新填充它。 - 如果您正在使用子模块,那么您这样做很可能是因为您确实希望在处理主项目(或跨项目)中的代码的同时处理子模块中的代码。几个子模块)。否则,您可能会使用更简单的依赖管理系统(例如 Maven 或 Rubygems)。
git 子模块的问题(我自己的观察):
- 您经常会发现子模块处于奇怪的状态:
- 您想将子模块固定在特定的 git 提交上,但现在它以某种方式发生了漂移,并且您的顶级项目表示存在涉及您的子模块的更改。
- 不知何故,文件在子模块目录内不断变化,并且 git 提示顶层或子模块中的未暂存更改。
- 您想要一个子模块来跟踪
master
,但它无法正常工作,而且现在您已经获得了非上游的合并提交。
更新
和初始化
一层深的子模块已经够烦人的了,但是如果您的子模块之一也使用子模块怎么办?- 许多第三方工具不能很好地与子模块配合使用。我发现很多第三方工具(比如一些 IDE 或 git 的 Web 界面)并没有真正很好地处理 git 的核心部分(处理暂存区、合并、 rebase 、压缩、编写格式良好的提交)消息等),但它们的功能尤其糟糕,即使是最有经验的 git 用户也很少使用。
您也没有提及如何以及在何处从顶级项目设置子模块。如果您从顶级项目粘贴 .gitmodules
文件可能会更有帮助。
关于python - Git 子模块在 python 项目中使用后会引发导入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45305101/