我有一个由大量数据组成的项目。由于它的大小,我不能使用远程GIT仓库和推/拉通过互联网。相反,我随身携带一个便携式硬盘,其中包含项目的当前状态(即工作区)。这个workdir的GIT repo在我台式计算机内的另一个硬盘上(我用--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
当我尝试在主要的superrepo中做一个git add --all .
时,GIT可以理解为生气,有嵌套的.git
文件夹,并对我大喊我应该使用子模块。我希望这样做,除了子模块位于(a)在superrepo的.git/modules
文件夹中,或者(b)可以强制传统(过时)模式并将子模块存储在workdir中。在(a)的情况下,我的外部硬盘上没有.git
文件夹,并且在工作期间无法提交子版本中的更改;并且在情况(b)中,superrepo的.git
文件夹将不具有subrepo提交的副本,因此如果便携式HDD被拧紧,则数据将丢失。
我希望有一些方法可以在每次提交superrepo时将驻留在嵌套子项目中的所有提交拉入桌面硬盘。到目前为止,我能想到的唯一方法是以某种方式使用git钩子,并将脚本附加到它们,这将自动将所有更改拉到桌面硬盘上的几个小repos以及superrepo的git dir。
我最后只使用“旧子模块”选项:
git submodule add --name NAME RESERVE_HDD_PATH PORTABLE_HDD_PATH
将subrepos添加回superrepo,其中NAME
是一些有效的dir名称,RESERVE_HDD_PATH
是桌面硬盘上subrepo的路径,PORTABLE_HDD_PATH
是你在步骤1中写下的原始subrepo路径,相对于superrepo的root.git
文件,并从桌面HDD而不是那些文件中复制原始子项目modules
文件夹(这是多余的)而已。现在,您可以使用便携式硬盘驱动器在subrepos中工作,每次将它连接到桌面并提交superrepo时,它都会记住所有子版本的当前提交。您只需要制作这些子目录的保留副本,例如使用这样的脚本(驻留在subrepo文件夹附近的桌面硬盘上):
#!/bin/bash
while read filename
do
echo "Pulling into $filename..."
cd "$filename"
git pull hdd master
cd ..
done < submodules-list
其中submodules-list
是一个文本文件,其中包含子项目列表。我想我可以使用git hook更进一步自动化,但我很满意现在的情况。