Как добавить git-репозиторий в качестве общей зависимости другого git-репозитория? - PullRequest
7 голосов
/ 27 июля 2010

Мне нужно что-то похожее на подмодули, но которые существуют вне основного хранилища в качестве зависимости.

Вот проблема:

Я пытаюсь использовать Git (ДЕЙСТВИТЕЛЬНО неловко) для управления файлами дизайна для инструмента CAD (Cadsoft Eagle), и мне трудно понять, есть ли способ использовать подмодули git для управлять зависимостью каждого проекта от общей библиотеки инструмента CAD.

Я использую такую ​​структуру папок:

~/eagle/ <-- Main library used by multiple projects
    .git/     
    <library files>

~/projects/ <-- Projects folder
    Proj0/
        .git/
        <design files>
    Proj1/
        .git/
         <design files>

В этом случае нет смысла добавлять репозиторий eagle.git в качестве подмодуля git для каждого проекта.

Однако мне все еще нужен способ сделать снимок текущего состояния репозитория "eagle.git", чтобы в случае обновления библиотеки в будущем ее можно было откатить для доступа к определенной ревизии библиотечных файлов, которые были используется, когда Proj [x] был зафиксирован.

В идеале я хотел бы что-то вроде следующего:

~/eagle/ <-- Main library used by multiple projects
    .git/     
    <library files>

~/projects/ <-- Projects folder
    Proj0/
        .git/
        <design files>
        **eagle** <-- something that acts like a submodule  
                      but which actually points to ~/eagle/
    Proj1/
        .git/
         <design files>
         **eagle** <-- something that acts like a submodule  
                       but which actually points to ~/eagle/

Я бы хотел иметь возможность:

cd ~/projects/Proj0
git submodule update

и каталог ~ / eagle / автоматически откатится до версии, отмеченной в Proj0.

Кто-нибудь знает что-нибудь в Git, которое может позволить такое поведение?

Ответы [ 2 ]

4 голосов
/ 28 июля 2010

Для каждого проекта добавьте .git / hooks / pre-commit (и убедитесь, что он исполняемый):

#!/bin/sh
git --git-dir=~/eagle/.git log -1 --pretty=format:%H >.eagle_rev
git add .eagle_rev

Тогда для каждого проекта:

git config alias.update-eagle '!git --git-dir=~/eagle/.git --work-tree=~/eagle checkout -q $(<.eagle_rev)'

Когда вы делаете коммит, он записывает текущий заголовок ~ / eagle, а git update-eagle проверяет этот коммит в ~ / eagle. (Затем просто убедитесь, что вы git checkout <branch> в ~ / eagle, прежде чем вносить в него какие-либо изменения.)

0 голосов
/ 27 июля 2010

Если eagle не имеет своего места в пределах ProjX,
но каждый ProjX может использовать конкретную ревизию eagle,
то:

Для каждого ProjX вам необходимо:

  • имеет MainProjX Git-репо , в котором вы найдете:
    • a ProjX
    • версия eagle (на уровне того же уровня, что и ProjX)

Цель каждого родительского проекта MainProjX - хранить вместе версии ProjX и eagle, то есть записывать правильные зависимости.

~/projects/ <-- Projects folder
    MainProj0
      Proj0/
          .git/
          <design files>
      eagle/
          .git/
          <library files>

    MainProj1
      Proj1/
          .git/
          <design files>
      eagle/
          .git/
          <library files>

Да, это многократное дублирование eagle, но это необходимо, если каждый ProjX может использовать свою собственную eagle ревизию.

...