How To: Submodule - die SVN Externals für Git

SYSTEM
02.01.2014 22:57:31
in Git gibt es die Möglichkeit, die aus SVN bekannten Externals per Submodule einzubinden. Git erkennt solche Externen Repos von Haus aus schon teilweise, sie werden aber nicht korrekt behandelt, was wir von Hand nacharbeiten müssen, damit alles korrekt funktioniert.

Anfangen werden wir mit dem einbinden einer API von Facebook, die unter https://github.com/facebook/facebook-php-sdk.git :

Wir legen uns also ein neues Projekt an, wechseln da hinein und initialisieren dieses, dann legen wir den library Ordner an und fügen das Submodule hinzu:


BASH code

  1. mkdir NewProject
  2. cd NewProject
  3. git init
  4. mkdir library
  5. git submodule add https://github.com/facebook/facebook-php-sdk.git library/facebook-php-sdk

damit ist das Submodul angelegt und für Git bekannt:


BASH code

  1. git status
  2. # On branch master
  3. #
  4. # Initial commit
  5. #
  6. # Changes to be committed:
  7. # (use "git rm --cached <file>..." to unstage)
  8. #
  9. # new file: .gitmodules
  10. # new file: library/facebook-php-sdk
  11. #

Es existiert jetzt außerdem eine Datei .gitmodules, in dieser verwaltet git besagte Module:


BASH code

  1. cat .gitmodules
  2.  
  3. [submodule "library/facebook-php-sdk"]
  4. path = library/facebook-php-sdk
  5. url = https://github.com/facebook/facebook-php-sdk.git

Die Submodule sind nun bei jedem clone vorerst leer und müssen von Hand initialisiert werden:


BASH code

  1. git submodule init

Um die Submodule zu updaten reicht ein


BASH code

  1. git submodule update



Das entfernen von Submodulen ist leider noch ein wenig Handarbeit, da ein einfacher Befehl wie


BASH code

  1. git submodule rm library/facebook-php-sdk

existiert leider nicht.

Entfernt werden Submodule wie folgt:

Wir löschen die zutreffenden Einträge aus der .gitmodule:


BASH code

  1. [submodule "library/facebook-php-sdk"]
  2. path = library/facebook-php-sdk
  3. url = https://github.com/facebook/facebook-php-sdk.git

Wir löschen den zutreffenden Eintrag aus der .git/config:


BASH code

  1. [submodule "library/facebook-php-sdk"]
  2. url = https://github.com/facebook/facebook-php-sdk.git

Und wir löschen das Repo aus dem Git Cache:


BASH code

  1. git rm --cached library/facebook-php-sdk

Ein Git Submodule kann genau wie ein normales Git Repo behandelt werden innerhalb des jeweiligen Submodule-Ordners.