如何从居住在GIT superrepo内的GIT子目录中获取

问题描述 投票:0回答:1

我有一个由大量数据组成的项目。由于它的大小,我不能使用远程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 git-submodules
1个回答
0
投票

我最后只使用“旧子模块”选项:

  1. 将subrepo文件夹移动到桌面硬盘驱动器,在superrepo的git dir附近;写下他们原来的路径
  2. 确保superrepo workdir干净
  3. 使用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
  4. 删除在workdir中创建的.git文件,并从桌面HDD而不是那些文件中复制原始子项目
  5. 从superrepo的git目录中删除modules文件夹(这是多余的)
  6. 将现在位于便携式HDD上的子设备作为遥控器添加到桌面HDD上的相应子设备。

而已。现在,您可以使用便携式硬盘驱动器在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更进一步自动化,但我很满意现在的情况。

© www.soinside.com 2019 - 2024. All rights reserved.