Как вытащить из GIT-подпунктов, находящихся внутри GIT Superrepo - PullRequest
0 голосов
/ 16 марта 2019

У меня есть проект, состоящий из огромного количества данных. Из-за его размера я не могу использовать удаленное GIT-репо и пуш-пул через Интернет. Вместо этого я ношу с собой портативный жесткий диск, на котором указано текущее состояние проекта (т. Е. Рабочий каталог). Репозиторий GIT этого рабочего каталога находится на другом жестком диске моего настольного компьютера (для этого я использовал --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) в папке .git/modules суперрепо, либо (b) возможно принудительно установить устаревший (устаревший) режим и сохранить подмодуль в рабочем каталоге. В случае (а) у меня не будет папок .git на моем внешнем жестком диске, и я не смогу зафиксировать изменения в подпунктах во время работы; и в случае (b) в папке .git суперрепо не будет копии коммитов субрепо, и, таким образом, если портативный HDD будет испорчен, данные будут потеряны.

Я хочу каким-то образом вытягивать все коммиты, находящиеся во вложенных вложенных репозиториях, на жесткий диск рабочего стола каждый раз, когда я делаю коммит суперрепо. До сих пор я мог думать только о том, чтобы как-то использовать git-хуки и прикрепить к ним скрипт, который автоматически перенесет все изменения в несколько небольших репозиториев, находящихся на настольном жестком диске, вместе с git dir суперрепо.

1 Ответ

0 голосов
/ 22 марта 2019

В итоге я воспользовался опцией «старые субмодули»:

  1. Перемещение папок субрепаратов на жесткий диск рабочего стола, где-то рядом с git dir суперрепо;запишите их исходные пути
  2. Убедитесь, что рабочий каталог суперрепо чист.
  3. Добавьте подпункты обратно в суперрепо, используя git submodule add --name NAME RESERVE_HDD_PATH PORTABLE_HDD_PATH, где NAME - какое-то действительное имя каталога, RESERVE_HDD_PATH -путь к subrepo на жестком диске рабочего стола, PORTABLE_HDD_PATH - это исходный путь subrepo, который вы записали на шаге 1 относительно корня суперрепо
  4. Удалите файлы .git, созданные в workdir, и скопируйтеисходные подпункты возвращаются с жесткого диска рабочего стола вместо этих файлов
  5. Удалите папку modules из git dir суперрепо (это излишне)
  6. Добавьте подпункты, которые теперь находятся на переносном жестком диске, в качестве удаленныхв соответствующие подпункты, которые находятся на рабочем столе HDD.

Вот и все.Теперь вы можете работать с вложенными репозиториями, используя портативный жесткий диск, и каждый раз, когда вы подключаете его к рабочему столу и делаете коммит суперрепо, он запоминает текущие коммиты всех субреппозиций.Вам просто нужно сделать резервную копию этих подпунктов, например, с помощью сценария, подобного этому (находящегося на рабочем столе HDD рядом с папками подпунктов):

#!/bin/bash

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

, где submodules-list - текстовый файл, содержащийсписок ваших подпунктов.Думаю, я мог бы еще больше автоматизировать это, используя git hooks, но я доволен тем, как все обстоит сейчас.

...