webentwicklung-frage-antwort-db.com.de

git klon von lokal nach fern

Wir sind gerade dabei, von Mercurial zu Git für unseren Workflow zu migrieren, und ich habe zwei kleinere Probleme.

Ist es erstens möglich, ein lokales Repository direkt in ein leeres Remote-Verzeichnis (ssh) zu "klonen"?

Wenn wir derzeit eine neue Website erstellen, klonen wir unser CMS im Wesentlichen lokal, konfigurieren es und klonen es anschließend auf dem zentralen Repo und auf dem Webserver (hg clone . ssh://[email protected]/www). Auf diese Weise haben wir sofortigen Zugriff auf Push/Pull-Güte. 

Damit komme ich zum zweiten Problem, der Remote-Bereitstellung.

Derzeit habe ich bei Mercurial einen einfachen Haken in den Remote-Repos, der hg up ausführt, wenn ein Changeset empfangen wird.

Um das gleiche mit Git zu machen, habe ich die Anweisungen hier befolgt: http://caiustheory.com/automatically-deploying-website-from-remote-git-repository , aber ich möchte das .git-Verzeichnis behalten Im Website-Root wie bei Mercurial (es ist durch die Apache-Konfiguration geschützt und ich kann GIT_DIR nicht für alle Konten exportieren, da einige mehr als eine Website/Repos haben).

Ist es möglich, im Grunde das gleiche Setup zu haben, ohne das Arbeitsverzeichnis von den Repos zu trennen?

26
hlidotbe

Um Ihre erste Frage zu beantworten, können Sie ja. Angenommen, das entfernte Verzeichnis ist ssh://[email protected]/home/user/repo. Dies muss ein git-Repository sein. Erstellen Sie dieses mit git init --bare oder scp Ihrem lokalen repo.git (kann mit git clone) im Remote-Verzeichnis erstellt werden. Dann mach:

git remote add Origin ssh://[email protected]/home/user/repo
git Push --all Origin

Dadurch werden alle lokal vorhandenen Zweigstellen in das entfernte Repository verschoben.

Um zu Ihrer nächsten Frage zu gelangen, sollten Sie dasselbe tun können, indem Sie einen anderen Befehlssatz verwenden. Probiere diese:

$ cd /var/www  # or wherever
$ mkdir somesite
$ cd somesite/
$ git init
$ git --bare update-server-info
$ git config receive.denycurrentbranch ignore
$ cat > hooks/post-receive
#!/bin/sh
git checkout -f
^D
$ chmod +x hooks/post-receive

Sie würden natürlich die Remote/Push-Befehle über after this ausführen. Möglicherweise müssen Sie danach einen bestimmten Zweig auschecken, damit der "somesite" -Klone auf dem Server tatsächlich weiß, welcher Zweig folgen soll. Von da an sollte ein Push auf dieses Repository eine erneute Überprüfung dieses Zweiges auslösen.

37
cdhowie

Ich bin kürzlich auch auf dieses Problem gestoßen und habe es wie folgt gelöst:

Auf Remote-Server:

1: Erstellen Sie ein Verzeichnis mit dem Namen/tmp/bare
2: Wechseln Sie in dieses Verzeichnis
3: Führen Sie git init --bare aus

Auf lokaler Maschine:

1: Wechseln Sie in Ihr Git-Projektverzeichnis
2: git remote add blare ssh: // user @ server/tmp/bare
3: git Push - alle nackt
4: git remote bloße entfernen

Auf Remote-Server:

1: git clone/tmp/bare/path/zu/your/clone

Auf lokaler Maschine:

1: git remote fügt Origin ssh: // Benutzer @ Server/Pfad/zu/Ihrem/Klon hinzu

Dies ist ein wenig kompliziert, aber es funktioniert und erfordert nicht, dass irgendwelche seltsamen Flags gesetzt werden oder git angewiesen wird, sein Standardverhalten zu überschreiben. Es ist also ziemlich sicher.

23
OOPMan

Diese Antwort ist gut, aber ich konnte sie nicht für mich arbeiten lassen. Der folgende Code aus diesem Link hat http://thelucid.com/2008/12/02/git-setting-up-a-remote-repository-and-doing-aninitial-Push/ . Auf dem Remote-Lauf

mkdir my_project.git
cd my_project.git
git init --bare
git-update-server-info # If planning to serve via HTTP

Lokal in einem vorhandenen Repository, für das bereits mindestens ein Commit ausgeführt wurde

git remote add Origin [email protected]:my_project.git
git Push -u Origin master

Ich hoffe, das hilft jedem, der Probleme mit der anderen Antwort hatte.

4
AmaDaden

Das einfachste git-Äquivalent zu hg clone . ssh://[email protected]/www ist:

rsync -avz . ssh://[email protected]/www/reponame

Ich habe diese Zeile zu ~/.bash_aliases hinzugefügt, um jedes Verzeichnis irgendwo zu spiegeln:

alias mirror="rsync -avz . ssh://[email protected]`pwd` --delete"

Es kann gefährlich werden, wenn Sie sich in einem speziellen Verzeichnis wie/dev oder /bin befinden.

3
presto8

Ich stimme zu und verbessere presto8 durch das Löschen nicht übereinstimmender Dateien.

rsync -avz . ssh://[email protected]/www/reponame --delete
1
jlettvin

Um Ihnen eine Alternative zu geben, können Sie Folgendes verwenden:

git remote set-url Origin git://other.url.here

Diese funktionieren auch, wenn Ihr lokales Git-Respository auf ein anderes Remote-Repository verweist

0
dani24