git包应该如何与子模块一起工作?

git包应该如何与子模块一起工作?,git,git-submodules,Git,Git Submodules,我正在使用git bundle备份git存储库。在最新版本的git中,子模块的存储库元数据存储在父存储库的.git/modules中,而不是以前存储在子模块的.git目录中 当git bundle在子模块中运行时,它会创建父repo的bundle,而忽略子模块 有谁能解释这一点吗? 如何生成子模块的git包 参考: 编辑: 在阅读了sschuberth的工作原理之后,我编写了一个脚本来测试并验证它是否工作。我有一个备份脚本,它依赖于验证.git目录的存在,以便知道它是否在存储库的顶级目录中,并

我正在使用git bundle备份git存储库。在最新版本的git中,子模块的存储库元数据存储在父存储库的.git/modules中,而不是以前存储在子模块的.git目录中

当git bundle在子模块中运行时,它会创建父repo的bundle,而忽略子模块

有谁能解释这一点吗?
如何生成子模块的git包

参考:

编辑

在阅读了sschuberth的工作原理之后,我编写了一个脚本来测试并验证它是否工作。我有一个备份脚本,它依赖于验证.git目录的存在,以便知道它是否在存储库的顶级目录中,并且当子模块开始使用.git文件时,它就会中断。如果有人知道推荐的方法是什么来保证您位于存储库的顶级文件夹中,我很感兴趣。我不知道我怎么会错过这个

为了防止需要为子模块编写测试脚本的人感兴趣,我使用了以下脚本:

#!/bin/bash

git --version

mkdir super
mkdir subRemote

touch super/superFile.txt
touch subRemote/subFile.txt

cd super

   git init
   git add --all
   git commit -am"Initial commit"

cd ..


cd subRemote

   git init
   git add --all
   git commit -am"Initial commit"

cd ..


cd super

   git submodule add ../subRemote/.git
   git add --all
   git commit -am"added submodule"
   git submodule update
   echo -e "\ngit log in super:"
   git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative --all


   cd subRemote

      echo -e "\ngit bundle:"
      git bundle create ../../submoduleBundle --all --remotes

   cd ..

cd ..


git clone --mirror submoduleBundle bundledSub/.git

cd bundledSub

   git config core.bare false
   git config core.logallrefupdates true
   git remote rm origin
   git checkout

cd ..


#------------------------------------------------

cd super

   echo -e "\nfiles in super":
   ls -alh

cd ..


cd super/subRemote

   echo -e "\nfiles in super/subRemote":
   ls -alh

cd ../..


cd bundledSub

   echo -e "\nfiles in bundledSub":
   ls -alh

cd ..
#/bin/bash
git——版本
mkdir超级
mkdir次远程
touch super/superfle.txt
触摸subRemote/subFile.txt
超级光盘
初始化
git add--all
git提交-am“初始提交”
光盘
cd遥控器
初始化
git add--all
git提交-am“初始提交”
光盘
超级光盘
git子模块添加../subRemote/.git
git add--all
git提交-am“已添加子模块”
git子模块更新
echo-e“\n登录超级计算机:”
git log--graph--pretty=格式:'%Cred%h%Creset-%C(黄色)%d%Creset%s%Cgreen(%cr)%C(粗体蓝色)%Creset'--abbrev commit--日期=相对--全部
cd遥控器
echo-e“\n IT包:”
git bundle create.././submoduleBundle--all--remotes
光盘
光盘
git克隆--镜像子模块bundle bundledSub/.git
cd捆绑接头
git config core.bare false
git config core.logallrefupdates true
git远程rm源
git签出
光盘
#------------------------------------------------
超级光盘
echo-e“\n超级文件”:
ls-alh
光盘
超/亚远程光盘
echo-e“\n超级/次远程中的文件”:
ls-alh
cd../。。
cd捆绑接头
echo-e“\n bundledSub中的文件”:
ls-alh
光盘

我不需要这样做,但是我怀疑您是按照通常的方式来做的-捆绑子目录(如果它们有您需要发送的更改),然后捆绑父存储库


子模块只是另一个git存储库。

您确定运行
git子模块更新
成功并且子模块中存在
.git
文件(不是目录)吗?在我的测试中,捆绑子模块在版本1.7.9.6中运行良好


如果由于某种原因仍然失败,解决方法是将子模块的存储库克隆到它自己的工作树中,然后从那里运行
git bundle
(对于提交,如超级项目中的
git submodule status
所示).

子模块不再是常规的git存储库,因为它们不包含
.git
目录。更具体地说,将子模块的
.git
目录移动到超级项目中的
.git/modules/
。我有一个列表,其中包括“gr”以更改为工作树的根目录。也许这对你有用。@sschuberth嗨,谢谢,我来看看。如果有人要求你写一个小的自述文件来解释它们的功能,那可能很酷。每个脚本在没有参数的情况下运行时都会打印出一个非常详细的使用原理(或者只看一下源代码)。我想我不会写一个单独的自述文件,因为我懒得让它们保持同步:-)如果只是为了备份,为什么不做一个
git克隆--bare[repo][backup\u name]
?不是重复,而是扩展了需求,因为那里的询问者还需要一个最小的包,在必要时包含正确基线化的子模块。