2010-11-10 10 views
22

Wir sind bei der Migration von Mercurial zu Git für unseren Workflow und ich habe zwei kleinere Probleme.git Klon von lokal nach remote

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

Derzeit, wenn wir eine neue Website erstellen, klonen wir im Grunde unser CMS lokal, konfigurieren es und dann klonen wir es 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.

Dies bringt mich zu der zweiten Ausgabe, Remote-Bereitstellung.

Derzeit mit Mercurial, ich habe eine einfache Haken in den Remote-Repos, die hg up ausführen, wenn ein Changeset empfangen wird.

Um das gleiche mit Git zu tun, habe ich die Anweisungen hier folgen: http://caiustheory.com/automatically-deploying-website-from-remote-git-repository aber ich würde gerne das .git-Verzeichnis in der Website root wie es bei Mercurial (es ist durch Apache Config geschützt und ich kann Exportieren Sie GIT_DIR nicht für alle Konten, da einige mehr als eine Website/Repos haben.

Ist es möglich, die gleiche Konfiguration zu haben, ohne das Arbeitsverzeichnis von den Repos zu trennen?

Antwort

31

Um Ihre erste Frage zu beantworten, ja, können Sie. Angenommen, das entfernte Verzeichnis lautet ssh://[email protected]/home/user/repo. Dies muss ein Git Repository sein, erstellen Sie das mit git init --bare oder scp Ihre lokale repo.git (kann mit git clone erstellt werden) Verzeichnis zu remote. Dann tun:

git remote add origin ssh://[email protected]/home/user/repo 
git push --all origin 

Dies wird alle lokal vorhandenen Zweige an das Remote-Repository schieben.

Um zu Ihrer nächsten Frage zu gelangen, sollten Sie dasselbe mit einem anderen Befehlssatz tun können. Versuchen Sie 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äre natürlich, führen Sie die remote/Push-Befehle über nach dieser Schritt. Möglicherweise müssen Sie anschließend einen bestimmten Zweig auschecken, damit der Klotz "somesite" auf dem Server tatsächlich weiß, welchem ​​Zweig er folgen soll. Von diesem Zeitpunkt an sollte das Pushing zu diesem Repository einen erneuten Checkout dieses Zweiges auslösen.

+0

als Ergänzung zu einem anderen Remote-Repository zeigen wird, auf dem „git push ", ich bin es gewohnt, den Zweig zu spezifizieren, auf den ich drücke. So wird deine Push-Anweisung in meinem Fall lesen "git push --all Herkunft Master" – iGbanam

+0

Wenn Sie das tun möchten, nehmen Sie die --all oder Git wird sie alle sowieso schieben. :) – cdhowie

+0

Danke für die Antwort. Der erste Teil funktioniert gut, obwohl ich eine Warnung bekomme, den aktuellen Zweig beim Drücken zu aktualisieren (auf einem leeren Repo, der weggeht). Für den zweiten Teil vermisse ich vielleicht etwas. Nach "git init" musste ich in .git gehen, sonst würde die update-server-info nicht funktionieren. Danach scheinen die Post-Receive-Hooks zu funktionieren, aber sie entfernen keine Dateien, sondern markieren sie nur untracked (hg update bringt mich in den richtigen Zustand, wenn es auf der Fernbedienung keine Änderungen gab). – hlidotbe

4

Diese Antwort ist gut, aber ich konnte es nicht für mich arbeiten. Der folgende Code von diesem Link hat http://thelucid.com/2008/12/02/git-setting-up-a-remote-repository-and-doing-an-initial-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 auf einem vorhandenen Repository, das bereits mindestens einen hat commit

git remote add origin [email protected]:my_project.git 
git push -u origin master 

betreibe ich hoffe, dass dies jemand hilft, die Probleme mit der anderen Antwort.

2

Easiest git entspricht hg clone . ssh://[email protected]/www ist:

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

In der Tat, ich habe hinzugefügt, um diese Linie zu ~ /.bash_aliases überall ein beliebiges Verzeichnis spiegeln:

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

Es könnte gefährlich sein, wenn Sie in einem speziellen Verzeichnis wie/dev oder/sind passieren. Seien Sie vorsichtig.

22

Ich lief auch in dieser Ausgabe vor kurzem und löste es wie folgt:

auf Remote-Server:

1: Erstellen Sie ein Verzeichnis mit dem Namen/tmp/nackten
2: Wechseln Sie in das Verzeichnis
3 Führen Sie git init

auf dem lokalen Rechner --bare:

1: wechseln Sie zu Ihrem git Projektverzeichnis
2: git remote blank ssh hinzufügen: // user @ server/tmp/blank
3: git push --all
nackten 4: git remote blank

auf Remote-Server entfernen:

1 : git clone/tmp/blank/path/to/your/Klon

auf dem lokalen Rechner:

1: git remote Herkunft ssh hinzufügen: // user @ server/path/to/your/Klon

Dies ist ein wenig beteiligt, aber es funktioniert und erfordert keine seltsamen Flags oder Anweisung an Git, seine Standardverhalten zu überschreiben. Es ist daher ziemlich sicher.

+0

Da Sie angegeben haben, dass dies * sicher * ist, habe ich es versucht. Es sieht so aus, als ob es funktioniert (für mich). –

+0

Dieser arbeitete mit mir ... –

1

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

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

Nur um Ihnen eine Alternative zu geben, können Sie verwenden:

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

Dies auch, wenn Ihre lokale git respository