it-swarm.com.de

Wie kann ich ein Bare-Git-Repository in ein normales Repository konvertieren?

Ich habe ein nacktes Git-Repository, muss aber über ssh (in einem Dateimanager wie User Experience) auf den Inhalt zugreifen und ihn durchsuchen.

Ich vermute, ich könnte es klonen:

git clone -l <path_to_bare_repo> <new_normal_repo>

Mein Repository hat jedoch eine Größe von etwa 20 GB und ich habe nicht genügend Speicherplatz, um es zu kopieren. Gibt es eine Möglichkeit, das nackte Repository direkt in eine Arbeitskopie zu konvertieren?

64
nyi

Note: Ich habe dies auf einem sehr einfachen 1-Commit-Repository getestet. Überprüfen Sie dies nochmals, lesen Sie die man-Seiten und freuen Sie sich, dass Sie eine Sicherungskopie erstellt haben, bevor Sie die Ratschläge befolgen, die Sie bei StackOverflow gefunden haben. (Sie sichern, richtig?)

So konvertieren Sie ein --bare-Repository in ein nicht-bloßes:

  1. Erstellen Sie einen .git-Ordner auf der obersten Ebene Ihres Repositorys. 
  2. Verschieben Sie die Elemente der Repository-Verwaltung (HEAD branches config description hooks info objects refs usw.) in den soeben erstellten .git
  3. Führen Sie git config --local --bool core.bare false aus, um das lokale Git-Repository in non-bare zu konvertieren. 
  4. (per Kommentar von Tamás Pap ) Nach Schritt # 3 werden Sie sehen, dass Sie sich in Zweig master befinden (oder was auch immer Ihr Hauptzweig ist) und alle Ihre Dateien werden gelöscht und die Löschung wird durchgeführt. Das ist normal. Einfach manuell master auschecken oder einen git reset --hard ausführen, und schon sind Sie fertig.
  5. (zur Behebung des von Royi gemeldeten Problems) Editieren der .git/config-Datei, die die Zeile fetch = +refs/heads/*:refs/remotes/Origin/* hinter url = <...> im Abschnitt [remote "Origin"] hinzufügt. Andernfalls sieht git fetch nicht Origin/master und andere Zweigstellen von Origin.

Diese Schritte sind in die entgegengesetzte Richtung von diese Frage , "git-convert normal in bare repository" - insbesondere beachten Sie diese Antwort , die besagt, dass die obigen Schritte (in, ich nehme an, in beide Richtungen) ist anders als ein git-clone. Nicht sicher, ob das für Sie relevant ist, aber Sie haben git clone in der Frage erwähnt. 

90
simont

Ich hatte ein etwas anderes Szenario:

Lösung:

  • klonen Sie ein nacktes Repo in diesem Inhalt in einem .git-Verzeichnis:
    git clone --bare https://github.com/user/project .git
  • Markiere es als nicht nacktes Repo:
    git config --local --bool core.bare false
  • setzen Sie den Index zurück (andernfalls wird angenommen, dass alles gelöscht wurde, da ein .gitbare - Repo keine Datei 'index' enthält.)
    git reset HEAD -- .
    Dadurch wird der .git/index wiederhergestellt.

Ich habe ein nacktes Repo effektiv in ein nicht-nacktes Repo verwandelt, während der Inhalt, den ich zuvor hatte, erhalten blieb.
Das vollständige Skript , das ich seit Jahren verwende, umfasst die folgenden Schritte:

cd /path/to/current/worktree

# That creates a .git directly at the right place
git clone --bare /url/of/repo .git

# restore the link between the local repo and its upstream remote repo
git config --local --bool core.bare false
git config --local remote.Origin.fetch +refs/heads/*:refs/remotes/Origin/*
git fetch Origin
git branch -u Origin/master master

# reset the index (not the working tree)
git reset HEAD -- .

Aber ich finde das akzeptierte Lösung (mit dem hilfreichen git reset Schritt hinzugefügt durch ADTC ) einfacher ist. 

15
VonC

Vereinfachen und kombinieren Sie die Informationen in den Antworten:

Es gibt zwei Unterschiede, die ein nacktes Repo von einem normalen .git-Ordner unterscheiden:

  • core.bare ist in der Konfigurationsdatei auf true gesetzt
  • indexdatei und Arbeitsbaum sind nicht vorhanden

Sie können also einfach Ihr nacktes Repo in den .git-Unterordner eines neuen Ordners verschieben.

mkdir clone
mv bare.git clone/.git

Core.bare ändern:

cd clone
git config --local --bool core.bare false

Und generiere die Indexdatei und den Arbeitsbaum:

git checkout master

Ich empfehle git checkout anstelle von git reset, um die Dateien zu generieren, falls sie versehentlich an der falschen Stelle eingegeben werden.

9
fuzzyTew

Wenn Sie nicht über ausreichend Speicherplatz verfügen, ist das Erweitern des Arbeitsbaums durch Konvertieren in ein normales Repository ein Problem. Sie können jedoch den Inhalt eines reinen Repos durchsuchen, ohne ihn zu konvertieren. Verwenden Sie git cat-file -p <commit-sha> für jedes Commit, um den Baum anzuzeigen, auf den es verweist. Verwenden Sie git cat-file -p <blob-sha>, um den Inhalt der Datei anzuzeigen, auf die der Blob verweist. Verwenden Sie git show <sha>:path, wobei sha entweder ein Commit oder ein Baum ist, um den Inhalt des Blobs im Pfad anzuzeigen. 

6
William Pursell

Die Frage des ursprünglichen Posters ist, dass nicht genügend Platz vorhanden ist, um die Dinge auf einfache Weise auszuführen. Für diejenigen, die genug Platz haben, ist die Antwort viel einfacher:

git clone foo.git foo
5
sarnold

Wenn es Ihnen nichts ausmacht, an einem anderen Arbeitsbaum zu arbeiten, dann

git worktree add ../repo2
cd ..
git status # now works fine

Bitte beachten Sie, dass dies kein Klon ist.

1
Boaz Nahum

cd in nacktes repo und machen 

git config core.bare false

git reset --hard

oder 

git clone X.git X (gibt dir ein regelmäßiges Git-Repo namens X) 

0
nPcomp

Push-to-Deploy

Anstatt das Bare-Remote 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 Referenz ist dies das Skriptinhalt-Beispiel aus dem obigen Link. Es werden nur Push-Vorgänge vom "master" -Zweig in ein Verzeichnis namens "deploy" implementiert, das sich auf derselben Ebene wie das übergeordnete Verzeichnis des Repositorys befindet:

#!/usr/bin/env Ruby
# post-receive

# 1. Read STDIN (Format: "from_commit to_commit branch_name")
from, to, branch = ARGF.read.split " "

# 2. Only deploy if master branch was pushed
if (branch =~ /master$/) == nil
    puts "Received branch #{branch}, not deploying."
    exit
end

# 3. Copy files to deploy directory
deploy_to_dir = File.expand_path('../deploy')
`GIT_WORK_TREE="#{deploy_to_dir}" git checkout -f master`
puts "DEPLOY: master(#{to}) copied to '#{deploy_to_dir}'"
0
Isaac Brown