如何将git存储库添加为另一个git存储库的共享依赖项?

时间:2010-07-27 19:23:17

标签: git cad git-submodules

我需要类似于子模块的东西,但它作为依赖项存在于主存储库之外。

问题在于:

我正在尝试使用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 个答案:

答案 0 :(得分:4)

对于每个项目,添加.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的当前HEAD,而git update-eagle将检查〜/ eagle中的提交。 (然后在对其进行任何更改之前,请确保在{/ 1]中使用git checkout <branch>。)

答案 1 :(得分:0)

如果eagleProjX内没有位置,则 每个ProjX都可以使用eagle的特定修订版 然后:

对于每个ProjX,您需要:

  • 有一个 MainProjX Git repo ,您可以在其中找到:
    • a ProjX
    • eagle的版本(ProjX相同

每个MainProjX父项目的目标是将ProjXeagle的版本保持在一起,即记录正确的依赖项。

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

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

现在,是的,这是很多“eagle”重复,但如果每个ProjX能够使用自己的eagle版本,则必须这样做。