如何从驻留在GIT superrepo中的GIT子仓库中提取

时间:2019-03-16 15:48:04

标签: git git-submodules

我有一个包含大量数据的项目。 由于它的大小,我无法使用远程GIT存储库,也无法通过Internet进行推/拉。相反,我随身携带了一个便携式硬盘,其中包含项目的当前状态(即工作目录)。 该工作目录的GIT存储库位于台式机内的另一个HDD上(我使用--separate-git-dir来实现)。 为了跟踪项目数据的历史记录,我时不时地咬住子弹,将外部硬盘连接到台式机,再进行一次巨大的GIT提交。

问题是,在此项目中,有几个小型子项目由其自己的GIT仓库跟踪。它们(相对)是轻量级的,并定期接收提交。

portable HDD                             desktop HDD
|                                        |
|-.git <- text file (gitlink) to here -> |-ProjectGit
|                                        | |-objects
|-project1                               | |-refs
| |-.git <- actual git dir               | |-HEAD
| |-some files                           . . ...
|
|-project2
| |-.git <- actual git dir
| |-some files
|
|-loads
|-and
|-loads
|-of
|-files

当我尝试在主超级仓库中执行git add --all .时,GIT会生气地发现存在嵌套的.git文件夹,并对我大吼大叫我应该使用子模块。 我只想这样做,除了子模块要么(a)驻留在superrepo的.git/modules文件夹中,要么(b)可以强制使用传统(过时)模式并将子模块存储在工作目录。在(a)的情况下,我的外部硬盘上没有.git文件夹,并且在工作期间无法在子存储库中提交更改;并且在(b)的情况下,superrepo的.git文件夹将没有subrepo提交的副本,因此,如果便携式HDD被拧紧,则数据将丢失。

我想通过某种方法在每次提交superrepo时将嵌套子存储库中的所有提交都拖到桌面HDD中。到目前为止,我唯一想到的方法是以某种方式使用git钩子,并在其上附加脚本,该脚本将把所有更改与superrepo的git dir一起自动拉入驻留在台式机硬盘上的几个小存储库中。

1 个答案:

答案 0 :(得分:0)

我最终仅使用“旧子模块”选项:

  1. 将subrepo文件夹移动到超级硬盘git dir附近的桌面硬盘上;写下他们的原始路径
  2. 确保超级仓库工作目录干净
  3. 使用git submodule add --name NAME RESERVE_HDD_PATH PORTABLE_HDD_PATH将子存储库添加回超级存储库,其中NAME是一些有效的目录名,RESERVE_HDD_PATH是台式机硬盘上子存储库的路径,PORTABLE_HDD_PATH是您在步骤1中写下的原始子仓库路径,相对于超级仓库的根
  4. 删除在workdir中创建的.git文件,然后从桌面HDD而不是这些文件中复制原始的子存储库
  5. 从超级仓库的git目录中删除modules文件夹(这是多余的)
  6. 将现在位于便携式HDD上的子存储库作为远程存储添加到台式机HDD上的相应子存储库。

就是这样。现在,您可以使用便携式HDD在子存储库中工作,并且每次将其连接到桌面并提交超级存储库时,它都会记住所有子存储库的当前提交。您只需要保留这些子存储库的备用副本,例如像这样的脚本(位于桌面硬盘上的subrepo文件夹附近):

#!/bin/bash

while read filename
do
  echo "Pulling into $filename..."
  cd "$filename"
  git pull hdd master
  cd ..
done < submodules-list

其中submodules-list是一个文本文件,其中包含子仓库的列表。 我想我可以使用git hooks进一步自动化它,但是我对现在的情况感到满意。