Git Repositories zusammenführen (git pull)

Mittels git pull kann man ein Git Repository in ein anderes ziehen und so beide zu einem zusammenführen. Die Historien beider Git-Repos bleiben dabei erhalten:

cd /pfad/zum/ersten_git_repo/
git pull /pfad/zum/zweiten_git_repo/

git-pull(1) führt dabei ein git fetch gefolgt von einem git merge aus.

In git log kann man nun die Historie beider Projekte sehen – und einen zusätzlichen commit der das soeben durchgeführte merge darstellt.

In ein Unterverzeichnis ziehen

Mit obigem Ansatz landen sämtliche Dateien des zweiten Git-Repositories im Hauptverzeichnis des ersten. Um das zu vermeiden, kann man zuerst im zweiten Repository die Dateien in ein Unterverzeichnis verschieben:

cd /pfad/zum/zweiten_git_repo/
mkdir verzeichnis_zweites_repo
# -k sorgt dafür, dass der Befehl trotz Warnung des mv-Kommandos durchgeführt wird:
git mv -k * verzeichnis_zweites_repo
git commit -m 'moved all files into subdirectory verzeichnis_zweites_repo'
# an dieser Stelle dieses Repository in das erste ziehen (siehe erstes Listing dieses Artikels)

Rückwirkend in ein Unterverzeichnis ziehen

In der aktuellen Revision liegen die Dateien dann zwar im korrekten Unterverzeichnis. In der Historie sind sie jedoch nach wie vor im Hauptverzeichnis zu finden.

Diesen Nachteil kann man vermeiden, indem man git filter-branch zum Verschieben in das Unterverzeichnis nutzt.

Achtung: git filter-branch ändert die Historie. Siehe dazu diesen Hinweis aus der git-filter-branch(1) Manpage:

WARNING! The rewritten history will have different object names for all the objects and will not converge with the original branch. You will not be able to easily push and distribute the rewritten branch on top of the original branch. Please do not use this command if you do not know the full implications, and avoid using it anyway, if a simple single commit would suffice to fix your problem.

cd /pfad/zum/zweiten_git_repo/
git filter-branch --tree-filter 'mkdir .temp; mv * .temp' HEAD
git filter-branch -f --tree-filter 'mv .temp verzeichnis_zweites_repo' HEAD
# an dieser Stelle dieses Repository in das erste ziehen (siehe erstes Listing dieses Artikels)

Unterverzeichnisse ohne Eingriff in das zweite Git-Repository?

Ich könnte mir vorstellen, dass etwas Ähnliches direkt mit git pull umsetzbar ist ohne das zweite Repository verändern zu müssen.

Solltest Du eine solche Möglichkeit kennen, freue ich mich über einen entsprechenden Hinweis in den Kommentaren.