2010-07-27 11 views
7

Ich brauche etwas wie Submodule, die aber außerhalb des Haupt-Repository als Abhängigkeit existieren.Wie füge ich ein Git-Repository als eine gemeinsame Abhängigkeit von einem anderen Git-Repository hinzu?

Hier ist das Problem:

Ich versuche, Git zu verwenden (in eine wirklich unangenehmen Art und Weise) Design-Dateien für ein CAD-Werkzeug (Cadsoft Adler), und ich habe eine harte Zeit zu verwalten Bezifferung aus, wenn es eine Möglichkeit gibt, git-Submodule zu verwenden, um die Abhängigkeit eines Projekts von der gemeinsamen Bibliothek des CAD-Tools zu verwalten.

Ich verwende eine Ordnerstruktur wie folgt:

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

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

In diesem Fall ist es nicht sinnvoll, das eagle.git Repository als git Submodul für jedes Projekt hinzuzufügen.

Ich benötige jedoch immer noch eine Möglichkeit, den aktuellen Status des "eagle.git" -Repositorys festzuhalten. Wenn die Bibliothek in Zukunft aktualisiert wird, kann sie zurückgesetzt werden, um auf die spezifische Revision der Bibliotheksdateien zuzugreifen wurden verwendet, als das Proj [x] festgeschrieben wurde.

Idealerweise würde ich so etwas wie das wie folgt vor:

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

Ich möchte in der Lage sein:

cd ~/projects/Proj0 
git submodule update 

und haben die ~/Adler/Verzeichnis automatisch ein Rollback auf Die Revision wurde in Proj0 eingecheckt.

Jeder weiß etwas in Git, die für diese Art von Verhalten zulassen könnte?

+0

Können Sie klären, warum Submodule für Sie hier nicht funktionieren? Es klingt für mich wie Submodule sind genau das, was Sie brauchen. –

+0

Damit das CAD-Werkzeug (Eagle) eine Bibliothek "sehen" kann, muss es den Pfadeinstellungen von Eagle hinzugefügt werden. Wenn ich das "eagle" -Bibliotheksrepo als Submodul für jedes Projekt hinzufüge, müsste ich den Pfad für die Submodulbibliothek jedes Projekts manuell anhängen, was dazu führen würde, dass [x] Kopien der Eagle-Bibliothek in Eagles erscheinen würden Bibliotheksverwalter. Herauszufinden was ist was und diese separaten Kopien im CAD-Tool zu verwalten wäre ein Albtraum. Außerdem kann die Bibliothek um Größenordnungen größer sein als die Projektdateien, so dass es wirklich verschwenderisch erscheint, wenn [x] Kopien davon auf der Platte herumliegen. – cdwilson

+0

Eine hilfreiche Art, darüber nachzudenken, ist eine Analogie. Nehmen wir an, Eagle CAD-Tool ist eine Fabrik, die ein Widget auf einmal erstellen kann. Lasst uns sagen, dass jedes Projekt [x] .git Repo durch einen Herstellungsentwurf [x] für ein Widget [x] repräsentiert wird, das die Fabrik herstellt. Das eagle.git Repo wird durch die Werkseinstellungen (die Maschinen, Arbeiter, Rohstoffe) repräsentiert, die benötigt werden, um das Widget [x] zu erstellen. – cdwilson

Antwort

4

Für jedes Projekt, fügen .git/hooks/pre-commit (und stellen Sie sicher, dass es ausführbar):

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

Dann wird für jedes Projekt:

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

Wenn Sie ein Commit machen , es wird den aktuellen HEAD von ~/adler aufnehmen, und git update-eagle wird das Commit in ~/eagle auschecken. (Dann stellen Sie sicher, dass Sie git checkout <branch> in ~/Adler, bevor Sie irgendwelche Änderungen daran vornehmen.)

+0

mkarasek, du bist die neue Schärfe! Ich hatte bis jetzt keine Ahnung von Hooks ... Aus irgendeinem Grund gab die Verwendung von "~" im Pfad --git-dir den Fehler "fatal: Not a git repository: '~/adler/.git'" zurück. Wenn ich jedoch "~" durch "$ HOME" ersetzt habe (d. H. "--git-dir = $ HOME/adler/.git"), funktioniert es einwandfrei. Irgendeine Idee, warum "~" nicht mit --git-dir und --work-tree funktioniert? – cdwilson

+0

Sie erhalten diesen Fehler mit dem Commit-Hook? Könnte sein, dass dein/bin/sh Probleme damit hat; Ersetzen Sie die erste Zeile durch #!/bin/bash und sehen Sie, ob das das Problem behebt. (Wenn Sie auf der anderen Seite diesen Fehler mit dem Alias ​​bekommen, dann habe ich keine Ahnung.) – mkarasek

0

Wenn eagle innerhalb eines ProjX nicht seinen Platz hat,
aber jeder ProjX eine bestimmte Revision von eagle verwenden können,
dann:

Für jede ProjX, müssen Sie:

  • haben Sie eine MainProjX Git Repo, in der Sie finden würden:
    • eine ProjX
    • eine Version von eagle (am gleichen Niveau als ProjX)

Das Ziel jeden Projektes MainProjX Elternteil zusammen, um die Versionen von ProjX zu halten und eagle , das heißt, die richtigen Abhängigkeiten aufzuzeichnen. Jetzt

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

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

, ja, das ist eine Menge ‚eagle‘ Vervielfältigung, aber das ist notwendig, wenn jeder ProjX Lage ist, seine eigene eagle Revision zu verwenden.

+0

VonC, danke für die schnelle Antwort. Ja, das war das einzige, was ich mir vorstellen konnte ... Das Problem ist, dass der "Adler" -Repo wirklich massiv sein kann (eine ganze Cad-Bibliothek), während die Proj [x] -Repos wirklich klein sind. Wie du schon sagtest, müsste ich Tonnen von Kopien der 'Adler'-Repos aufbewahren, UND noch schlimmer, ich müsste den Bibliothekspfad des CAD-Tools manuell auf den individuellen Proj [x]/adler/dir für den Werkzeug, um sie sogar zu sehen, was diese Methode praktisch unbrauchbar macht. – cdwilson

+1

@lotharsmash: Wäre nicht ein relativer Pfad "' ../ adler'' für jeden Bibliothekspfad ausreichend? (da 'Adler' auf dem gleichen Level wie' ProjX' wäre) – VonC