web-dev-qa-db-ja.com

ローカルからリモートへのgit clone

私たちはワークフローのためにMercurialからGitに移行する過程にあり、2つの小さな問題があります。

まず、ローカルリポジトリを空のリモート(ssh)ディレクトリに直接「クローン」することは可能ですか?

現在、新しいWebサイトを作成するときは、基本的にCMSをローカルで複製し、構成してから、セントラルリポジトリとWebサーバー(hg clone . ssh://account@server/www)に複製します。そうすれば、プッシュ/プルの良さに瞬時にアクセスできます。

これにより、2番目の問題であるリモート展開が発生します。

現在Mercurialを使用しているため、リモートリポジトリには、変更セットを受信したときにhg upを実行する単純なフックがあります。

Gitで同じことをするために、私はここの指示に従いました: http://caiustheory.com/automatically-deploying-website-from-remote-git-repository しかし、私は維持したいと思いますMercurialの場合と同様に、Webサイトのルートにある.gitディレクトリ(Apache構成で保護されており、一部のアカウントに複数のWebサイト/リポジトリがあるため、すべてのアカウントのGIT_DIRをエクスポートできません)。

作業ディレクトリをリポジトリから分離せずに、基本的に同じ設定にすることは可能ですか?

27
hlidotbe

最初の質問に答えるには、はい、できます。リモートディレクトリがssh://user@Host/home/user/repoであるとします。これはgitリポジトリでなければなりません。git init --bareまたはscpを使用してローカルrepo.gitを作成します(git cloneを使用して作成できます)。次に行います:

git remote add Origin ssh://user@Host/home/user/repo
git Push --all Origin

これにより、ローカルに存在するすべてのブランチがリモートリポジトリにプッシュされます。

次の質問に進むには、別のコマンドセットを使用して同じことを実行できるはずです。これらを試してください:

$ 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

もちろん、上記のremote/Pushコマンドを実行しますafterこのステップ。そうした後、特定のブランチをチェックアウトして、サーバー上の「somesite」クローンが実際にどのブランチをたどるかを確認できるようにする必要がある場合があります。それ以降、そのリポジトリにプッシュすると、そのブランチの再チェックアウトがトリガーされます。

39
cdhowie

私も最近この問題に遭遇し、次のように解決しました:

リモートサーバー:

1:/ tmp/bareという名前のディレクトリを作成します
2:そのディレクトリに移動します
3:git init --bareを実行します

ローカルマシン:

1:gitプロジェクトディレクトリに変更します。
2:git remote add bare ssh:// user @ server/tmp/bare
3:git Push --all bare
4:git remote remove bare

リモートサーバー:

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

ローカルマシン:

1:git remote add Origin ssh:// user @ server/path/to/your/clone

これは少し複雑ですが、機能し、奇妙なフラグを設定したり、デフォルトの動作をオーバーライドするようにgitに指示したりする必要はありません。したがって、非常に安全です。

24
OOPMan

この答えは良いですが、うまくいくことができませんでした。このリンクからの次のコードはそうしました http://thelucid.com/2008/12/02/git-setting-up-a-remote-repository-and-doing-an-initial-Push/ 。リモート実行時

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

すでに少なくとも1つのコミットが実行されている既存のリポジトリのローカル

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

これが他の回答で問題があった人を助けることを願っています。

4
AmaDaden

hg clone . ssh://account@server/wwwに相当する最も簡単なgitは次のとおりです。

rsync -avz . ssh://account@server/www/reponame

実際、私はこの行を〜/ .bash_aliasesに追加して、任意のディレクトリをどこにでもミラーリングしています。

alias mirror="rsync -avz . ssh://account@server`pwd` --delete"

もし/ devや/ binのような特別なディレクトリにいると危険だと証明できます。注意してください。

3
presto8

私は同意し、一致しないファイルを削除することでpresto8を改善します。

rsync -avz . ssh://account@server/www/reponame --delete
1
jlettvin

代わりにあなたに与えるために、あなたは使うことができます:

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

これらは、ローカルのgitリポジトリが別のリモートリポジトリを指している場合にも機能します

0
dani24