8

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

当 git-bundle 在子模块中运行时,它会创建父 repo 的捆绑包,省略子模块。

任何人都可以阐明这一点?
如何制作子模块的 git 包?

参考: 关于 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 ..
4

2 回答 2

2

您确定运行git submodule update成功并且子模块中的.git 文件(不是目录)存在吗?在我的测试中,捆​​绑子模块适用于 1.7.9.6 版本。

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

于 2012-08-06T14:17:02.117 回答
1

我不需要这样做,但是我怀疑您以与通常相同的方式执行此操作 - 捆绑子目录(如果它们有您需要发送的更改),然后捆绑父存储库。

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

于 2012-07-12T16:20:03.367 回答