Ist es möglich, 2 Git-Repositorys in einem Verzeichnis zu haben? Ich würde nicht denken, aber ich würde fragen. Grundsätzlich möchte ich meine Home-Verzeichnis-Konfigurationsdateien (z. B. .emacs) einchecken, die für alle Computer, auf denen ich arbeite, gleich sein sollten, aber ein zweites Repository für lokale Dateien (z. B. .emacs.local) haben, das enthält Maschinenspezifische Konfigurationen. Die einzige Möglichkeit, dies zu tun, besteht darin, die lokale Konfiguration in einem Unterverzeichnis zu haben und dieses Unterverzeichnis aus dem Haupt-Git-Repository zu ignorieren. Irgendwelche anderen Ideen?
git
git-submodules
git-subrepo
Joe Casadonte
quelle
quelle
git subtree
wird den Job erledigen.Antworten:
Wenn ich verstehe, was Sie tun, können Sie alles in einem Repository verwalten, indem Sie separate Zweige für jeden Computer und einen Zweig verwenden, der Ihre gemeinsamen Konfigurationsdateien für das Ausgangsverzeichnis enthält.
Initialisieren Sie das Repo und übergeben Sie die allgemeinen Dateien daran. Benennen Sie den MASTER-Zweig möglicherweise in Common um. Erstellen Sie dann von dort aus einen separaten Zweig für jeden Computer, mit dem Sie arbeiten, und übertragen Sie maschinenspezifische Dateien in diesen Zweig. Wenn Sie Ihre allgemeinen Dateien ändern, führen Sie den gemeinsamen Zweig in jedem der Computerzweige zusammen und übertragen Sie ihn auf Ihre anderen Computer (schreiben Sie ein Skript dafür, wenn es viele gibt).
Überprüfen Sie dann auf jedem Computer den Zweig dieses Computers, der auch die allgemeinen Konfigurationsdateien enthält.
quelle
Dieser Artikel behandelt dies relativ gut:
https://github.com/rrrene/gitscm-next/blob/master/app/views/blog/progit/2010-04-11-environment.markdown
Grundsätzlich ist dies einfacher, wenn Sie über die Befehlszeile arbeiten, als Sie vielleicht vermuten. Angenommen, Sie möchten 2 Git-Repos:
Sie könnten sie so einrichten:
Sie können eine Datei hinzufügen und sie nur einer solchen übertragen:
Die Optionen für git stehen also zuerst an, dann der Befehl und dann die Optionen des git-Befehls. Sie könnten leicht genug einen Git-Befehl alias wie:
So können Sie sich mit etwas weniger Tipparbeit auf das eine oder andere festlegen, wie z
gitone commit -m "blah"
.Was schwieriger zu werden scheint, ist das Ignorieren. Da sich .gitignore normalerweise im Projektstamm befindet, müssen Sie einen Weg finden, dies ebenfalls zu ändern, ohne den gesamten Stamm zu wechseln. Oder Sie könnten .git / info / exclude verwenden, aber alle Ignorierungen, die Sie dann ausführen, werden nicht festgeschrieben oder gepusht - was andere Benutzer vermasseln könnte. Andere, die eines der beiden Repos verwenden, pushen möglicherweise einen .gitignore, was zu Konflikten führen kann. Mir ist nicht klar, wie ich diese Probleme am besten lösen kann.
Wenn Sie GUI-Tools wie TortoiseGit bevorzugen, haben Sie auch einige Herausforderungen. Sie können ein kleines Skript schreiben, das .gitone oder .gittwo vorübergehend in .git umbenennt, damit die Annahmen dieser Tools erfüllt werden.
quelle
alias gitone='git --git-dir=.gitone'
gitone config core.excludesfile gitone.exclude
undgitone add gitone.exclude
. Ich habe ein Skript erstellt, das diese Lösung erweitert: github.com/capr/multigitgit config --global alias.youralias '!git --git-dir="/d/MyProject/_git"'
damals so gemachtgit youralias status
:).gitignore
Dateien normalerweise gesetzt und vergessen werden, können Sie für jedes Repo unterschiedliche Kopien erstellen und dann die entsprechende Version als Teil des Alias in das Verzeichnis kopieren. Dies gilt für andere Dateien im Stammverzeichnis, bei denen Konflikte auftreten können, z. B.README.md
und.gitattributes
.Schauen Sie sich das Git-Submodul an .
quelle
RichiH hat ein Tool namens vcsh geschrieben, mit dem Dotfiles mithilfe der gefälschten Bare-Repos von git verwaltet werden können, um mehr als ein Arbeitsverzeichnis in $ HOME abzulegen. Nichts mit csh AFAIK zu tun.
Wenn Sie jedoch mehrere Verzeichnisse hatten, ist eine Alternative zu Git-Submodulen (die unter den besten Umständen schmerzhaft sind und diese Beispielverwendung nicht die besten Umstände sind) Gitslave, bei dem die Slave-Repos an der Spitze von a ausgecheckt bleiben Verzweigen Sie jederzeit und benötigen Sie nicht den dreistufigen Prozess, um eine Änderung im Tochter-Repo vorzunehmen (Auschecken auf die richtige Verzweigung, Vornehmen und Festschreiben der Änderung, dann in das Superprojekt gehen und das neue Submodul-Festschreiben festschreiben).
quelle
Es ist möglich, die Variable zu verwenden
GIT_DIR
, hat aber viele Einschränkungen, wenn Sie nicht wissen, was Sie tun.quelle
Ja, Submodule sind wahrscheinlich das, was Sie wollen. Eine andere Möglichkeit wäre, Ihre Arbeitskopie in einem Unterverzeichnis zu haben und dann Symlinks von Ihrem Home-Verzeichnis auf die Dateien von Interesse zu verweisen.
quelle
Meine bevorzugte Methode ist die Verwendung eines Repos in einem Unterverzeichnis und die Verwendung rekursiver symbolischer Links:
wo die ' repo / build ' -Datei aussieht:
Vorsicht : Verwenden Sie nicht 'git add'.
quelle
Die andere Möglichkeit besteht darin, sie in separaten Ordnern zu speichern und symbolische feste Links von einem Ordner zum anderen zu erstellen.
Zum Beispiel, wenn es die Repositorys gibt:
Und:
Sie können die Ordner
FolderA
undFolderB
vom Repo1 mit dem Repo2 verknüpfen. Für Windows wäre der Befehl, der auf dem Repo1 ausgeführt werden soll:Für die Dateien in den Haupt-Repositorys müssten Sie die einzelnen Dateien miteinander verknüpfen und zum Repository hinzufügen
.gitignore
, um Rauschen zu vermeiden, sofern Sie dies nicht möchten.quelle
Haftungsausschluss: Dies ist keine Werbung. Ich bin der Entwickler der bereitgestellten Bibliothek.
Ich habe eine Git-Erweiterung erstellt, um Fälle zu behandeln, in denen Sie mehrere Repositorys in einem Ordner mischen möchten. Der Vorteil der Bibliothek besteht darin, die Repositorys und Dateikonflikte im Auge zu behalten. Sie können es auf finden Github finden . Es gibt auch 2 Beispiel-Repositorys, um es auszuprobieren.
quelle