Git 子模块在 python 项目中使用后引发导入错误

Git submodule raises import error once used in python project

我在我的 python 项目中使用 git-子模块。

子模块项目如下所示:

-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 文档):

  • 当您克隆 [带有子模块的项目] 时,默认情况下您会获得包含子模块的目录,但是 none 其中的文件
  • 您必须 运行 两个命令:git submodule init 初始化您的本地配置文件,git submodule update 从该项目获取所有数据并检查您的文件中列出的适当提交超级项目
  • 如果你创建一个新分支,在那里添加一个子模块,然后切换回没有那个子模块的分支,你仍然有子模块目录作为未跟踪目录
  • 删除目录并不困难,但将目录放在那里可能会有点混乱。如果您删除它然后切换回具有该子模块的分支,您将需要 运行 submodule update --init 重新填充它。
  • 如果您使用子模块,很可能是因为您真的想在处理主项目中的代码的同时处理子模块中的代码 (或跨多个子模块)。否则,您可能会改用更简单的依赖管理系统(例如 Maven 或 Rubygems)。

git 个子模块的问题(我自己的观察):

  • 你经常发现你的子模块处于奇怪的状态:
    • 您想在特定的 git 提交上固定一个子模块,但现在它不知何故漂移,您的顶级项目说有涉及您的子模块的更改。
    • 不知何故,文件在子模块目录中不断变化,git 抱怨顶层或子模块中的未暂存更改。
    • 您想要一个子模块来跟踪 master,但它无法正常工作,现在您得到了非上游的合并提交。
  • updateinit 一层深的子模块已经够烦人了,但是如果你的子模块之一也使用子模块怎么办?
  • 很多第三方工具不能很好地处理子模块。我发现很多第三方工具(比如 git 的某些 IDE 或 Web 界面)并没有真正很好地处理 git 的核心部分(处理暂存区、合并、变基、压缩、编写格式良好的提交消息等),但它们在即使是最有经验的 git 用户也很少使用的功能方面尤其糟糕。

您也没有提及如何以及在何处设置顶级项目的子模块。如果您从顶级项目粘贴 .gitmodules 文件可能会更有帮助。