标签: git-submodules

高度耦合的git子模块

我有一个项目需要分成两个存储库:一组通用模型,以及基于这些模型的模拟,以及其他代码.最终可能会有多个模拟使用同一组模型,因此将它们放在一个单独的存储库中是一个明确的要求.显而易见的解决方案是将通用模型作为模拟的子模块.

不幸的是,这两个库的工作将非常高度耦合.人们会经常在他们的常见模型中添加一些东西,然后立即在模拟中使用它.我想这会在模拟回购的整合过程中引起很多麻烦.为了在模拟中合并来自许多开发人员的更改,集成商将不得不在通用模型子模块中进行并行合并.另一方面,它也使得使用子模块变得至关重要 - 模拟真的需要知道它应该使用哪个版本的常见模型.

该项目由相当多的人开展.大多数开发人员只对git有一个非常粗略的了解:他们添加文件,提交和从源头拉取很多东西,并希望有一个开发和稳定的分支.积分器自然学到了很多东西,但任何涉及子模块的东西对他来说肯定都是新的.额外的奖励:我即将休假一个月,所以我将无法扑灭任何火灾.结果是,有很多动机使工作流程变得非常难以搞砸,并最大限度地减少与以前工作流程的差异.

所以,我的问题是:我是否会后悔建议我们使用子模块?(有更好的想法吗?)我可以期待人们犯下什么样的错误,所以我可以提前警告他们?是否有任何好的工作流程策略要记住?

编辑:我刚遇到git slave,在这种情况下也许值得一看.还不能对其网站上的能力/限制进行良好的评估.

git git-submodules

16
推荐指数
2
解决办法
2300
查看次数

如何将Git项目迁移到包含子项目的一个项目

我现在有许多项目在单独的Git存储库中.它们同样也是在单独的eclipse项目中(因为m2插件中的错误导致我无法长时间使用Maven插件使用父项目).现在有效.

因此,我将Maven中的项目组合在一起,制作了一个基础pom项目,并将其作为其他项目的父项添加.然后我嵌套了子项目.

当我将基础项目作为git项目提交时,它已经确定子目录是子模块,即使根目录中没有.gitmodules文件.

看起来完成此任务的唯一方法是丢失正在组合的项目中的所有历史记录.

只是要非常明确,目前有:

Project A (repo A)
Project B (repo B)
Project C (repo C)
Run Code Online (Sandbox Code Playgroud)

我想要的是:

New Base Project D (repo D)
   /Project A
   /Project B
   /Project C
Run Code Online (Sandbox Code Playgroud)

我宁愿不丢失任何历史,但如果必须,我想我可以在以前的版本中使用.我不认为我想要子模块,因为这些子模块似乎适合包含不受您控制的远程回购.

将解决方案转换为bash脚本.它假定您要添加的子目录位于与父级相同级别的子目录中.这里是:

#! /bin/bash
git remote add -f $1 ../$1
git merge -s ours --no-commit $1/master
git read-tree --prefix=$1 -u $1/master
git commit -m "Added project $1"
Run Code Online (Sandbox Code Playgroud)

Git太棒了..

git version-control git-submodules

16
推荐指数
1
解决办法
2059
查看次数

用于Web开发的Git,sub-repos和外部库 - 一劳永逸的最佳策略?

这是一个常见的情况,必须有一个明智的解决方案,但尽管阅读和丰富的Git体操,我的大脑疼痛,我无法做这项工作......

我正在使用Wordpress,尽管这适合大多数网站开发方案.我想用git repo管理站点安装,并且还可以在单​​独的repos中管理各种WP插件,jQuery插件和其他代码位,这些插件可以很容易地从外部源拉出/推送.在你看细节之前看起来很简单......

标准

"子文件夹"标准 不应将每个插件的文件夹绑定到其源库的根文件夹.许多repos有多个嵌套文件夹,例如"my-repo-name/...","dev /","test /","src /",其中后者的内容是所需的东西.这对于保持引用URL清洁并最大限度地减少公共垃圾很重要.

"无Proxys"标准 理想的解决方案不需要额外的中间分支或回购.将更改推送到插件的外部源应该很简单,不需要多次中间合并/推送.

"真实文件"标准 理想情况下,整个网站的外部存储库实际上应该包含插件子项目的文件(即没有"子模块").虽然我可以被说服远离这一个...

"发布"标准 它必须与rsync和/或git push'ing到现场服务器很好地兼容

我看过这五个解决方案

Git子模块简单到足以进行更改和推/拉但子模块在"子文件夹"和"实际文件"标准上失败

Git read-tree/subtree merge解决了"Real Files"问题,read-tree实际上让你引用了一个分支的子文件夹但是当我这样做并试图合并master上的更改上游时,Git没记住它来自一个子文件夹并且合并了master的整个结构进入ext libs跟踪分支...所以FAIL就这个标准.

Apenwarrs子树扩展(这里) 非常适合"真实文件"标准,并且相当简单的推/拉,直到您想要强制执行"子文件夹"规则.最好它似乎需要中间分支,您可以从远程跟踪分支中分离出所需的文件夹,然后将其作为子树添加到主分支.我没有太多运气将主人的变化合并/推送回源回购.我仍然认为这里可能存在......

与外部repo的符号链接 很好的解决方案,直到GIT在符号链接后停止.现在它失败了"真实文件"和"发布"标准

嵌套repos 在某处我看到了一个SO答案,如果你明确git add一个包含另一个repo并包含尾部斜杠的文件夹,git将不会对其进行子模块,而是跟踪单个文件.这似乎很有希望,但它在"子文件夹"标准上失败了.

接下来是什么?

我已经看到了"稀疏结账"的提法 - 或许是涉及分支修剪的事情.我希望避免一个涉及shell脚本的解决方案,或者是如此复杂以至于每次都要重新学习它(不经常)我会对插件进行更改.它需要比为每个插件维护一个单独的repo并从主CMS安装中来回复制更容易.

当然有人有一个简单的功能方式来使这个常见的开发场景工作?在此先感谢您的帮助...

git plugins content-management-system git-submodules

16
推荐指数
1
解决办法
936
查看次数

Git:如何将子模块推送到远程存储库?

我使用git来跟踪我正在处理的网站.我在我的机器上工作并将提交推送到按照本指南配置的远程服务器:使用Git管理网站.

上周我尝试使用Git子模块来管理一些第三方库,今天我尝试推送到服务器,发现在服务器中所有子模块目录都是空的.

我尝试添加并提交对本地子模块的更改,确实git status说工作目录是干净的.

我能做什么?

git git-submodules

16
推荐指数
3
解决办法
3万
查看次数

Git子模块跟踪远程分支

我正在尝试使用git子模块将10多个存储库聚合到一个结构中以便于开发.

它应该克隆模块并签出分支.而是以分离头模式检出模块.

git clone git@github.com:org/global-repository.git
git submodule update —init
cd config-framework
git status

$git status
#HEAD detached at b932ab5
nothing to commit, working directory clean
Run Code Online (Sandbox Code Playgroud)

gitmodules文件似乎没问题

$cat .gitmodules 
[submodule "config-framework"]
        path = config-framework
        url = git@github.com:org/config-framework.git
        branch = MY_BRANCH
Run Code Online (Sandbox Code Playgroud)

我们希望默认情况下检出MY_BRANCH分支,而不是分离头.我们如何实现这一目标?

git git-remote git-submodules git-branch

16
推荐指数
1
解决办法
1万
查看次数

何时将大型Git存储库拆分为较小的存储库?

我正在努力从SVN迁移到Git.我已经习惯git-svn将历史记录放到一个git存储库中,我已经知道如何使用git-subtree将该存储库拆分为较小的存储库.这个问题不是关于如何进行迁移,而是关于何时拆分以及何时不进行拆分.

我想拆分大型存储库,因为某些目录是自包含的库,也与其他项目共享.以前svn checkout是在库上完成的,无需签出整个项目.在所有这些过程中,我发现可能有数十个目录在自己的存储库中是有意义的,因为它们是1)独立的,2)跨项目共享.

一旦你获得了一些git存储库,使用一个工具可以更容易地处理许多存储库似乎是明智的.一些例子是谷歌的repo,git submodules,git subtree,并创建自定义脚本(看来铬做到这一点).我已经探索了这些不同的方法,并了解如何使用它们.

所以问题是关于从颠覆过渡的方向.

我是否应该尝试坚持使用一个大型git存储库,只在绝对必要时才将其拆分成更小的部分,还是应该将其拆分为数十个或可能数百个较小的存储库? 哪个更容易使用?还有其他我错过的解决方案吗?如果使用多个存储库,我应该使用哪个工具?哪些因素会让某人偏爱另一种方法呢?

注意:需要在Windows,MacOS和Linux上签出源代码.

git version-control repository git-submodules git-subtree

16
推荐指数
1
解决办法
2070
查看次数

克隆包含所有子模块的git仓库

我有一个工作的git存储库,包含几个子模块(通过克隆不同的存储库获得).

现在,我想通过推送或克隆将整个存储库(包含所有子模块)复制到另一台机器上的裸git 存储库中.我很好地丢失了子模块的历史(我只是想保留它们的内容).

这可能吗 ?在我的尝试中,在克隆的存储库中子模块目录为空.

PS我知道这不是正确的工作流程(请参阅创建带子模块的公共存储库),但是不可能更新原始子模块.

git git-push git-clone git-submodules

16
推荐指数
1
解决办法
9809
查看次数

如何使用git clone --recursive加速/并行化git子模块的下载?

克隆具有大量子模块的git存储库需要很长时间.在以下示例中是~100个子模块

git clone --recursive https://github.com/Whonix/Whonix
Run Code Online (Sandbox Code Playgroud)

Git一个接一个地克隆它们.比需要的时间长得多.让(可能)假设客户端和服务器都有足够的资源同时回答多个(并行)请求.

如何使用git clone --recursive?加速/并行化git子模块的下载?

git performance download git-clone git-submodules

16
推荐指数
2
解决办法
6267
查看次数

git错误:无法索引文件Crashlytics.framework/Headers

我在我的iOS应用程序上使用Twitter的Fabric.

Fabric中的Crashlytics刚刚更新了,现在我无法将我的项目提交给git.我收到错误:

git错误:无法索引文件 Crashlytics.framework/Headers

致命:更新文件失败

在此输入图像描述

知道出了什么问题或如何修复它?

跑步git status揭示:

Untracked files:
(use "git add <file>..." to include in what will be committed)

Crashlytics.framework/Info.plist
Fabric.framework/Info.plist
profile.xcodeproj/project.xcworkspace/xcuserdata/
profile.xcodeproj/xcuserdata/
Run Code Online (Sandbox Code Playgroud)

git git-submodules

16
推荐指数
2
解决办法
1万
查看次数

理解git子模块并在特定的提交哈希或版本中"冻结"它

假设以下项目布局: -

mainrepo_git
    |____ .git
    |____ .gitmodules
    |____ proj            <------- directory containing the code files for mainrepo
            |____ 3rdpartysourcecode <-- directory containing upstream open source code
            |      |____ .git
            |      |____ 3rdpartyfiles
            |
            |____ mainrepofilesanddirectories  
Run Code Online (Sandbox Code Playgroud)

mainrepo_git包含我直接负责的源代码.我有读/写访问权限,可以直接推送到我管理的远程git存储库.

嵌套在mainrepo_git中的是一个名为3rdpartysourcecode的目录.这个3rdpartysourcecode目录实际上是另一个git repo(通常也称为"git submodule"),它指向由其他开发人员管理的开源第三方git存储库.我只有读取权限.没有写访问权限.

有没有办法'冻结'git子模块的特定提交哈希与我的主存储库中提交的相关?

例如,如果我在(或我恢复)在我的mainrepo中提交a12ucak,我的git子模块也会被恢复为特定版本,我将其绑定为提交a12ucak?当我切换到提交b349jdsak时,我的git子模块也会恢复到我绑定到b349jdsak的版本?

所以我的问题是:有一种方法可以在主仓库中的特定提交与git子模块中的相应提交之间创建链接吗?以这种方式,当我在主git repo中检出特定提交时,git子模块中的相应提交也将是checkout.

git git-submodules

15
推荐指数
1
解决办法
1万
查看次数