Wie kann ich ein "normales" Git-Repository in ein nacktes konvertieren?
Der Hauptunterschied scheint zu sein:
Im normalen Git-Repository befindet sich ein
.git
Ordner im Repository, der alle relevanten Daten und alle anderen Dateien enthält, aus denen Ihre Arbeitskopie bestehtIn einem nackten Git-Repository gibt es keine Arbeitskopie und der Ordner (nennen wir es
repo.git
) enthält die tatsächlichen Repository-Daten
mv repo/.git repo.git; rm -rf repo
&&
statt für den;
Fall, dass diesmv
fehlschlägt!Antworten:
Kurz gesagt: Ersetzen Sie den Inhalt von
repo
durch den Inhalt vonrepo/.git
und teilen Sie dem Repository mit, dass es sich jetzt um ein nacktes Repository handelt.Führen Sie dazu die folgenden Befehle aus:
Beachten Sie, dass sich dies von
git clone --bare
einem neuen Standort unterscheidet (siehe unten).quelle
core.bare
. Jetzt, nachdem ich diese Option gegoogeltgit clone --bare /path/to/repo
).rm
Befehl benötigt möglicherweise* \.[!.]*
nicht*
, um Punktdateien und Punktverzeichnisse zu entfernen.Ihre Methode sieht so aus, als würde sie funktionieren. Die Dateistruktur eines Bare-Repositorys entspricht genau dem, was sich im .git-Verzeichnis befindet. Aber ich weiß nicht, ob eine der Dateien tatsächlich geändert wurde. Wenn dies fehlschlägt, können Sie dies einfach tun
Sie müssen dies wahrscheinlich in einem anderen Verzeichnis tun, um einen Namenskonflikt zu vermeiden. Anschließend können Sie es einfach wieder an den gewünschten Ort verschieben. Möglicherweise müssen Sie die Konfigurationsdatei so ändern, dass sie darauf verweist, wo sich Ihr Ursprungs-Repo befindet.
quelle
git clone --bare /path/to/repo.git /path/to/newbarerepo.git
git update-server-info
nach der Erstellung auf dem Bare Repo ausgeführt werden.Ich denke der folgende Link wäre hilfreich
GitFaq: Wie mache ich ein vorhandenes nicht nacktes Repository bloß?
quelle
git clone
) weist jedoch die oben erwähnten Nachteile des Nosatalian auf.Es ist wirklich kinderleicht, eine Bare-Version eines nicht-Bare-Repositorys zu erstellen (siehe mehrere andere Beiträge hier), es sei denn, Sie möchten oder müssen speziell Bits im Dateisystem drehen. Es ist Teil der Kernfunktionalität von git:
git clone --bare existing_repo_path bare_repo_path
quelle
Bitte beachten Sie auch die Verwendung
Aus der Dokumentation :
quelle
clone
). Vermisse ich etwas War--mirror
eine relativ neue Ergänzung?--mirror
ist die ab Version 1.7 verfügbar, also schon ziemlich lange. Sie können hierIch wollte nur auf ein Repository in einem Netzwerkpfad pushen, aber Git ließ mich das nicht tun, es sei denn, dieses Repository wurde als nackt markiert. Ich musste nur die Konfiguration ändern:
Sie müssen nicht mit den Dateien herumspielen, es sei denn, Sie möchten sie sauber halten.
quelle
Ich habe die Antworten gelesen und dies getan:
Dadurch bleibt der Inhalt
repos/.git
unverändertrepos.git
quelle
Folgendes halte ich für am sichersten und einfachsten. Es gibt hier nichts, was oben nicht angegeben ist. Ich möchte nur eine Antwort sehen, die ein sicheres schrittweises Verfahren zeigt. Sie starten einen Ordner aus dem Repository (Repo), das Sie entblößen möchten. Ich habe die oben implizierte Konvention übernommen, dass nackte Repository-Ordner die Erweiterung .git haben.
quelle
Einfach lesen
Pro Git Book: 4.2 Git auf dem Server - Git auf einem Server herunterladen
was darauf hinausläuft
Dann lege my_project.git auf den Server
Was hauptsächlich ist, welche Antwort # 42 versuchte darauf hinzuweisen. Sicher könnte man das Rad neu erfinden ;-)
quelle
Hier ist eine kleine BASH-Funktion, die Sie Ihrem .bashrc- oder .profile auf einem UNIX-basierten System hinzufügen können. Nach dem Hinzufügen wird die Shell entweder neu gestartet oder die Datei wird über einen Aufruf von
source ~/.profile
oder neu geladensource ~/.bashrc
.Nach dem Aufruf in einem Verzeichnis mit einem .git-Verzeichnis werden die entsprechenden Änderungen vorgenommen, um das Repository zu konvertieren. Wenn beim Aufruf kein .git-Verzeichnis vorhanden ist, wird eine FAILURE-Meldung angezeigt und es werden keine Änderungen am Dateisystem vorgenommen.
quelle
Die Methoden zum Entfernen von Dateien und zum Verschieben des .git-Verzeichnisses sind nicht sauber und verwenden nicht die "git" -Methode, um etwas zu tun, das einfach sein sollte. Dies ist die sauberste Methode, die ich gefunden habe, um ein normales Repo in ein nacktes Repo umzuwandeln.
Klonen Sie zuerst / path / to / normal / repo in ein nacktes Repo namens repo.git
Entfernen Sie als Nächstes den Ursprung, der auf / path / to / normal / repo zeigt
Schließlich können Sie Ihr ursprüngliches Repo entfernen. Sie könnten repo.git an diesem Punkt in repo umbenennen, aber die Standardkonvention zur Kennzeichnung eines git-Repositorys ist etwas.git, also würde ich es persönlich so lassen.
Sobald Sie dies alles getan haben, können Sie Ihr neues Bare-Repo klonen (wodurch praktisch ein normales Repo erstellt wird und Sie es auch von Bare in Normal konvertieren würden).
Wenn Sie andere Upstreams haben, sollten Sie diese natürlich notieren und Ihr Bare-Repo aktualisieren, um es einzuschließen. Aber auch hier kann alles mit dem Befehl git erledigt werden. Denken Sie daran, die Manpages sind Ihr Freund.
quelle
.git
Ordners untersuchen. Es ist sehr lehrreich zu lernen, wie die Teile zusammenpassen.Falls Sie ein Repository mit wenigen lokal ausgecheckten Zweigen / refs / Heads / * und wenigen Remote-Zweigstellen-Remotes / origin / * haben UND dies in ein BARE-Repository mit allen Zweigen in / refs / Heads / * konvertieren möchten.
Sie können Folgendes tun, um den Verlauf zu speichern.
quelle
Ich habe das folgende Skript verwendet, um eine Textdatei zu lesen, die eine Liste aller meiner SVN-Repos enthält, und sie in GIT zu konvertieren. Später habe ich git clone --bare verwendet, um sie in ein nacktes Git-Repo zu konvertieren
list.txt hat das Format
und users.txt hat das Format
www-data ist der Benutzer des Apache-Webservers. Zum Übertragen von Änderungen über HTTP ist eine Berechtigung erforderlich
quelle
Hier ist die Definition eines nackten Repositorys aus gitglossary :
Ich bin hier angekommen, weil ich mit einem "lokalen Repository" herumgespielt habe und in der Lage sein wollte, alles zu tun, was ich wollte, als wäre es ein Remote-Repository. Ich habe nur rumgespielt und versucht, etwas über Git zu lernen. Ich gehe davon aus, dass dies die Situation für jeden ist, der diese Antwort lesen möchte.
Ich würde für ein Gutachten lieben oder einige spezifische Gegenbeispiele, jedoch scheint es , dass (nach durch einige git - Quellcode wühlen , dass ich gefunden) einfach in die Datei gehen
.git/config
und Einstellung der Kern Attribut entblößen zu wahren , git lassen Sie tun was auch immer Sie möchten remote mit dem Repository arbeiten. Dh die folgenden Zeilen sollten existieren in.git/config
:(Dies ist ungefähr das, was der Befehl
git config --bool core.bare true
tun wird, was wahrscheinlich empfohlen wird, um kompliziertere Situationen zu behandeln.)Meine Rechtfertigung für diese Behauptung ist, dass es im Git-Quellcode zwei verschiedene Möglichkeiten zu geben scheint, zu testen, ob ein Repo nackt ist oder nicht. Zum einen wird eine globale Variable überprüft
is_bare_repository_cfg
. Dies wird während einer Einrichtungsphase der Ausführung festgelegt und spiegelt den in der.git/config
Datei gefundenen Wert wider . Der andere ist eine Funktionis_bare_repository()
. Hier ist die Definition dieser Funktion:Ich habe nicht die Zeit noch Know - how , das zu sagen mit absoluter Sicherheit, aber soweit ich könnte sagen , wenn Sie das haben
bare
Attribut Satztrue
in.git/config
, soll dies immer wieder zurückkehren1
. Der Rest der Funktion ist wahrscheinlich für die folgende Situation:Ich werde später damit experimentieren, aber dies scheint darauf hinzudeuten, dass das Setzen von core.bare = true dem Entfernen von core.bare aus der Konfigurationsdatei und dem ordnungsgemäßen Einrichten der Verzeichnisse entspricht.
Wenn Sie core.bare = true setzen , können Sie auf jeden Fall darauf zugreifen , aber ich bin mir nicht sicher, ob das Vorhandensein von Projektdateien dazu führen wird, dass einige andere Vorgänge schief gehen. Es ist interessant und ich nehme an, lehrreich, in das Repository zu pushen und zu sehen, was lokal passiert ist (dh ausführen
git status
und die Ergebnisse verstehen).quelle
Zunächst
backup
Ihr bestehendes Repo:Führen Sie zweitens Folgendes aus:
quelle
Oneliner für alle oben genannten Vorgänge:
(Beschuldige mich nicht, wenn etwas explodiert und du keine Backups hattest: P)
quelle
Wow, es ist einfach erstaunlich, wie viele Leute sich darauf eingelassen haben, besonders wenn man bedenkt, dass es nicht so aussieht, als würde kein einziger aufhören zu fragen, warum diese Person tut, was sie tut.
Der EINZIGE Unterschied zwischen einem nackten und einem nicht nackten Git-Repository besteht darin, dass die nicht nackte Version eine Arbeitskopie enthält. Der Hauptgrund, warum Sie ein nacktes Repo benötigen würden, ist, wenn Sie es einem Dritten zur Verfügung stellen möchten, können Sie nicht direkt daran arbeiten, sodass Sie es irgendwann klonen müssen, an welchem Punkt Sie sich befinden gleich wieder zu einer regulären Arbeitskopie.
Um in ein nacktes Repo umzuwandeln, müssen Sie lediglich sicherstellen, dass keine Commits ausstehen, und dann einfach:
Los geht's, nacktes Repo.
quelle
git config core.bare true
.git config core.bare true
, so wie in dieser Antwort .