Zwei Git-Repositorys in einem Verzeichnis?

85

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?

Joe Casadonte
quelle
git subtreewird den Job erledigen.
Syd Pao
Wenn Sie nicht mit zu vielen Dateien arbeiten, können Sie auch Symlinks / Junctions erstellen.
27.

Antworten:

36

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.

Paul
quelle
Während Submodule auch funktionieren werden, denke ich, dass dies der beste Ansatz für mich ist. Die lokalen Dateien folgen einer Vorlage. Wenn ich Änderungen an der Vorlage im MASTER-Zweig vornehme, kann ich sie in den lokalen Zweigen des Computers zusammenführen und die lokalen Konfigurationsdateien schrittweise aktualisieren. Danke für die Hilfe!
Joe Casadonte
benutze beide Mercurial und Git.
Linc
167

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:

.gitone
.gittwo

Sie könnten sie so einrichten:

git init .
mv .git .gitone
git init .
mv .git .gittwo

Sie können eine Datei hinzufügen und sie nur einer solchen übertragen:

git --git-dir=.gitone add test.txt
git --git-dir=.gitone commit -m "Test"

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:

#!/bin/sh
alias gitone='git --git-dir=.gitone'
alias gittwo='git --git-dir=.gittwo'

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.

Chris Moschini
quelle
1
Das Festlegen als Alias ​​löst den folgenden Fehler aus: $ git config --global alias.pub '--git-dir = ~ / Server / www / .gitpublic' $ git pub add. fatal: Alias ​​'pub' ändert Umgebungsvariablen Sie können dazu '! git' im Alias ​​verwenden. Wo würden Sie in diesem Fall das "! Git" setzen?
JaredBroad
1
@JaredBroad Interessant - Ich habe vorgeschlagen, dass Sie einen Bash-Alias ​​verwenden, keinen Git-Alias. Gefällt alias gitone='git --git-dir=.gitone'
mir
10
Sie können die Repos so konfigurieren, dass sie ihre eigenen Ausschlussdateien verwenden, und Sie können diese verfolgen, dh gitone config core.excludesfile gitone.excludeund gitone add gitone.exclude. Ich habe ein Skript erstellt, das diese Lösung erweitert: github.com/capr/multigit
2
@ JaredBroad Ich habe es git config --global alias.youralias '!git --git-dir="/d/MyProject/_git"'damals so gemacht git youralias status:)
Starikovs
1
Wenn Sie davon ausgehen, dass .gitignoreDateien 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.mdund .gitattributes.
27.
15

Schauen Sie sich das Git-Submodul an .

Mit Submodulen können fremde Repositorys in ein dediziertes Unterverzeichnis des Quellbaums eingebettet werden, das immer auf ein bestimmtes Commit verweist.

Hass_
quelle
8
Nicht gut für Dateien, die sich im Stammverzeichnis Ihres Verzeichnisses befinden müssen. Die einzige Chance besteht darin, die Wurzel der Symlinks zu diesen zu füllen.
WhyNotHugo
5

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).

Seth Robertson
quelle
5

Es ist möglich, die Variable zu verwenden GIT_DIR, hat aber viele Einschränkungen, wenn Sie nicht wissen, was Sie tun.

tzervo
quelle
4

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.

Pat Notz
quelle
3

Meine bevorzugte Methode ist die Verwendung eines Repos in einem Unterverzeichnis und die Verwendung rekursiver symbolischer Links:

git clone repo1
cd somerepo
git clone repo2
cd repo2
./build

wo die ' repo / build ' -Datei aussieht:

#!/bin/bash 
SELF_PATH="$(dirname "$(readlink -f "$0")" )"  # get current dir 
cd .. && git stash && git clean -f -d ''       # remove previous symlinks
cp -sR "$SELF_PATH"/* ../.                     # create recursive symlinks in root

Vorsicht : Verwenden Sie nicht 'git add'.

coderofsalvation
quelle
0

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:

  1. Repo1 / FolderA
  2. Repo1 / FolderB

Und:

  1. Repo2 / FolderC

Sie können die Ordner FolderAund FolderBvom Repo1 mit dem Repo2 verknüpfen. Für Windows wäre der Befehl, der auf dem Repo1 ausgeführt werden soll:

User@Repo1$ mklink /J FullPath/Repo2/FolderA FullPath/Repo1/FolderA
User@Repo1$ mklink /J FullPath/Repo2/FolderB FullPath/Repo1/FolderB
User@Repo1$ printf "/FolderA/*\n/FolderB/*\n" >> .gitignore

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.

Benutzer
quelle
0

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.

user1810087
quelle