bounty还有3天到期。回答此问题可获得+500声望奖励。Dani Mesejo希望引起更多的注意这个问题。
我正在尝试在git中模拟svn:externals。在项目'A'中,我需要将库'B'下拉到'A'的子文件夹中。A和B都是独立的git仓库。我知道我可以用子模块或子树合并来完成。然而,为了使事情更加复杂,我需要将'B'的子文件夹拉到'A'中,而不是整个项目,因为它是一个我需要直接导入的python模块,我不能在那里拥有根目录结构,或者它不能被导入。
这很容易用svn:externals实现.对于git来说,这似乎很复杂,甚至是不可能的。
下面是一个示例:
项目B:
-B
- src
__init__.py
- test
...
项目A:
- A
- src
A.py (imports B)
- B (partial check of sub folder 'src' as name 'B')
__init__.py
- test
...
5条答案
按热度按时间ssgvzors1#
Git通常是全有或全无。最好的办法是将模块克隆到其他地方,然后符号链接到所需的目录,或者使用
sys.path
。如果你关心子模块的克隆的大小,并且你不需要提交它,那么你可以在克隆时使用
--depth=1
来忽略历史。不幸的是,您不能克隆子文件夹。最多可以使用
git-filter-branch
从存储库中删除除选定子文件夹之外的所有内容。yx2lnoni2#
与其通过调整git来解决这个问题,为什么不直接在任何地方安装B,并告诉A在哪里找到要包含的子模块呢?如果您只是将包含相关B子模块的文件夹添加到
sys.path
,则可以回家。qnyhuwrf3#
我认为用子树合并来合并子模块会更好,所以首先将
project B
作为子模块添加到project A
中,因为这样会将project B
作为子模块添加到A/B
目录中!现在执行子树合并,只将
project B
的所需子文件夹包含到project A
中现在,您可以轻松地将子模块更新为
project A
中所需的提交你也可以通过一个简单的Python脚本来实现这一点,让我向你展示如何:
祝你好运!
6rvt4ljy4#
在git中没有内置的方法来做到这一点,你可以通过两个步骤来做到这一点:
1.在存储库
B
中,您可以“挤出”src/
目录的历史记录:1.从repo
A
,你现在可以使用git subtree ...
来包含来自repoB
的分支src-master
。git filter-repo --subdirectory-filter ...
将以可重复的方式运行:如果稍后
B
得到更新,则在更新的master
分支上运行git filter-repo --subdirectory-filter ...
将导致更新src-master
分支的历史。所以你将能够看到添加了什么提交,git merge
或git rebase
将从预期的合并基数开始,等等。。6ojccjat5#
B(库)必须也是超模块,其中包括子模块“python模块”
您选择了错误的工具,并离开了更高的抽象层,比任务所需的