Ich habe ein Bare-Git-Repository, muss aber über ssh auf dessen Inhalt zugreifen und ihn durchsuchen (in einem Dateimanager wie User Experience).
Ich nehme an, ich könnte es klonen:
git clone -l <path_to_bare_repo> <new_normal_repo>
Mein Repository ist jedoch ungefähr 20 GB groß und ich habe nicht den Speicherplatz, um es zu duplizieren. Gibt es eine Möglichkeit, das nackte Repository direkt zu konvertieren, um eine Arbeitskopie zu erhalten?
.git
Verzeichnis verschieben und denbare
Parameter in der Konfiguration auf false setzen, sollte es sich wie ein reguläres Repository verhalten, in dem Sie nurgit checkout
Ihre Dateien abrufen können.git show
undgit cat-file
Antworten:
Hinweis : Ich habe dies in einem sehr einfachen 1-Commit-Repository getestet . Überprüfen Sie dies noch einmal, lesen Sie die Manpages und seien Sie immer froh, dass Sie ein Backup erstellt haben, bevor Sie den Ratschlägen folgen, die Sie auf StackOverflow gefunden haben. (Sie sichern, richtig?)
So konvertieren Sie ein
--bare
Repository in ein nicht nacktes:.git
Ordner in der obersten Ebene Ihres Repositorys.HEAD branches config description hooks info objects refs
usw.) in das.git
soeben erstellte.git config --local --bool core.bare false
diese Option aus, um das lokale Git-Repository in ein nicht nacktes zu konvertieren.master
(oder in welchem Hauptzweig sich auch immer befindet) und alle Ihre Dateien gelöscht und der Löschvorgang inszeniert wird. Das ist normal. Einfach manuell auscheckenmaster
oder agit reset --hard
, und fertig..git/config
Datei hinzufügen Zeilefetch = +refs/heads/*:refs/remotes/origin/*
nachurl = <...>
in[remote "origin"]
Abschnitt. Andernfallsgit fetch
werdenorigin/master
die Zweige anderer Herkunft nicht angezeigt.Diese Schritte sind in der entgegengesetzten Richtung von dieser Frage , „git-convert normal entblößen Repository“ - insbesondere Notiz dieser Antwort , die besagt , dass die obigen Schritte (in, nehme ich an, entweder Richtung) ist verschieden von einem tun
git-clone
. Ich bin mir nicht sicher, ob das für Sie relevant ist, aber Sie haben esgit clone
in der Frage erwähnt.quelle
Ich hatte ein etwas anderes Szenario:
Lösung:
.git
Verzeichnis:git clone --bare https://github.com/user/project .git
git config --local --bool core.bare false
.git
nacktes Repo keine Datei 'index
' enthält.) Damit wird der Indexgit reset HEAD -- .
wiederhergestellt
.git/index
.Ich habe ein nacktes Repo effektiv in ein nicht nacktes verwandelt und dabei den Inhalt beibehalten, den ich zuvor erhalten hatte.
Das vollständige Skript, das ich seit Jahren verwende, umfasst die folgenden Schritte:
Ich akzeptiere jedoch, dass die akzeptierte Lösung (mit dem von ADTC hinzugefügten hilfreichen
git reset
Schritt ) einfacher ist.quelle
.git
Unterordner in einem Arbeitsbaum (von dem Sie wissen, dass er Ihr Repo ist) zu erhalten, der ursprünglich aus einem Archiv (Nicht-Git) erstellt wurde. Ich hätte ein nicht nacktes Repo nicht auschecken können, da der Ordner, in dem ich das Auschecken durchgeführt habe, nicht leer ist. Das Nicht-Baregit clone --no-checkout
in einem Unterordner zu tun, hätte mich gezwungen, die.git
eine Ebene nach oben zu verschieben. Durch einen bloßen Klon konnte ich den.git
Unterordner direkt dort erstellen, wo ich ihn haben wollte. Sie können das Skript hier sehen: github.com/VonC/compileEverything/blob/….git
. Ich bekomme das.git
durch einen nackten Klon, ich verwandle diesen.git
Ordner in einen nicht nackten und mache einengit reset
, um git klar zu machen, dass der Arbeitsbaum bereits da ist. Genau das macht github.com/VonC/compileEverything/blob/… .So vereinfachen und kombinieren Sie die Informationen in den Antworten:
Es gibt drei Unterschiede, die ein nacktes Repo von einem normalen .git-Ordner unterscheiden:
Sie können Ihr Bare-Repo also einfach in den .git-Unterordner eines neuen Ordners verschieben.
Core.bare ändern:
Fügen Sie eine Standard-Ursprungsreferenz hinzu, um dieselben Standardeinstellungen wie gewohnt zu erstellen
git fetch
undgit push
auszuwählen:Und generieren Sie die Indexdatei und den Arbeitsbaum:
Ich empfehle , die Dateien
git checkout
nichtgit reset
zu generieren, falls sie versehentlich an der falschen Stelle eingegeben werden.quelle
Bei der Frage des Originalplakats geht es darum, nicht genügend Platz zu haben, um die Dinge auf einfache Weise zu erledigen. Für diejenigen, die genug Platz haben, ist die Antwort viel einfacher:
quelle
Wenn Sie nur noch wenig Speicherplatz haben, ist das Erweitern des Arbeitsbaums durch Konvertieren in ein normales Repository ein Problem. Sie können jedoch den Inhalt eines Bare-Repos durchsuchen, ohne ihn zu konvertieren. Verwenden Sie dieses
git cat-file -p <commit-sha>
Commit, um den Baum anzuzeigen, auf den es verweist. Verwenden Siegit cat-file -p <blob-sha>
diese Option , um den Inhalt der Datei anzuzeigen, auf die der Blob verweist. Verwenden Sie diesegit show <sha>:path
Option, wenn sha entweder ein Commit oder ein Baum ist, um den Inhalt des Blobs im Pfad anzuzeigen.quelle
cd
in nacktes Repo und tun(gibt dir reguläres Git Repo mit dem Namen X)
quelle
Wenn es Ihnen nichts ausmacht, an einem anderen Arbeitsbaum zu arbeiten, dann
Bitte beachten Sie, dass dies kein Klon ist.
quelle
Push-to-Deploy
Anstatt die nackte Fernbedienung in ein Standard-Repository zu konvertieren, können Sie das Post-Receive-Skript im Hooks-Verzeichnis verwenden, um das Repository in ein Bereitstellungsverzeichnis zu erweitern.
Hier ist ein gutes Beispiel für die Einrichtung von Push-to-Deploy
Zur Vereinfachung der Bezugnahme ist dies das Beispiel für den Skriptinhalt über den obigen Link. Es werden nur Pushs vom Zweig "master" in ein Verzeichnis mit dem Namen "deploy" bereitgestellt, das sich auf derselben Ebene befindet wie das übergeordnete Verzeichnis des Repositorys:
quelle