如何使用 python 模块的多个 git 分支?
Posted
技术标签:
【中文标题】如何使用 python 模块的多个 git 分支?【英文标题】:How do I work with multiple git branches of a python module? 【发布时间】:2010-09-25 12:05:45 【问题描述】:我想使用 git 来处理我正在编写的模块中的多个功能。我目前正在使用 SVN,只有一个工作区,所以我的 PYTHONPATH 上只有一个工作区。我意识到这不太理想,所以我想知道是否有人可以提出更“正确”的方法。
让我用一个假设的情况来详细说明: 我说我有一个模块'eggs',子模块'foo'和'bar'。 'bar' 中的组件使用 foo 中的代码,因此 eggs/bar/a.py 可能会“导入 egg.foo”。
假设“eggs”在 git 存储库中。我想尝试对“foo”进行一些更改,所以我复制了它。问题是eggs/bar 中的'import eggs.foo' 在PYTHONPATH 中找到了原始存储库,所以它最终使用旧的'foo' 而不是我修改过的。
如何设置自己,使模块的每个副本都使用自己关联的“foo”?谢谢。
edit-感谢指向相对导入的指针。我已经阅读了它,我可以看到如何应用它。我在使用它时遇到的一个问题是我已经建立了一个相当大的代码库,而且我对它并不太了解,所以大多数模块在if __name__ == '__main__':
下都有一个快速的“自测”,从什么我读过不玩相对进口:
http://mail.python.org/pipermail/python-list/2006-October/408945.html
http://www.velocityreviews.com/forums/t502905-relative-import-broken.html
我可以通过谷歌搜索到的另一个解决方案是故意操纵 sys.path,这似乎是一种更糟糕的 hack。还有其他可能吗?
编辑 - 感谢您的建议。我最初误解了 git 分支,所以指出的分支正是我想要的。尽管如此,我之前没有听说过相对进口,所以也谢谢你。我学到了一些新东西,可能会用到它。
【问题讨论】:
查看相关问题(右侧)。 【参考方案1】:Relative imports (PEP 328) 可能会有所帮助:
eggs/
__init__.py
foo.py
bar.py
# foo.py
from __future__ import absolute_import
from . import bar
请参阅How do you organize Python modules? 了解其他选项。
编辑:
另一种选择是使用 S.Lott 和 Jim 的建议,即重组你的包以分解出eggs.bar.a
使用的eggs.foo
部分,并使用git
在实验分支上工作(参见Git Community Book)。
这是一个例子:
$ git status
# On branch master
nothing to commit (working directory clean)
[只是为了确保一切顺利]
$ git checkout -b experimental
Switched to a new branch "experimental"
[从事实验性工作]
$ git commit -a
[提交到实验分支]
$ git checkout master
Switched to branch "master"
[在主分支上工作]
$ git commit -a
将更改合并到主分支:
$ git merge experimental
参见上述书中的Basic Branching and Merging章节。
【讨论】:
谢谢。我已经问了一个相关的后续问题,如果你愿意看看:***.com/questions/345746/…【参考方案2】:也许我的理解不正确,但似乎 git 会成为这里的解决方案,因为 git 的分支不需要单独的路径。
为您的 Eggs 模块的每个工作版本创建一个分支。然后,当您签出该分支时,整个模块将更改为与您的子模块版本匹配的状态。然后,您可以在分支之间来回合并您需要的内容。
正如 S.Lott 所指出的,可能进行一点重构也无妨;)
【讨论】:
我是 git 新手,所以我不确定我是否理解您的建议。问题是,如果我签出了两个分支,则始终会首先找到第一个分支的子模块。你有办法解决这个问题吗?我会考虑重构这个。 我对 git 的缺乏经验表明。我一直通过简单地复制存储库进行分支,但您确实是对的。 Git 分支做的正是我想要的。【参考方案3】:"假设我有一个模块'eggs',有子模块'foo'和'bar'。'bar'中的组件使用foo中的代码,所以eggs/bar/a.py可以'import egg.foo' 。”
这可能不是最好的结构。我建议您有一些其他模块正在努力退出。
你有eggs.bar.a
取决于eggs.foo
。我猜eggs
上的其他内容取决于eggs.foo
。此外,我怀疑eggs.foo
可以划分为eggs.foo
和eggs.quux
,事情可能会更简单。
我建议重构它以获得更好的结构。 PYTHONPATH
问题是模块树中错误位置太多东西的症状。
【讨论】:
将通用代码重构为 egg.quux 并不能解决问题。如果我正在处理模块的两个副本,即使我将两个都放在 PYTHONPATH 中,一个总是先出现,所以第二个 egg.bar.a 仍然有效地使用第一个的 eggs.quux。 重点是避免通用模块的2个副本。一份,与其他东西分开。以上是关于如何使用 python 模块的多个 git 分支?的主要内容,如果未能解决你的问题,请参考以下文章