Ich habe eine ungewöhnliche Idee, Git als Backup-System zu verwenden. Nehmen wir also an, ich habe ein Verzeichnis ./backup/myfiles und möchte dieses mit git sichern. Um die Dinge sauber zu halten, möchte ich kein .git-Verzeichnis im Ordner myfiles haben, also dachte ich, ich könnte ./backup/git_repos/myfiles erstellen. Beim Betrachten der Git-Dokumente habe ich Folgendes versucht:
$ cd backup/myfiles
$ mkdir ../git_repos/myfiles
$ git --git-dir=../git_repos/myfiles init
Initialized empty Git repository in backup/git_repos/myfiles/
$ git --git-dir="../git_repos/myfiles/" add foo
fatal: pathspec 'foo' did not match any files
Sie können die Fehlermeldung sehen, die ich dort erhalte. Was mache ich falsch?
Antworten:
Dies wird tun, was Sie wollen, wird aber offensichtlich scheiße sein, wenn Sie es mit jedem Git-Befehl angeben müssen, den Sie jemals verwenden.
Sie können exportieren
GIT_WORK_TREE=.
undGIT_DIR=../backup
Git holt sie bei jedem Befehl ab. Dadurch können Sie jedoch nur bequem in einem einzigen Repository pro Shell arbeiten.Ich würde eher vorschlagen, das .git-Verzeichnis mit einem anderen Ort zu verknüpfen oder einen Symlink mit dem .git-Verzeichnis aus Ihrem Hauptsicherungsverzeichnis zu erstellen.
quelle
Sie müssen nur sicherstellen, dass das Repository weiß, wo sich der Arbeitsbaum befindet und umgekehrt.
Legen Sie den Konfigurationswert fest, damit das Repository weiß, wo sich der Arbeitsbaum befindet
core.worktree
. Fügen Sie eine Datei mit dem Namen .git (kein Ordner!) Und eine Zeile wie hinzu, um dem Arbeitsbaum mitzuteilen, wo sich das Git-Verzeichnis befindetSeit git 1.7.5 hat der Befehl init eine zusätzliche Option dafür gelernt.
Sie können ein neues separates Repository mit initialisieren
Dadurch wird das Git-Repository im separaten Verzeichnis initialisiert und die Git-Datei im aktuellen Verzeichnis hinzugefügt, das das Arbeitsverzeichnis des neuen Repositorys ist.
Vor 1.7.5 mussten Sie leicht unterschiedliche Parameter verwenden und die .git-Datei selbst hinzufügen.
Um ein separates Repository zu initialisieren, verknüpft der folgende Befehl den Arbeitsbaum mit dem Repository:
Ihr aktuelles Verzeichnis ist der Arbeitsbaum und Git verwendet das Repository unter
/path/to/repo.git
. Der Befehl init setzt automatisch dencore.worktree
mit dem--git-dir
Parameter angegebenen Wert .Sie können sogar einen Alias hinzufügen:
Verwenden Sie die Git-Versionskontrolle für ein schreibgeschütztes Arbeitsverzeichnis
Mit den oben genannten Kenntnissen können Sie sogar die Git-Versionskontrolle für ein Arbeitsverzeichnis einrichten, ohne über Schreibberechtigungen zu verfügen. Wenn Sie entweder
--git-dir
für jeden git-Befehl verwenden oder jeden Befehl aus dem Repository (anstelle des Arbeitsverzeichnisses) ausführen, können Sie die .git-Datei weglassen und müssen daher keine Dateien im Arbeitsverzeichnis erstellen. Siehe auch Leos Antwortquelle
core.worktree
wird natürlich in der Konfigurationsdatei des .git-Ordners gespeichert, auf die die .git-Datei verweist.fatal: core.worktree and core.bare do not make sense
. Scheint, als würde man nur die Konfiguration ändern, damit es nicht einfach ist, das zu beheben.Die
--separate-git-dir
Option fürgit init
(undgit clone
) kann verwendet werden, um dies in meiner Version von git (1.7.11.3
) zu erreichen. Die Option trennt das Git-Repository vom Arbeitsbaum und erstellt.git
im Stammverzeichnis des Arbeitsbaums einen dateisystemunabhängigen symbolischen Git-Link (in Form einer Datei mit dem Namen ). Ich denke, das Ergebnis ist identisch mit der Antwort von Niks .quelle
init
selbst sieht klarer und sauberer ausrepo.git
mit dem Attribut hiden erstellt. Ich ändere es dann manuell. Wissen Sie zufällig, ob dies sicher ist?Ich finde es einfacher, die in der Antwort von niks verwendeten Verzeichnisse
--work-tree
und umzukehren :--git-dir
Dieser Ansatz hat zwei Vorteile:
.git
-dateien mehr benötigt. Sie arbeiten einfach normal im Stammverzeichnis des Repositorys.Die einzige Einschränkung, auf die ich gestoßen bin, ist, dass Sie anstelle der Verwendung einer
.gitignore
Datei bearbeiteninfo/exclude
.Sie können das Repository dann
read_only_repos/foo
als Remote in Ihren eigenen Repositorys verwenden, auch wenn die Originaldateien nicht der Versionskontrolle unterliegen.quelle
Es ist üblich, ein Verzeichnis zu benennen, bei dem es sich um ein Git-Repository handelt, dessen Arbeitsbaum sich an einem ungewöhnlichen Ort mit der Erweiterung '.git' befindet, ähnlich wie bei einem nackten Repository.
Wenn Sie die
--work-tree
Option zur Init-Zeit angegeben hätten, hätte dies automatisch diecore.worktree
Konfigurationsvariable eingerichtet, was bedeutet, dass git weiß, wo sich der Arbeitsbaum befindet, sobald Sie das git-Verzeichnis angegeben haben.Sie können diese Variable aber auch nachträglich festlegen.
Sobald Sie dies getan haben, sollte der Befehl add wie erwartet funktionieren.
quelle
Verwendung
git
im Repo:Von nun an können Sie
git
innerhalb des./backup/git_repos/myfiles
Verzeichnisses verwenden, ohne Umgebungsvariablen oder zusätzliche Parameter festzulegen.quelle
warning: core.bare and core.worktree do not make sense
verstehe die Nachricht. Bedeutet das, dass es nicht funktioniert hat?core.bare
zufalse
später.Sie könnten ein "Nodgit" -Skript (No Dot GIT) mit so etwas wie erstellen
Sie können nodgit anstelle von git aufrufen und es werden nach Bedarf Variablen festgelegt, indem nach einem git-Repo gesucht wird. Angenommen, Sie haben ein (nacktes) Repo in / usr / local / gits / __ home__foo_wibbles und Sie befinden sich in / home / foo / wibbles / one. Dann wird das richtige Arbeitsverzeichnis (/ home / foo / wibbles) und Repo gefunden .
Oh, Sie können auch "nodgit shell" verwenden, um eine Shell mit den richtigen vars zu erhalten, so dass Sie einfache alte git-Befehle verwenden können.
quelle
Angenommen, Ihre
myfiles
Verzeichnisse sind bereits vorhanden und enthalten Inhalte. Könnten Sie damit leben:Das
.git
Verzeichnis befindet sich inbackup
, nicht inmyfiles
.quelle
git
Mit der.gitignore
Datei können Sie eine Auswahl der Dateien behalten, die Sie verfolgen möchten . Wenn Sie hinzufügen*
und hinzufügen!myfiles
, wird nur dieses Verzeichnis verfolgt. Aber wenn Sie ein separates Repo für ein anderes Verzeichnis möchten, hätten Sie ein Problem ...Ich erstelle Skripte, die aussehen
~ / bin / git-slash:
Die Verwendung von --git_dir = $ GIT_DIR ist überflüssig, erinnert mich jedoch daran, dass ich Umgebungsvariablen auch außerhalb des Skripts festlegen kann.
Das obige Beispiel dient zum Verfolgen lokaler Änderungen an Cygwin-Systemdateien.
Kann ein solches Skript für jedes größere Projekt erstellen, das dies benötigt - aber / ohne /.git ist meine Hauptverwendung.
Das Obige ist klein genug, um einen Shell-Alias oder eine Shell-Funktion zu erstellen, wenn Sie die Redundanz beseitigen.
Wenn ich dies oft genug mache, würde ich den Arbeitsbereich für die Repository-Zuordnung von wiederbeleben
Das nächste moderne Gegenstück sind Perforce-Zuordnungen oder -Ansichten , die teilweise Auschecken sowie die Nicht-Colocation von Arbeitsbereich und Repo unterstützen.
quelle