Wie benutzt man das Repository "git --bare init"?

320

Ich muss ein zentrales Git-Repository erstellen, bin aber etwas verwirrt ...

Ich habe ein nacktes Repository (auf meinem Git-Server, Maschine 2) erstellt mit:

$ mkdir test_repo
$ git --bare init

Jetzt muss ich Dateien von meinem lokalen Repository (Maschine 1) in das nackte Repository (Maschine 2) verschieben. Ich habe Zugriff auf Maschine 2 per SSH. Die Sache ist, dass ich glaube, ich verstehe das Konzept eines nackten Repositorys nicht ...

Was ist der richtige Weg, um meinen Code im nackten Repository zu speichern? Wie kann ich Änderungen von meinem lokalen Repository in das nackte Repository übertragen?

Ist der richtige Weg, ein zentrales Repository zu haben, ein nacktes Repository?

Ich bin ein wenig verwirrt mit diesem Thema. Bitte geben Sie mir einen Hinweis dazu.

André
quelle

Antworten:

391

Um dies zu überprüfen, müssen Sie zunächst in das von Ihnen erstellte Verzeichnis wechseln, bevor Sie es ausführen git init --bare. Es ist auch üblich, nackten Repositorys die Erweiterung zu geben .git. So können Sie tun

git init --bare test_repo.git

Für Git-Versionen <1.8 würden Sie tun

mkdir test_repo.git
cd test_repo.git
git --bare init

Um Ihre späteren Fragen zu beantworten, ist an nackte Repositorys (per Definition) kein Arbeitsbaum angehängt, sodass Sie ihnen nicht einfach Dateien hinzufügen können, wie dies in einem normalen nicht nackten Repository der Fall wäre (z. B. mit git add <file>und einem nachfolgenden Repository) git commit. )

Sie aktualisieren fast immer ein nacktes Repository, indem Sie git pushvon einem anderen Repository darauf zugreifen (verwenden ).

Beachten Sie, dass Sie in diesem Fall zuerst zulassen müssen, dass Personen in Ihr Repository pushen. Wenn Sie drinnen sind test_repo.git, tun Sie es

git config receive.denyCurrentBranch ignore

Community bearbeiten

git init --bare --shared=group

Wie von prasanthv kommentiert, ist dies das, was Sie möchten, wenn Sie dies bei der Arbeit tun, und nicht für ein privates Heimprojekt.

Mark Longair
quelle
7
Sie können auch die --sharedOption hinzufügen, initwenn Sie vorhaben, dass andere Personen zu diesem Repo wechseln. Es fügt automatisch Gruppenschreibberechtigungen zum Repository hinzu - link
prasanthv
17
Ich denke, diese drei Zeilen haben den gleichen Effekt wie diese nur eine: git --bare init test_repo.git Zumindest mit meiner aktuellen Git-Version (1.8.2.2)
Fran Marzoa
1
nützlich, wenn Sie den Unterschied zwischen nackten und nicht nackten Repos stapeln
Guille Acosta
Wie findet Git Sachen, wenn es keinen funktionierenden Baum gibt? Ich dachte, es gibt einen funktionierenden Baum im Git-Objektspeicher, und darauf verweisen die Staging-SHAs und Commits
Akantoword
@akantoword: git speichert alle Informationen zu Commits und Filialen irgendwo. Ein Commit ist wahrscheinlich meistens ein Unterschied zwischen der vorherigen Version der Dateien und der neuen Version. Der Arbeitsbaum ist nur eine Momentaufnahme seines tatsächlichen Inhalts zu einem bestimmten Zeitpunkt. Wie auch immer, mit einem funktionierenden Baum können Sie zwischen Commits und Zweigen hin und her gehen. Sie können sogar einen anderen Arbeitsbaum auschecken, wenn Sie möchten.
user276648
245

Ich füge diese Antwort hinzu, da nach der Ankunft hier (mit derselben Frage) keine der Antworten wirklich alle erforderlichen Schritte beschreibt, die erforderlich sind, um von nichts zu einem vollständig verwendbaren Remote-Repo (nackten Repo) zu gelangen.

Hinweis: In diesem Beispiel werden lokale Pfade für den Speicherort des Bare-Repo verwendet, aber andere Git-Protokolle (wie das vom OP angegebene SSH) sollten einwandfrei funktionieren.

Ich habe versucht, ein paar Notizen für diejenigen hinzuzufügen, die mit Git weniger vertraut sind.

1. Initialisieren Sie das Bare Repo ...

> git init --bare /path/to/bare/repo.git
Initialised empty Git repository in /path/to/bare/repo.git/

Dadurch wird ein Ordner (repo.git) erstellt und mit Git-Dateien gefüllt, die ein Git-Repo darstellen. So wie es aussieht, ist dieses Repo nutzlos - es hat keine Commits und vor allem keine Filialen . Obwohl Sie dieses Repo klonen können, können Sie nicht daraus ziehen.

Als nächstes müssen wir einen Arbeitsordner erstellen. Es gibt verschiedene Möglichkeiten, dies zu tun, je nachdem, ob Sie über vorhandene Dateien verfügen.

2a. Erstellen Sie einen neuen Arbeitsordner (keine vorhandenen Dateien), indem Sie das leere Repo klonen

git clone /path/to/bare/repo.git /path/to/work
Cloning into '/path/to/work'...
warning: You appear to have cloned an empty repository.
done.

Dieser Befehl funktioniert nur, wenn er /path/to/worknicht vorhanden ist oder ein leerer Ordner ist. Beachten Sie die Warnung - zu diesem Zeitpunkt haben Sie noch nichts Nützliches. Wenn Sie cd /path/to/workund laufen git status, erhalten Sie etwas wie:

On branch master

Initial commit

nothing to commit (create/copy files and use "git add" to track)

aber das ist eine Lüge. Sie sind nicht wirklich in der Filiale master(weil git branchnichts zurückgegeben wird) und bisher gibt es keine Commits.

Kopieren / verschieben / erstellen Sie anschließend einige Dateien im Arbeitsordner, fügen Sie sie zu git hinzu und erstellen Sie das erste Commit.

> cd /path/to/work
> echo 123 > afile.txt
> git add .
> git config --local user.name adelphus
> git config --local user.email [email protected]
> git commit -m "added afile"
[master (root-commit) 614ab02] added afile
 1 file changed, 1 insertion(+)
 create mode 100644 afile.txt

Die git configBefehle werden nur benötigt, wenn Sie git noch nicht mitgeteilt haben, wer Sie sind. Beachten Sie, dass beim Ausführen git branchjetzt der masterZweig aufgelistet wird. Führen Sie jetzt aus git status:

On branch master
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

nothing to commit, working directory clean

Dies ist auch irreführend - Upstream ist nicht "gegangen", es wurde nur noch nicht erstellt und git branch --unset-upstreamwird nicht helfen. Aber das ist in Ordnung, jetzt, da wir unser erstes Commit haben, können wir pushen und Master wird auf dem Bare Repo erstellt.

> git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 207 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /path/to/bare/repo.git
 * [new branch]      master -> master

Zu diesem Zeitpunkt verfügen wir über ein voll funktionsfähiges Bare-Repo, das an anderer Stelle in einem Hauptzweig geklont werden kann, sowie über eine lokale Arbeitskopie, die gezogen und verschoben werden kann.

> git pull
Already up-to-date.
> git push origin master
Everything up-to-date

2b. Erstellen eines Arbeitsordners aus vorhandenen Dateien Wenn Sie bereits einen Ordner mit Dateien darin haben (sodass Sie nicht in diesen klonen können), können Sie ein neues Git-Repo initialisieren, ein erstes Commit hinzufügen und es anschließend mit dem Bare-Repo verknüpfen.

> cd /path/to/work_with_stuff
> git init 
Initialised empty Git repository in /path/to/work_with_stuff
> git add .
# add git config stuff if needed
> git commit -m "added stuff"

[master (root-commit) 614ab02] added stuff
 20 files changed, 1431 insertions(+)
 create mode 100644 stuff.txt
...

Zu diesem Zeitpunkt haben wir unser erstes Commit und einen lokalen Hauptzweig, den wir in einen fernverfolgten Upstream-Zweig mit Fernverfolgung verwandeln müssen.

> git remote add origin /path/to/bare/repo.git
> git push -u origin master
Counting objects: 31, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (31/31), done.
Writing objects: 100% (31/31), 43.23 KiB | 0 bytes/s, done.
Total 31 (delta 11), reused 0 (delta 0)
To /path/to/bare/repo.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

Beachten Sie das -uFlag bei git push, um den (neuen) verfolgten Upstream-Zweig zu setzen. Nach wie vor haben wir jetzt ein voll funktionsfähiges Bare-Repo, das an anderer Stelle in einem Hauptzweig geklont werden kann, sowie eine lokale Arbeitskopie, die gezogen und verschoben werden kann.

All dies mag einigen offensichtlich erscheinen, aber Git verwirrt mich im besten Fall (Fehler- und Statusmeldungen müssen wirklich überarbeitet werden) - hoffentlich hilft dies anderen.

Adelphus
quelle
4
Interessant. Sicher detaillierter als meine Antwort. +1
VonC
13
Diese Antwort löst mein Problem und sollte die akzeptierte Antwort sein. Ich hoffe, dass immer mehr Menschen darüber abstimmen können.
Inix
11
Sie sollten Geld für Antworten wie diese verlangen
Arthur Tarasov
2
Als neuer Git-Benutzer war diese Antwort für mich unglaublich hilfreich, danke, dass Sie dies geschrieben haben!
Sidewinderguy
1
Dies ist eine brillante Antwort. Wird unserer Einheit sehr helfen.
Wobsoriano
33

Beantworten Sie Ihre Fragen einzeln:

Das nackte Repository hat keinen funktionierenden Baum . Es bedeutet, dass der gesamte Inhalt dem entspricht, was Sie im .gitVerzeichnis haben.

Sie können commitdas Repository nur entblößen, indem pushSie von Ihrem lokalen Klon darauf zugreifen. Es hat keinen Arbeitsbaum, also keine geänderten Dateien, keine Änderungen.

Um ein zentrales Repository zu haben, ist es nur möglich, ein bareRepository zu haben .

Marcin Gil
quelle
22

Sie können git auch bitten, ein Verzeichnis für Sie zu erstellen:

git init --bare test_repo.git
Serge S.
quelle
20

Die allgemeine Praxis besteht darin, das zentrale Repository, auf das Sie pushen, als nacktes Repo zu haben.

Wenn Sie einen SVN-Hintergrund haben, können Sie ein SVN-Repo mit einem Git-Bare-Repo verknüpfen. Die Dateien im Repo sind nicht in der ursprünglichen Form vorhanden. Während Ihr lokales Repo zusätzlich die Dateien enthält, die Ihren "Code" bilden.

Sie müssen dem Bare Repo von Ihrem lokalen Repo aus eine Fernbedienung hinzufügen und Ihren "Code" darauf übertragen.

Es wird so etwas sein wie:

git remote add central <url> # url will be ssh based for you
git push --all central
Manojlds
quelle
Verwenden Sie git remote add central <url>im Fall von SSH auch den Pfad? zBgit remote add central ssh://user@server/home/user/repo.git
Ja Barry
17

Das sollte reichen:

git remote add origin <url-of-bare-repo>
git push --all origin

Weitere Informationen finden Sie unter " GIT: Wie aktualisiere ich mein Bare Repo? ".
Anmerkungen:

  • Sie können einen anderen Namen als ' origin' für die Bare-Repo-Fernreferenz verwenden.
  • Dadurch werden Ihre Tags nicht verschoben. Sie benötigen dafür eine separate git push --tags origin.
VonC
quelle
5

Es ist schön zu überprüfen, ob der Code, den Sie gepusht haben, tatsächlich festgeschrieben wurde.

Sie können ein Änderungsprotokoll für ein nacktes Repository abrufen, indem Sie den Pfad explizit mit der Option --relative festlegen.

$ cd test_repo
$ git log --relative=/

Dies zeigt Ihnen die festgeschriebenen Änderungen, als wäre dies ein reguläres Git-Repo.

Russell
quelle
5

Basierend auf den Antworten von Mark Longair & Roboprog:

wenn git version> = 1.8

git init --bare --shared=group .git
git config receive.denyCurrentBranch ignore

Oder :

wenn git version <1.8

mkdir .git
cd .git
git init --bare --shared=group 
git config receive.denyCurrentBranch ignore
Jack'
quelle
Dieser Konfigurationsbefehl: Wie wird er auf das gerade erstellte .git-Verzeichnis angewendet?
GreenAsJade
Ich bin nicht sicher, ob ich Ihre Frage verstehe? Können Sie genauer sein? Da Sie Ihr Git-Repository initialisiert haben, können Sie es mit dem Befehl 'git config' beliebig konfigurieren.
Jack
@GreenAsJade Da Sie sich noch im Ordner des Git-Repositorys befinden, gilt dies auch für diesen (die Standardeinstellung der Git-Konfiguration entspricht der Option --local).
BlueCoder
2

Das Flag --bare erstellt ein Repository ohne Arbeitsverzeichnis. Das nackte Repository ist das zentrale Repository, und Sie können hier keine Codes bearbeiten (speichern), um den Zusammenführungsfehler zu vermeiden.

Wenn Sie beispielsweise eine Datei in Ihrem lokalen Repository (Computer 1) hinzufügen und in das Bare-Repository verschieben, wird die Datei im Bare-Repository nicht angezeigt, da sie immer "leer" ist. Sie pushen jedoch wirklich etwas in das Repository und können es unerklärlich sehen, indem Sie ein anderes Repository auf Ihrem Server (Computer 2) klonen.

Sowohl das lokale Repository in Maschine 1 als auch das 'Kopier'-Repository in Maschine 2 sind nicht leer. Beziehung zwischen nackten und nicht bloßen Repositories

Der Blog wird Ihnen helfen, es zu verstehen. https://www.atlassian.com/git/tutorials/setting-up-a-repository

Jie Zhang
quelle
0

Sie können die folgenden Befehle ausführen, um Ihr lokales Repository zu initialisieren

mkdir newProject
cd newProject
touch .gitignore
git init
git add .
git commit -m "Initial Commit"
git remote add origin user@host:~/path_on_server/newProject.git
git push origin master

Sie sollten Ihr Projekt von Ihrem lokalen Repository aus bearbeiten und den Server als zentrales Repository verwenden.

Sie können auch diesem Artikel folgen, in dem alle Aspekte der Erstellung und Pflege eines Git-Repositorys erläutert werden. Git für Anfänger

Sameer Ranjan
quelle