How to add a git repository as a shared dependency of another git repository?

I need something akin to submodules, but which exist outside the main repository as a dependency.

Here’s the problem:

I’m trying to use Git (in a REALLY awkward way) to manage design files for a CAD tool (Cadsoft Eagle), and I’m having a hard time figuring out if there is a way to use git submodules to manage each project’s dependency upon the CAD tool’s shared library.

I’m using a folder structure like this:

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

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

In this case, it doesn’t make sense to add the eagle.git repository as a git submodule for each project.

However, I still need a way to snapshot the current state of the “eagle.git” repository so that if the library is updated in the future, it can be rolled back to access the specific revision of the library files which were being used when the Proj[x] was committed.

Ideally, I’d like something like the following:

~/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/

I’d like to be able to:

cd ~/projects/Proj0
git submodule update

and have the ~/eagle/ directory automatically roll back to the revision checked into Proj0.

Anybody know of anything in Git that could allow for this kind of behavior?

  • Git Submodule/Subtree specific folders/projects
  • Git submodule pull overwrite/discard any local changes
  • Git repo inside repo
  • Is it possible to have a subversion repository as a “submodule” in git?
  • git - submodules - space
  • Converting 'CVS era' repo into git repo's with submodules
  • How do I add sub directory of directory as a git submodule?
  • Correct Way to Import Git Submodule in Xcode
  • 2 Solutions collect form web for “How to add a git repository as a shared dependency of another git repository?”

    For each project, add .git/hooks/pre-commit (and make sure it’s executable):

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

    Then, for each project:

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

    When you make a commit, it will record the current HEAD of ~/eagle, and git update-eagle will check out that commit in ~/eagle. (Then just make sure you git checkout <branch> in ~/eagle before you make any changes to it.)

    If eagle hasn’t its place within a ProjX,
    but each ProjX can use a specific revision of eagle,
    then:

    For each ProjX, you need to:

    • have a MainProjX Git repo, in which you would find:
      • a ProjX
      • a version of eagle (at the same level than ProjX)

    The goal of each MainProjX parent project is to keep together the versions of ProjX and eagle, that is to record the right dependencies.

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

    Now, yes, that is a lot of ‘eagle‘ duplication, but that is necessary if each ProjX is able to use its own eagle revision.

    Git Baby is a git and github fan, let's start git clone.