Was ist die beste Vorgehensweise, um mehrere Projekte in ein Git-Repository zu stellen? [geschlossen]


188

Aus irgendeinem Grund kann ich nur ein Repository verwenden.
Aber ich habe mehrere Projekte, einschließlich javaProjekte php scriptsund AndroidApps-Projekte.

Jetzt ist mein Problem, ich muss sie in verschiedene Unterordner innerhalb des Repositorys legen.
Ich verwende verschiedene IDEs. Sie wissen, jede IDE kann einen eigenen Arbeitsbereich haben.

Wer kann mir eine bewährte Methode zur Lösung des Problems nennen?



2
Du bist nicht allein. Ich habe einen ähnlichen Fall mit meinen Repos, die ich zu Lernzwecken verwende (Beispiel: github.com/hopbit/java-sandbox ). Ich möchte kein neues Repo erstellen, um Beispiele für jedes neue Buch / Tutorial auszuprobieren, das ich zu lesen beginne ...
Łukasz Siwiński

Ein Grund, warum Sie dies tun möchten, ist, wenn Sie ein Projekt haben, das Produktcode ist, den Sie in Laufzeitumgebungen wie Test oder Produktion bereitstellen. Das zweite Projekt ist eine Anwendung, die das erste Projekt vom System testet (z. B. BDD). Zwischen diesen beiden Projekten besteht eine enge Beziehung, und jetzt können Sie die Gesamtheit mithilfe einer Repository-URL verwalten / auf sie verweisen.
Lance Kind

Zusammenfassung wie
folgt

Antworten:


198

Während die meisten Leute Ihnen sagen, dass Sie nur mehrere Repositorys verwenden sollen, ist es meiner Meinung nach erwähnenswert, dass es andere Lösungen gibt.

Lösung 1

Ein einzelnes Repository kann mehrere unabhängige Zweige enthalten, die als verwaiste Zweige bezeichnet werden . Waisenzweige sind völlig voneinander getrennt; Sie teilen keine Geschichten.

git checkout --orphan BRANCHNAME

Dadurch wird ein neuer Zweig erstellt, der nicht mit Ihrem aktuellen Zweig zusammenhängt. Jedes Projekt sollte sich in einer eigenen verwaisten Niederlassung befinden.

Aus irgendeinem Grund muss Git nach einer Waisenkasse ein wenig aufgeräumt werden.

rm .git/index
rm -r *

Stellen Sie sicher, dass alles festgeschrieben ist, bevor Sie es löschen

Sobald der verwaiste Zweig sauber ist, können Sie ihn normal verwenden.

Lösung 2

Vermeiden Sie den Ärger mit verwaisten Zweigen. Erstellen Sie zwei unabhängige Repositorys und übertragen Sie sie auf dieselbe Fernbedienung. Verwenden Sie einfach unterschiedliche Filialnamen für jedes Repo.

# repo 1
git push origin master:master-1

# repo 2
git push origin master:master-2

Vielen Dank, das sollte mein Problem lösen können. Tatsächlich verwenden die beiden Lösungen Zweige, um unterschiedliche Projekte durchzuführen.
Stony

6
Ich bin nicht sicher, ob ich Lösung 2 verstehe. Wollen Sie damit sagen, dass Sie alle .git-Dateien in ein Master-Git-Repo übertragen? Was ist anders zwischen der Verwendung mehrerer verwaister Zweige und der Verwendung mehrerer Zweige?
Nate

13
@Nate Was er sagt, ist Folgendes: Erstellen Sie zwei separate lokale Repositorys und verschieben Sie beide in dasselbe Remote- Repository auf GitHub.
Der Kerl mit dem Hut

1
Danke @TheGuywithTheElfHat. Jetzt, wo ich es mir noch einmal ansehe (9 Monate später), scheint es mir klar zu sein. Lösung 2 erstellt immer noch verwaiste Zweige, aber ich kann sehen, wie diese Methode einfacher zu handhaben ist.
Nate

21
Lösung 2 braucht mehr Erklärung
eC Droid

19

Lösung 3

Dies dient zur Verwendung eines einzelnen Verzeichnisses für mehrere Projekte. Ich verwende diese Technik für einige eng verwandte Projekte, bei denen ich häufig Änderungen von einem Projekt in ein anderes ziehen muss. Es ähnelt der Idee der verwaisten Zweige, aber die Zweige müssen nicht verwaist sein. Starten Sie einfach alle Projekte aus demselben leeren Verzeichnisstatus.

Starten Sie alle Projekte aus einem festgeschriebenen leeren Verzeichnis

Erwarten Sie keine Wunder von dieser Lösung. Aus meiner Sicht werden Sie immer Ärger mit nicht verfolgten Dateien haben. Git hat nicht wirklich eine Ahnung, was mit ihnen zu tun ist. Wenn also Zwischendateien von einem Compiler generiert und von Ihrer Gitignore-Datei ignoriert werden, bleiben sie wahrscheinlich einige Zeit hängen, wenn Sie versuchen, schnell zu tauschen zwischen - zum Beispiel - Ihrem Softwareprojekt und einem Doktorandenprojekt.

Hier ist jedoch der Plan. Beginnen Sie so, wie Sie Git-Projekte starten sollten, indem Sie das leere Repository festschreiben, und starten Sie dann alle Ihre Projekte aus demselben leeren Verzeichnisstatus. Auf diese Weise sind Sie sicher, dass die beiden Lose ziemlich unabhängig voneinander sind. Geben Sie Ihren Filialen auch einen richtigen Namen und verwenden Sie nicht nur "master". Ihre Projekte müssen getrennt sein, geben Sie ihnen entsprechende Namen.

Git-Commits (und damit Tags und Zweige) speichern im Grunde genommen den Status eines Verzeichnisses und seiner Unterverzeichnisse, und Git hat keine Ahnung, ob dies Teile desselben oder verschiedener Projekte sind. Es ist also wirklich kein Problem, wenn Git verschiedene Projekte im selben Repository speichert. Das Problem besteht dann darin, dass Sie die nicht verfolgten Dateien aus einem Projekt löschen, wenn Sie ein anderes verwenden, oder die Projekte später trennen.

Erstellen Sie ein leeres Repository

cd some_empty_directory
git init
touch .gitignore
git add .gitignore
git commit -m empty
git tag EMPTY

Starten Sie Ihre Projekte leer.

Arbeite an einem Projekt.

git branch software EMPTY
git checkout software
echo "array board[8,8] of piece" > chess.prog

git add chess.prog 
git commit -m "chess program"

Starten Sie ein anderes Projekt

wann immer du magst.

git branch thesis EMPTY
git checkout thesis
echo "the meaning of meaning" > philosophy_doctorate.txt
git add philosophy_doctorate.txt 
git commit -m "Ph.D"

Hin und her wechseln

Wechseln Sie zwischen Projekten hin und her, wann immer Sie möchten. Dieses Beispiel geht auf das Schach-Software-Projekt zurück.

git checkout software
echo "while not end_of_game do make_move()" >> chess.prog
git add chess.prog 
git commit -m "improved chess program"

Nicht verfolgte Dateien sind ärgerlich

Sie werden sich jedoch über nicht verfolgte Dateien beim Wechseln zwischen Projekten / Zweigen ärgern.

touch untracked_software_file.prog
git checkout thesis 
ls
    philosophy_doctorate.txt  untracked_software_file.prog

Es ist kein unüberwindbares Problem

Per Definition weiß Git nicht wirklich, was er mit nicht verfolgten Dateien tun soll, und es liegt an Ihnen, mit ihnen umzugehen. Sie können verhindern, dass nicht verfolgte Dateien wie folgt von einem Zweig zum anderen übertragen werden.

git checkout EMPTY 
ls
    untracked_software_file.prog
rm -r *
    (directory is now really empty, apart from the repository stuff!)
git checkout thesis
ls
    philosophy_doctorate.txt

Indem wir vor dem Auschecken unseres neuen Projekts sicherstellten, dass das Verzeichnis leer war, stellten wir sicher, dass keine nicht verfolgten Dateien von einem anderen Projekt hängen.

Eine Verfeinerung

$ GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01T01:01:01' git commit -m empty

Wenn beim Festschreiben eines leeren Repositorys dieselben Daten angegeben werden, können unabhängig erstellte Commits für leere Repositorys denselben SHA1-Code haben. Auf diese Weise können zwei Repositorys unabhängig voneinander erstellt und später in einem Repository zu einem einzigen Baum mit einem gemeinsamen Stamm zusammengeführt werden.

Beispiel

# Create thesis repository. 
# Merge existing chess repository branch into it

mkdir single_repo_for_thesis_and_chess
cd single_repo_for_thesis_and_chess
git init
touch .gitignore
git add .gitignore
GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01:T01:01:01' git commit -m empty
git tag EMPTY
echo "the meaning of meaning" > thesis.txt
git add thesis.txt
git commit -m "Wrote my PH.D"
git branch -m master thesis

# It's as simple as this ...
git remote add chess ../chessrepository/.git
git fetch chess chess:chess

Ergebnis

Diagramm der zusammengeführten Repositorys

Unterverzeichnisse pro Projekt verwenden?

Es kann auch hilfreich sein, wenn Sie Ihre Projekte nach Möglichkeit in Unterverzeichnissen aufbewahren, z. B. anstatt Dateien zu haben

chess.prog
philosophy_doctorate.txt 

haben

chess/chess.prog
thesis/philosophy_doctorate.txt 

In diesem Fall wird Ihre nicht verfolgte Softwaredatei sein chess/untracked_software_file.prog. Wenn Sie im thesisVerzeichnis arbeiten, sollten Sie nicht durch nicht verfolgte Schachprogrammdateien gestört werden, und es kann vorkommen, dass Sie problemlos arbeiten können, ohne nicht verfolgte Dateien aus anderen Projekten zu löschen.

Wenn Sie nicht verfolgte Dateien aus anderen Projekten entfernen möchten, ist es außerdem schneller (und weniger fehleranfällig), ein unerwünschtes Verzeichnis zu sichern, als unerwünschte Dateien durch Auswahl der einzelnen zu entfernen.

Zweigstellennamen können '/' Zeichen enthalten

Vielleicht möchten Sie Ihre Filialen so nennen

project1/master
project1/featureABC
project2/master
project2/featureXYZ

9

Ich würde verwenden git submodules.

Schauen Sie sich hier das Git-Repository in einem Git-Repository an

Per Februar 2009 würde ich vorschlagen Monorepos


5
"Ich habe nur ein Repository zu verwenden." Möchten Sie erklären, wie Sie mehrere Submodule im selben Repository speichern würden?
Ivan

4
git submodule add [url to git repo]- git-scm.com/book/en/v2/Git-Tools-Submodules
prasanthv

3
Könnten Sie vielleicht erklären, warum 'Monorepos'?
Sophievda
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.