Git:在repo中合并一个文件夹

时间:2013-09-12 01:35:51

标签: python git python-3.x merge

我有一个不寻常的需求,我想知道Git是否可以填补它。

我想将我的Python包python_toolbox移植到Python 3.但我不喜欢使用2to3的想法,也不喜欢使用相同的代码支持Python 2和Python 3。 (因为对我而言,我的代码很漂亮很重要,而且我找不到为Python 2和Python 3编写的代码都很漂亮。)

我想要的是拥有2个独立的源文件夹,一个用于Python 2.x,另一个用于Python 3.x.这将允许我编写为各自主要Python版本定制的每个代码版本。我希望两个文件夹都在同一个repo中,setup.py将根据运行它的Python版本动态选择它们。到现在为止还挺好。

现在,这里是我需要帮助的地方:我希望能够从我的Python 2.x源文件夹到我的Python 3.x源文件夹进行合并。为什么?当我在Python 2.x文件夹上开发一个功能时,我想在Python 3.x版本上也有这些功能。我不想手动复制它们。我想将它们合并到Python 3.x文件夹中,我完全希望有很好的合并失败,我将不得不用我的判断来决定如何将为Python 2.x实现的功能合并到已修改的代码中对于Python 3.x。

问题是:我该怎么做?这些文件夹是Git仓库中的文件夹,它们不是Git repos自己。我想过使用Git子模块,这是我以前从未使用过的,但在网上阅读它们会描绘一幅可怕的画面。 (“sobmodules”一词已被抛出。)

我在Git仓库中如何合并这些文件夹的任何其他想法?

2 个答案:

答案 0 :(得分:1)

我建议你使用分支机构。将您的分支机构专用于任一版本。您可以使用git branch --orphan创建完全独立的分支。 (这可能会使合并变得更加困难,因为git无法找到共同的祖先。)

无论如何,如果您使用该解决方案,您将能够从一个版本合并到另一个版本。您还可以在一个命令中克隆这两个版本(因为它们位于同一个repo中)。 但是,为了能够同时打开这两个版本,您需要将repo克隆两次,这样您就可以同时检出两个不同的分支。

答案 1 :(得分:0)

您可以通过将两个版本放在不同的存储库中来创建分支,并将另一个版本用作远程。带有setup.py的顶级目录和任何PyPi元信息,自述文件等也将是一个存储库。目录布局如下所示:

/root/
   .git/
   setup.py
   read.me
   python2/
      .git/
      source.py
   python3/
      .git/
      source.py

可以链接两个子存储库,以便您可以将它们合并为例如

cd /root/python2
git remote add python3 ../python3
cd /root/python3
git remote add python2 ../python2

然后,您可以在它们之间执行通常的git fetchcherry-pick甚至merge

在主回购中,为了发布内容,您可以使用git submodules feature来协调您要签出的各个子库的版本,以获得项目的一致视图。

互联网上有很多关于git子模块的东西。我将从this question on nested repos开始,逐步完成链接和文档。

子树的

Here's an explanation合并并将其与子模块进行比较。基本上,子树合并将在一个回购中结合使用Py2和Py3的普通分支(如在the answer by Oznerol256中)的想法,以及具有分层组织的回购的想法。