标签: git-submodules

是否有在本地修改 Git 子模块的正确方法?

在下面的示例中,我想演示对 Git 子模块进行更改并在本地提交可能会导致非常糟糕的情况,在这种情况下我想找到一个可行的解决方案(除了答案“伙计,不要使用Git 子模块是邪恶的”)

这个例子

我首先创建两个存储库:一个主项目及其子模块:

~ $ for r in main sub; do mkdir $r; cd $r; git init; cd ..; done
Initialized empty Git repository in ~/main/.git/
Initialized empty Git repository in ~/sub/.git/
Run Code Online (Sandbox Code Playgroud)

让我们向子模块添加一些内容:

~/ $ cd sub
~/sub $ touch sub && git add sub
~/sub $ git commit -m "Added sub"
[master (root-commit) a14ce2f] Added sub
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 sub
Run Code Online (Sandbox Code Playgroud)

然后我们在主项目中导入该子模块:

~/sub $ cd ../main
~/main $ git submodule …
Run Code Online (Sandbox Code Playgroud)

git git-submodules

4
推荐指数
1
解决办法
9547
查看次数

Git 子模块分离头状态

我在项目中添加了 2 个子模块,subA 和 subB,位于 externals/subA 和 externals/subB 中。

今天,另一位团队成员提交了他的代码,当它被拉取时,在git statusexternals/subA 和 externals/subB 中使用时,subA 和 subB 都显示分离头状态。

我先做了git submodule update,没有报告任何错误。我一次又一次地尝试,git submodule initgit submodule update它没有改变。

我们如何才能使子模块恢复同步?子模块出现这种情况的原因是什么?自我们开始以来,这是第一次出现问题。谢谢。

git git-submodules git-detached-head

4
推荐指数
1
解决办法
6955
查看次数

如何在 git 中捆绑子模块更改?

如果我有一个包含子模块的存储库,并且我想为sneakernet制作一个捆绑包,如何使该捆绑包包含更新子模块所需的对象?

例如,假设我有一个名为 的存储库parent,它包含一个名为 的子模块submod。我想创建一个包含自 commit 以来所有最近工作的包,所以很自然地,我会basecommit从根目录中执行以下操作:parent

git bundle create mybundlefile.bundle basecommit..myworkingbranch
Run Code Online (Sandbox Code Playgroud)

这将创建一个名为 的文件,其中包含范围内存储库mybundlefile.bundle中的所有提交对象以及 ref 。问题是,如果这些提交中的任何一个更改了子模块,则生成的捆绑包将不会很有用,因为此类提交仅在更改子模块哈希时存储在捆绑包文件中。因此,存储在捆绑文件中的对象只是说“我正在提交,我将子模块的哈希值从更改为”。但该捆绑包实际上并不包含从捆绑包更新子模块并为.parentbasecommit..myworkingbranchmyworkingbranch3ba024bsubmod2b941cf1bb84ec2b941cf..1bb84ecmyworkingbranch

如何创建捆绑文件,以便还包含子模块存储库中的所有对象。也就是说,如果父存储库的基本提交将basecommit子模块submod指向 hash A,而父存储库的工作分支myworkingbranch将子模块submod指向 hash B,那么我的包不仅需要包含basecommit..myworkingbranch,还需要包含A..B

git bundle git-submodules

4
推荐指数
1
解决办法
3550
查看次数

通过 git init 在子文件夹中创建新的 git 存储库,并在主 git 存储库中忽略

我试图理解 git 子模块。这看起来很复杂(我没有任何子模块的经验)。投入一些时间可能是值得的。但是,现在我有一些与 git 子模块相关的问题。

其实我正在尝试的是:

  • 有一个主存储库,在主存储库内我想创建一个新的(子)存储库。所以我做了什么:
    - 首先)创建文件夹(ABC)。
    - 其次)在主存储库中忽略文件夹(ABC)。
    - 第三)在de文件夹(ABC)中,git init(创建一个新的存储库)

这是创建子存储库的正确方法(或者可能是正确的方向)吗?

git submodule 和我上面做的一样吗?

提前致谢。

git git-submodules

4
推荐指数
1
解决办法
2006
查看次数

是否有任何自动方法来更新父 git 存储库以指向其子模块的最新提交?

每次我将提交推送到子模块时,我都需要将父存储库更新为子模块中的最新提交。是否有任何自动方法可以在远程执行此操作?

每次在子模块存储库中推送提交时,我希望父级自动指向子模块存储库的最新提交。请建议是否可能以及如何实现?

git-submodules gitlab

4
推荐指数
1
解决办法
2464
查看次数

克隆具有嵌套子模块的存储库不起作用

我有多个单独的 git 存储库,其中没有子模块。任务是组装这些存储库的层次结构树并使用它在用户之间共享。这对于“子树”或“子存储库”方案来说是微不足道的,但它似乎不适用于“子模块”。尝试子模块的原因是 nfs 系统上的 git 性能缓慢。以我为例,结账需要 2 个小时以上

我正在尝试创建一个包含子模块的共享存储库。到目前为止,第一次克隆尝试失败了。这是测试用例:

 mkdir m1 ; cd m1 ; git init ; date > a.txt ; git add --all ; git commit -m added ; cd -
 mkdir m2 ; cd m2 ; git init ; date > b.txt ; git add --all ; git commit -m added ; cd -
 mkdir m3 ; cd m3 ; git init ; date > c.txt ; git add --all ; git commit -m added ; …
Run Code Online (Sandbox Code Playgroud)

git git-submodules

4
推荐指数
1
解决办法
7740
查看次数

如何将 gradle 多项目存储库作为 git 子模块包含在另一个 gradle 项目中

我正在尝试将 Gradle 多项目存储库作为 git 子模块导入到另一个 Gradle 项目中。

这是多项目存储库的结构:

MyLibrary
- lib-api
  - api-config
  - api-repository
- lib-impl
  - impl-config
  - impl-repository
Run Code Online (Sandbox Code Playgroud)

在 Gradle 项目中MyLibrary,有几个模块依赖于该项目中的其他模块。例如,lib-api:api-repository具有以下依赖关系:

implementation project(':lib-api:api-config')
Run Code Online (Sandbox Code Playgroud)

(下面的模块lib-impl还包含各自的 api 作为依赖项)

到目前为止一切正常,我可以构建、运行和测试lib-impl.

现在我尝试将项目导入到另一个项目中

我用来git submodule add添加MyLibraryMyProject. 这是现在的结构:

MyProject
- MyLibrary
  - lib-api
    - api-config
    - api-repository
  - lib-impl
    - impl-config
    - impl-repository
- api
- impl
Run Code Online (Sandbox Code Playgroud)

为了能够使用 下的模块MyLibrary,我将settings.gradle文件编辑MyProject为如下所示:

rootProject.name = 'MyProject'
include …
Run Code Online (Sandbox Code Playgroud)

java git gradle git-submodules

4
推荐指数
1
解决办法
2985
查看次数

使用唯一的命令提交子模块中的更改

我正在尝试提交在几个子模块中所做的更改:

$ git submodule foreach git commit -m 'fixed header guards'
Entering 'libs/BaseDisplay'
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
fatal: run_command returned non-zero status for libs/BaseDisplay
.
Run Code Online (Sandbox Code Playgroud)

我看到进程在第一个最新的子模块上停止...但是,还有许多其他子模块具有暂存文件。如何使用唯一的命令提交在此类子模块中所做的更改?

git git-submodules

4
推荐指数
1
解决办法
628
查看次数

在 .gitmodules 中找不到路径 xx 的子模块映射

我在堆栈上尝试了很多不同的答案,但没有一个有效。我正在尝试将存储库添加为包含另一个子模块的子模块。所以我做的是这样的:

git submodule add -b develop git@github.com:submoduleRepo
Run Code Online (Sandbox Code Playgroud)

子模块将添加到存储库中,并在其中包含子模块的文件夹。但是该文件夹是空的。所以我跟进这个命令:

git submodule update --init --recursive
Run Code Online (Sandbox Code Playgroud)

这没有给我带来任何回报。如果我进入子模块的目录cd submoduleRepo,然后输入 git submodule,我会得到:

fatal: no submodule mapping found in .gitmodules for path 'src/app/nestedSubmoduleRepo'
Run Code Online (Sandbox Code Playgroud)

这是我的主存储库的 .gitmodules:

[submodule "submoduleRepo"]
    path = submoduleRepo
    url = git@github.com:submoduleRepo.git
    branch = develop
Run Code Online (Sandbox Code Playgroud)

在 submoduleRepo/.gitmodules 中:

[submodule ".\\src\\app\\nestedSubmoduleRepo"]
    path = .\\src\\app\\nestedSubmoduleRepo
    url = git@github.com:nestedSubmoduleRepo.git
Run Code Online (Sandbox Code Playgroud)

为什么我不断收到此错误并且目录未填充?

编辑:

一旦我运行--init --recursive一次,它就会给我错误:

fatal: No url found for submodule path 'submoduleRepo/src/app/nestedSubmoduleRepo' in .gitmodules
Failed to recurse into submodule path 'submoduleRepo'
Run Code Online (Sandbox Code Playgroud)

我的git配置:

[core]
    repositoryformatversion = …
Run Code Online (Sandbox Code Playgroud)

git github git-submodules

4
推荐指数
1
解决办法
2477
查看次数

子模块 - 更新 .gitmodules 以指定分支名称

我已将一个子模块添加到 ADO 存储库:

.gitmodules

[submodule "public"]
    path = public
    url = https://xyz.visualstudio.com/DefaultCollection/abc/_git/STW-Sol-public

Run Code Online (Sandbox Code Playgroud)

是否有 git 命令来更新 .gitmodules 以指定分支名称?

git git-submodules azure-devops

4
推荐指数
1
解决办法
5188
查看次数