我有一个包含大量数据的项目。
由于它的大小,我无法使用远程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一起自动拉入驻留在台式机硬盘上的几个小存储库中。
答案 0 :(得分:0)
我最终仅使用“旧子模块”选项:
git submodule add --name NAME RESERVE_HDD_PATH PORTABLE_HDD_PATH
将子存储库添加回超级存储库,其中NAME
是一些有效的目录名,RESERVE_HDD_PATH
是台式机硬盘上子存储库的路径,PORTABLE_HDD_PATH
是您在步骤1中写下的原始子仓库路径,相对于超级仓库的根.git
文件,然后从桌面HDD而不是这些文件中复制原始的子存储库modules
文件夹(这是多余的)就是这样。现在,您可以使用便携式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进一步自动化它,但是我对现在的情况感到满意。