387 Stimmen

Wie verwenden Sie das Repository "git --bare init"?

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

Ich habe eine bloße Repository (in meinem Git-Server, Maschine 2) mit erstellt:

$ mkdir test_repo
$ git --bare init

Jetzt muss ich Dateien aus meinem lokalen Repository (Rechner 1) in das Bare Repository (Rechner 2) übertragen. Ich habe per SSH Zugriff auf Rechner 2. Die Sache ist die, dass ich das Konzept eines Bare Repositorys nicht verstehe...

Wie speichere ich meinen Code am besten im Bare Repository? Wie kann ich Änderungen aus meinem lokalen Repository in das Bare Repository übertragen?

Ist es richtig, ein zentrales Repository zu haben, wenn man ein reines Repository hat?

Ich bin bei diesem Thema etwas verwirrt. Bitte geben Sie mir einen Hinweis dazu.

463voto

Mark Longair Punkte 412179

Zunächst müssen Sie zur Kontrolle in das Verzeichnis wechseln, das Sie erstellt haben, bevor Sie git init --bare . Außerdem ist es üblich, bloße Repositories mit der Erweiterung .git . Sie können also tun

git init --bare test_repo.git

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

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

Um Ihre späteren Fragen zu beantworten: Bare Repositories haben (per Definition) keinen Arbeitsbaum, so dass Sie ihnen nicht einfach Dateien hinzufügen können, wie Sie es bei einem normalen, nicht-barem Repository tun würden (z.B. mit git add <file> und eine anschließende git commit .)

Sie aktualisieren ein Bare Repository fast immer, indem Sie es pushen (mit git push ) aus einem anderen Repository.

Beachten Sie, dass Sie in diesem Fall zuerst den Leuten erlauben müssen, in Ihr Repository zu pushen. Wenn innerhalb test_repo.git tun

git config receive.denyCurrentBranch ignore

Gemeinschaft bearbeiten

git init --bare --shared=group

Wie von prasanthv angemerkt, ist dies genau das Richtige, wenn Sie dies am Arbeitsplatz und nicht für ein privates Projekt zu Hause tun.

315voto

adelphus Punkte 9668

Ich füge diese Antwort hinzu, weil, nachdem ich hier angekommen bin (mit der gleichen Frage), keine der Antworten wirklich alle erforderlichen Schritte beschreibt, die notwendig sind, um von nichts zu einem voll nutzbaren Remote (bare) Repo zu kommen.

Hinweis: In diesem Beispiel werden lokale Pfade für den Speicherort des bloßen Projektarchivs verwendet, aber andere Git-Protokolle (wie das vom Auftraggeber angegebene SSH) sollten problemlos funktionieren.

Ich habe versucht, für diejenigen, die mit Git nicht so vertraut sind, einige Anmerkungen hinzuzufügen.

1. Initialisieren Sie das bloße 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-Repository darstellen. Im jetzigen Zustand ist dieses Repo nutzlos - es hat keine Commits und, was noch wichtiger ist, keine Zweige . Obwohl Sie dieses Repository klonen können, können Sie nicht von ihm ziehen.

Als nächstes müssen wir einen Arbeitsordner erstellen. Dazu gibt es mehrere Möglichkeiten, je nachdem, ob Sie bereits Dateien haben.

2a. Erstellen Sie einen neuen Arbeitsordner (ohne vorhandene Dateien), indem Sie das leere Projektarchiv 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 /path/to/work nicht existiert oder ein leerer Ordner ist. Beachten Sie die Warnung - in diesem Stadium haben Sie noch nichts Brauchbares. Wenn Sie cd /path/to/work und 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 auf dem Zweig master (weil git branch gibt nichts zurück) und bisher gibt es keine Übertragungen.

Als Nächstes kopieren/verschieben/erstellen Sie einige Dateien im Arbeitsordner, fügen Sie sie zu git hinzu und erstellen Sie den ersten Commit.

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

En git config Befehle werden nur benötigt, wenn Sie Git nicht bereits mitgeteilt haben, wer Sie sind. Beachten Sie, dass Sie, wenn Sie jetzt den Befehl git branch sehen Sie nun die master Branche aufgeführt. Führen Sie nun 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 ebenfalls irreführend - der Upstream ist nicht "weg", er wurde nur noch nicht erstellt und git branch --unset-upstream wird nicht helfen. Aber das ist OK, jetzt, wo wir unseren ersten 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

An diesem Punkt haben wir ein voll funktionsfähiges Bare Repo, das an anderer Stelle auf einen Master-Branch geklont werden kann, sowie eine lokale Arbeitskopie, die Pull und Push 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 (so dass Sie nicht in diesen klonen können), können Sie ein neues Git-Repositorium initialisieren, eine erste Übergabe hinzufügen und es anschließend mit dem bloßen 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
...

An diesem Punkt haben wir unseren ersten Commit und einen lokalen Master-Zweig, den wir in einen Upstream-Zweig mit Remote-Tracking 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 die -u Flagge bei Git-Push, um den (neuen) verfolgten Upstream-Zweig zu setzen. Wie zuvor haben wir nun ein voll funktionsfähiges Bare Repo, das an anderer Stelle auf einen Master-Branch geklont werden kann, sowie eine lokale Arbeitskopie, die Pull und Push kann.

All dies mag für einige offensichtlich erscheinen, aber Git verwirrt mich zu den besten Zeiten (seine Fehler- und Statusmeldungen müssen wirklich überarbeitet werden) - hoffentlich wird dies anderen helfen.

35voto

Marcin Gil Punkte 65334

Ich beantworte Ihre Fragen eine nach der anderen:

Das Bare Repository ist dasjenige, in dem kein funktionierender Baum . Das bedeutet, dass sein gesamter Inhalt das ist, was Sie in .git Verzeichnis.

Sie können nur commit zum bloßen Repository durch push von Ihrem lokalen Klon aus aufrufen. Er hat keinen Arbeitsbaum, also keine modifizierten Dateien, keine Änderungen.

Die einzige Möglichkeit, ein zentrales Repository zu haben, besteht darin, ein bare Repository.

23voto

Serge S. Punkte 4635

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

git init --bare test_repo.git

20voto

manojlds Punkte 273771

In der Regel wird das zentrale Repository, in das Sie pushen, als Bare-Repo angelegt.

Wenn Sie über SVN-Kenntnisse verfügen, können Sie ein SVN-Repository mit einem Git-Bare-Repo verknüpfen. Die Dateien im Repository sind nicht in der ursprünglichen Form vorhanden. Ihr lokales Repository hingegen enthält zusätzlich die Dateien, die Ihren "Code" bilden.

Sie müssen ein Remote zum Bare Repo von Ihrem lokalen Repo hinzufügen und Ihren "Code" dorthin pushen.

Sie wird etwa so lauten:

git remote add central <url> # url will be ssh based for you
git push --all central

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X