Externals mit Git … eure Konzepte.
Wie ihr ja gemerkt habt, versuche ich gerade ein wenig an einem Open-Source-Projekt zu basteln und als jemand, der gerne mit „neuen“ Technologien rumspielt, habe ich natürlich ein Git-Repository auf GitHub.com aufgesetzt. Wie das als Neuling so ist, steht man oft vor den einfachsten Problemen, wie der Ochs vorm Berg. Glücklicherweise gibt es aber Leute, die haben einen Blog, auf dem man mal nach Hilfe fragen kann. Das will ich jetzt auch tun.
Fangen wir an mit der aktuellen Situation. Das Tool an dem ich arbeite heißt LiveTest und besteht aus einem Kern und einigen Bibliotheken, die es nutzt. Genau diese Libraries sind aber das Problem. Nehmen wir uns mal eine x-beliebige Bibliothek. Würde sie nur aus Sourcen bestehen, wäre es kein Problem. Da man aber noch Tests und vielleicht andere Helferlein irgendwo hinpacken muss, kommt es vor, dass man eine Verzeichnisstruktur wie folgt hat:
/src /bin /test
Eine solche Struktur war in SVN-Zeiten gang und gebe.
Soweit ich Git jetzt verstanden habe, kann man nur komplette Repositories in sein Projekt als Submodule reinhängen. Falls ich also diese Bibliothek nutzen will, habe ich bin und test auch in meinen Sourcen verankert. Irgendwie doof, da ich das wirklich nicht brauchen kann. Jetzt würde ich gerne mal wissen, wie ihr oder wie man allgemein mit diesem „Problem“ umgeht. Alle Lösungen, die mir im Moment einfallen, machen irgendwie keinen Sinn. Also schon mal Danke für eure Hilfe.
Ach ja, ich werde die restliche Woche nicht bloggen, da ich in Paris auf der Symfony Live 2011 bin. Von dort werde ich aber bestimmt einige schöne Geschichten mitbringen.
Du könntest die Verzeichnisse vor dem git add in die .gitignore aufnehmen (http://www.gitready.com/beginner/2009/01/19/ignoring-files.html), damit werden sie nicht zum Repository hinzugefügt.
Falls du sie nachträglich aus dem Repository entfernen willst musst du noch ein
git rm –cached-files /path/to/dir/or/file
machen und anschließend auch in dir .gitignore eintragen.
Benutze normale Submodules, zusammen mit einem Build-File. Hab das wegen Cruise-Control sowieso.
Alternativ kann man wohl auch mit Subtree-Merge Verzeichnisse „einhängen“. Damit habe ich mich aber nicht weiter beschäftigt.
Na dann sehen wir uns in Paris
Was ich gelesen habe ist die Subtree-Merge Methode tatsächlich am ehesten für das einbinden von Unterverzeichnissen geeignet in Git.
Hat das mit dem .gitignore bei submodules jemand getestet? Das scheint mir wenig Sinn zu machen, da submodule als Einheit commited werden.
Ich habe in dem Zusammenhang aber derzeit bei einem Projekt mit noch einem größeren Problem zu kämpfen gehabt, nämlich das einbinden von Bibliotheken, die nicht via git verfügbar sind.
Habe mir dafür eine eigene kleine Bibliothek geschrieben um das Problem möglichst Arbeitsarm in Zukunft lösen zu können.
https://github.com/Flyingmana/pere
Die ließe sich für git auch dahingehend erweitern, dass nur ein bestimmtes Unterverzeichnis am Ziel landet. Ein Beispiel dafür gibt es auch schon bei dem zip fetcher.
@Flyingmama:
Hatte kurzzeitig das selbe Problem, hab das dann aber kurz und schmerzlich gelöst. Ich habe für das Projekt (verfügbar über SVN) kurzerhand auf github ein Mirror angelegt und binde diesen ein.
https://github.com/KingCrunch/vfsStream
Andere möglichkeit wäre folgende: http://h2ik.co/2011/03/having-fun-with-git-subtree/
Der einfachste weg ist tatsächlich „submodules“
das sieht dann in etwa wie folgt aus:
$ git submodule add git://github.com/digitalkaoz/ProjectUtilitiesBundle.git src/rs/ProjectUtilitiesBundle
$ git submodule init
ps: diese werden dann in einem file „.gitmodules“ gestored
[submodule „src/rs/ProjectUtilitiesBundle“]
path = src/rs/ProjectUtilitiesBundle
url = git@github.com:digitalkaoz/ProjectUtilitiesBundle.git
Herr Weier O’Phinney hatte wohl auch das gleiche Problem:
http://weierophinney.net/matthew/archives/258-Git-Subtree-Merging-Guide.html