2010-11-10 138 views
22

我们正在从Mercurial迁移到Git来处理我们的工作流程,我有两个小问题。从本地到远程的git克隆

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

目前,当我们创建一个新网站时,我们基本上在本地克隆我们的CMS,对其进行配置,然后将其克隆在中央仓库和网络服务器(hg clone . ssh://[email protected]/www)上。这样我们可以即时获得推/拉的好处。

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

目前与Mercurial,我有一个简单的挂钩在远程回购,执行hg up收到变更时收到。

要做同样的Git我按照这里的说明:http://caiustheory.com/automatically-deploying-website-from-remote-git-repository但我想保持.git目录在网站的根,因为它是与Mercurial的情况下(它受Apache配置保护,我可以对于所有账户都不会出口GIT_DIR,因为有些账户拥有多个网站/回购站)。

是否有可能有基本相同的设置没有分离工作目录从回购?

回答

31

要回答你的第一个问题,是的,你可以。假设远程目录是ssh://[email protected]/home/user/repo。这必须是一个git仓库,用git init --barescp将你的本地repo.git(可以用git clone创建)目录创建为远程。然后执行:

git remote add origin ssh://[email protected]/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”克隆实际知道要遵循哪个分支。从此以后,推送到该存储库应该会触发该分支的重新签出。

+0

作为此外,在“混帐推“,我习惯于指定我推到的分支。所以你的push语句在我的情况下会变成“git push --all origin master” – iGbanam 2010-11-10 09:46:35

+0

如果你想这么做的话,取出--all或者git会将它们全部推回去。 :) – cdhowie 2010-11-10 09:47:42

+0

感谢您的答案。第一部分工作正常,虽然我在推送时更新当前分支的警告(在裸露的回购消失时)。对于第二部分,我可能会错过一些东西。在“git init”之后,我不得不进入.git,否则update-server-info将无法工作。之后,后接收挂钩似乎工作,但不删除文件,只标记他们未跟踪(如果远程没有更改,hg更新会使我处于正确的状态)。 – hlidotbe 2010-11-10 10:45:33

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 [email protected]:my_project.git 
git push -u origin master 

我希望这可以帮助任何人曾与对方的回答问题。

2

最简单的GIT中相当于hg clone . ssh://[email protected]/www是:

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

事实上,我已经加入此行〜/bash_aliases镜像任何地方的任何目录:

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

,如果你碰巧在像/ dev或/ bin中一个特殊的目录它可能证明是危险的。 小心点。

22

我也遇到了这个问题,最近,解决它,如下所示:

在远程服务器:

1:创建一个名为目录的/ tmp /裸
2:更改到该目录
3 :执行git的初始化--bare

在本地机器上:

1:更改为您的Git项目目录
2:远程的git添加裸SSH://用户@服务器的/ tmp /裸
3:git的推--all裸
4:远程的git除去裸露

在远程服务器:

1 :混帐克隆的/ tmp /裸/路径/到/你/克隆

在本地机器上:

1:远程Git添加初始的ssh://用户名@服务器/路径/到/你/克隆

这是有点涉及,但它的工作原理并不需要设置任何奇怪的标志或指示git覆盖其默认行为。因此非常安全。

+0

既然你说这是*安全*,我试了一下。它看起来很有效(对我来说)。 – 2013-11-22 13:32:51

+0

这一个与我合作... – 2014-11-29 23:57:39

1

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

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

只给你一个选择,你可以使用:

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

这些也行,如果你的本地的git程序存储库指向到另一个远程仓库,