在下面的示例中,我想演示对 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) 我在项目中添加了 2 个子模块,subA 和 subB,位于 externals/subA 和 externals/subB 中。
今天,另一位团队成员提交了他的代码,当它被拉取时,在git statusexternals/subA 和 externals/subB 中使用时,subA 和 subB 都显示分离头状态。
我先做了git submodule update,没有报告任何错误。我一次又一次地尝试,git submodule init但git submodule update它没有改变。
我们如何才能使子模块恢复同步?子模块出现这种情况的原因是什么?自我们开始以来,这是第一次出现问题。谢谢。
如果我有一个包含子模块的存储库,并且我想为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 子模块。这看起来很复杂(我没有任何子模块的经验)。投入一些时间可能是值得的。但是,现在我有一些与 git 子模块相关的问题。
其实我正在尝试的是:
这是创建子存储库的正确方法(或者可能是正确的方向)吗?
git submodule 和我上面做的一样吗?
提前致谢。
每次我将提交推送到子模块时,我都需要将父存储库更新为子模块中的最新提交。是否有任何自动方法可以在远程执行此操作?
每次在子模块存储库中推送提交时,我希望父级自动指向子模块存储库的最新提交。请建议是否可能以及如何实现?
我有多个单独的 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) 我正在尝试将 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添加MyLibrary到MyProject. 这是现在的结构:
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) 我正在尝试提交在几个子模块中所做的更改:
$ 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 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) 我已将一个子模块添加到 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 以指定分支名称?