web-dev-qa-db-ger.com

Wie konvertiere ich ein normales Git-Repository in ein nacktes?

Wie kann ich ein "normales" Git-Repository in ein nacktes konvertieren?

Der Hauptunterschied scheint zu sein:

  • im normalen Git-Repository befindet sich ein Ordner .git im Repository, der alle relevanten Daten und alle anderen Dateien enthält, die Ihre Arbeitskopie erstellen

  • in einem nackten Git-Repository gibt es keine Arbeitskopie, und der Ordner (nennen wir ihn repo.git) enthält die tatsächlichen Repository-Daten

569
Boldewyn

Kurz gesagt: Ersetzen Sie den Inhalt von repo durch den Inhalt von repo/.git, und teilen Sie dem Repository mit, dass es sich nun um ein leeres Repository handelt.

Führen Sie dazu die folgenden Befehle aus:

cd repo
mv .git ../repo.git # renaming just for clarity
cd ..
rm -fr repo
cd repo.git
git config --bool core.bare true

Beachten Sie, dass dies nicht der Fall ist, wenn git clone --bare an einem neuen Speicherort ausgeführt wird (siehe unten).

565
Jörg W Mittag

Ihre Methode scheint zu funktionieren. Die Dateistruktur eines Bare-Repository ist genau das, was sich im .git-Verzeichnis befindet. Ich weiß jedoch nicht, ob eine der Dateien tatsächlich geändert wurde. Wenn dies fehlschlägt, können Sie dies einfach tun

git clone --bare /path/to/repo

Sie müssen es wahrscheinlich in einem anderen Verzeichnis tun, um einen Namenskonflikt zu vermeiden, und dann können Sie es einfach wieder dorthin verschieben, wo Sie möchten. Möglicherweise müssen Sie die Konfigurationsdatei so ändern, dass sie zeigt, wo sich Ihr Origin-Repo befindet.

236
jonescb

Ich denke, der folgende Link wäre hilfreich

GitFaq: Wie mache ich ein vorhandenes nicht-bloßes Repository frei?

$ mv repo/.git repo.git
$ git --git-dir=repo.git config core.bare true
$ rm -rf repo
113
xhh

Sofern Sie keine speziellen Änderungen am Dateisystem vornehmen möchten oder müssen, ist es denkbar einfach, eine nackte Version eines nicht-nackten Repositorys zu erstellen (wie in mehreren anderen Posts hier erwähnt). Es ist Teil der Kernfunktionalität von git:

git clone --bare existing_repo_path bare_repo_path

66
Chip Kaye

Bitte beachten Sie auch zu verwenden

git clone --mirror path_to_source_repository

Aus der Dokumentation :

Richten Sie einen Spiegel des Quellrepositorys ein. Dies impliziert --bar. Im Vergleich zu --bare ordnet --mirror nicht nur lokale Zweige der Quelle lokalen Zweigen des Ziels zu, sondern ordnet auch alle Referenzen (einschließlich Remote-Tracking-Zweige, Notizen usw.) zu und richtet eine Referenzspezifikationskonfiguration ein, bei der alle Referenzen berücksichtigt werden werden durch ein git remote update im zielrepository überschrieben.

12
Jacek Krawczyk

Ich wollte nur auf ein Repository in einem Netzwerkpfad pushen, aber git ließ mich das nicht tun, es sei denn, dieses Repository wurde als leer markiert. Alles was ich brauchte war die Konfiguration zu ändern:

git config --bool core.bare true

Sie müssen nicht mit den Dateien herumspielen, es sei denn, Sie möchten sie sauber halten.

7
Slion

ich habe die Antworten gelesen und das getan:

cd repos
mv .git repos.git
cd repos.git
git config --bool core.bare true # from another answer
cd ../
mv repos.git ../
cd ../
rm -rf repos/ # or delete using a file manager if you like

dies wird den Inhalt von repos/.git als den bloßen repos.git belassen

6
Dan D.

Folgendes ist meiner Meinung nach am sichersten und einfachsten. Es gibt hier nichts, was oben nicht angegeben ist. Ich möchte nur eine Antwort sehen, die eine sichere schrittweise Vorgehensweise zeigt. Sie starten einen Ordner aus dem Repository (Repo), das Sie freigeben möchten. Ich habe die oben implizierte Konvention übernommen, dass Bare-Repository-Ordner die Erweiterung .git haben.

(1) Backup, just in case.
    (a) > mkdir backup
    (b) > cd backup
    (c) > git clone ../repo
(2) Make it bare, then move it
    (a) > cd ../repo
    (b) > git config --bool core.bare true
    (c) > mv .git ../repo.git
(3) Confirm the bare repository works (optional, since we have a backup)
    (a) > cd ..
    (b) > mkdir test
    (c) > cd test
    (d) > git clone ../repo.git
(4) Clean up
    (a) > rm -Rf repo
    (b) (optional) > rm -Rf backup/repo
    (c) (optional) > rm -Rf test/repo
4
sdesciencelover

Einfach lesen

Pro Git Book: 4.2 Git auf dem Server - Git auf einem Server installieren

was sich auszahlt auf

$ git clone --bare my_project my_project.git
Cloning into bare repository 'my_project.git'...
done.

Stellen Sie dann my_project.git auf den Server

Was hauptsächlich ist, welche Antwort # 42 versuchte darauf hinzuweisen. Sicher könnte man das Rad neu erfinden ;-)

4
apos

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 durch einen Aufruf von source ~/.profile oder source ~/.bashrc neu geladen.

function gitToBare() {
  if [ -d ".git" ]; then
    DIR="`pwd`"
    mv .git ..
    rm -fr *
    mv ../.git .
    mv .git/* .
    rmdir .git

    git config --bool core.bare true
    cd ..
    mv "${DIR}" "${DIR}.git"

    printf "[\x1b[32mSUCCESS\x1b[0m] Git repository converted to "
    printf "bare and renamed to\n  ${DIR}.git\n"
    cd "${DIR}.git"
  else
    printf "[\x1b[31mFAILURE\x1b[0m] Cannot find a .git directory\n"
  fi
}

Sobald er in einem Verzeichnis aufgerufen wird, das ein .git-Verzeichnis enthält, nimmt er die entsprechenden Änderungen vor, um das Repository zu konvertieren. Wenn beim Aufrufen kein .git-Verzeichnis vorhanden ist, wird eine FAILURE-Meldung angezeigt, und es werden keine Änderungen am Dateisystem vorgenommen.

3
nyteshade

Falls Sie ein Repository mit wenigen lokal ausgecheckten Filialen/refs/heads/* und wenigen entfernten Filialen/Origin/* haben UND wenn Sie dies in ein BARE-Repository mit allen Filialen in/refs/heads/* konvertieren möchten

sie können folgendermaßen vorgehen, um den Verlauf zu speichern.

  1. erstellen Sie ein nacktes Repository
  2. cD in das lokale Repository, das über lokale Auscheck- und Remote-Zweige verfügt
  3. drücken Sie/path/to/bare/repo + refs/remotes/Origin/: refs/heads /
1
Senthil A Kumar

Die Methoden zum Entfernen von Dateien und zum Herumspielen beim 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 mit dem Namen repo.git

git clone --bare /path/to/normal/repo

Entfernen Sie als Nächstes den Ursprung, der auf/path/to/normal/repo zeigt

cd repo.git
git remote rm Origin

Schließlich können Sie Ihr ursprüngliches Repo entfernen. Sie könnten repo.git an diesem Punkt in repo umbenennen, aber die Standardkonvention zum Bezeichnen eines Git-Repository ist something.git, also würde ich es persönlich so belassen.

Sobald Sie das alles erledigt haben, können Sie Ihr neues Bare-Repo klonen (was in der Tat ein normales Repo erzeugt und wie Sie es auch von Bare in Normal konvertieren würden).

Wenn Sie andere Upstreams haben, möchten Sie diese natürlich notieren und Ihr Bare-Repo aktualisieren, um sie einzuschließen. Aber auch hier kann alles mit dem Befehl git erledigt werden. Denken Sie daran, die Manpages sind Ihr Freund.

1
krux

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 verwende ich git clone --bare, um sie in ein nacktes Git-Repo zu konvertieren

#!/bin/bash
file="list.txt"
while IFS= read -r repo_name
do
 printf '%s\n' "$repo_name"
 Sudo git svn clone --shared --preserve-empty-dirs --authors-file=users.txt file:///programs/svn/$repo_name 
 Sudo git clone --bare /programs/git/$repo_name $repo_name.git
 Sudo chown -R www-data:www-data $repo_name.git
 Sudo rm -rf $repo_name
done <"$file"

list.txt hat das Format

repo1_name
repo2_name

und users.txt hat das Format

(no author) = Prince Rogers <[email protected]>

www-data ist der Benutzer des Apache-Webservers. Für das Pushen von Änderungen über HTTP ist eine Berechtigung erforderlich

0
Pedro Vicente