git clone从local到remote

时间:2010-11-10 09:27:48

标签: git ssh deployment remote-server

我们正在从Mercurial迁移到Git以进行工作流程,我有两个小问题。

首先,是否可以将本地存储库直接“克隆”到空的远程(ssh)目录中?

目前,当我们创建一个新网站时,我们基本上在本地克隆我们的CMS,配置它,然后我们在中央存储库和网络服务器(hg clone . ssh://account@server/www)上克隆它。这样我们就可以即时访问推/拉优势。

这让我想到了第二个问题,即远程部署。

目前使用Mercurial,我在远程仓库中有一个简单的钩子,当收到变更集时,它会执行hg up

为了对Git做同样的事情,我按照这里的说明进行了操作:http://caiustheory.com/automatically-deploying-website-from-remote-git-repository但是我想将.git目录保存在网站根目录中,就像Mercurial一样(它受Apache配置保护)并且我无法为所有帐户导出GIT_DIR,因为有些帐户有多个网站/存储库。

是否可以在不将工作目录与回购分离的情况下进行基本相同的设置?

6 个答案:

答案 0 :(得分:39)

要回答你的第一个问题,是的,你可以。假设远程目录是ssh://user@host/home/user/repo。这必须是一个git存储库,使用git init --barescp将您的本地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

当然,您将在此步骤之后运行上方的远程/推送命令。您可能必须在执行此操作后签出特定分支,以便服务器上的“somesite”克隆实际知道要遵循哪个分支。从那时起,推送到该存储库应该会触发重新检查该分支。

答案 1 :(得分:23)

我最近也遇到过这个问题并按如下方式解决了这个问题:

在远程服务器上:

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覆盖其默认行为。因此非常安全。

答案 2 :(得分:4)

这个答案很好,但我无法让它为我工作。此链接中的以下代码执行了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

本地存在于已经至少有一次提交运行的现有存储库

git remote add origin git@example.com:my_project.git
git push -u origin master

我希望这可以帮助那些对另一个答案有疑问的人。

答案 3 :(得分:3)

相当于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这样的特殊目录,这可能会很危险。 小心。

答案 4 :(得分:1)

我同意并通过删除不匹配的文件来改进presto8。

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

答案 5 :(得分:0)

只是为了给你一个替代方案,你可以使用:

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

如果您的本地git存储库指向另一个远程存储库

,这些也可以工作