从本地克隆到远程的Git操作

40
我们正在从Mercurial转换为Git以用于我们的工作流程,我有两个小问题。
首先,是否可以将本地存储库“克隆”直接到一个空的远程(ssh)目录中?
当前情况是,当我们创建一个新网站时,我们基本上在本地克隆我们的CMS,对其进行配置,然后我们在中央repo和Web服务器上克隆它(hg clone . ssh://account@server/www)。这样我们就能立即访问推送/拉取等好处。
这就带来了第二个问题:远程部署。
目前使用Mercurial,在远程repo中我有一个简单的hook会在接收到changeset时执行hg up
为了在Git中达到同样的目的,我按照这里的说明进行操作:http://caiustheory.com/automatically-deploying-website-from-remote-git-repository,但是我想保留.git目录在网站根目录中,就像Mercurial一样(它由Apache配置文件保护,我无法为所有账户导出GIT_DIR,因为有些账户有多个网站/repos)。
是否可以拥有基本相同的设置而不将工作目录与repos分开?

你需要在ssh服务器上创建一个裸仓库和一个git钩子,以便能够从本地推送代码:https://bobbelderbos.com/2012/03/push-code-remote-web-server-git/ - Carlos H. Mendoza-Cardenas
6个回答

46

回答您的第一个问题,是的,您可以。假设远程目录是ssh://user@host/home/user/repo。这必须是一个git仓库,使用git init --bare创建或者用git clone创建本地repo.git目录并使用scp命令复制到远程。然后执行:

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"克隆实际上知道要跟随哪个分支。从那时起,向该存储库推送应触发重新检出该分支。


如果你想这样做,请去掉--all,否则git会把它们全部推送。 :) - cdhowie
尝试在钩子脚本中的检出后添加“git clean -fd”。请注意,这将删除所有未跟踪的文件,而不匹配.gitignore模式,因此请确保适当地忽略任何服务器配置文件,如果您想要保留它们。 - cdhowie
@cdhowie: 如果我只有服务器的Shell访问权限怎么办? 我无法checkout吗? - user2284570
你是否忘记了 1# git add . 和 2# git commit? - Asher
@Asher 不,我没有。 - cdhowie
显示剩余6条评论

29

最近我也遇到了这个问题,解决方法如下:

在远程服务器上:

1:创建一个名为 /tmp/bare 的目录
2:切换到该目录中
3:执行 git init --bare 命令

在本地机器上:

1:切换到你的 git 项目目录中
2:通过命令 git remote add bare ssh://user@server/tmp/bare 添加 bare 远程仓库
3:使用命令 git push --all bare 推送所有代码至 bare 远程仓库
4:通过命令 git remote remove bare 移除 bare 远程仓库

在远程服务器上:

1:执行命令 git clone /tmp/bare /path/to/your/clone 克隆 bare 远程仓库至本地

在本地机器上:

1:通过命令 git remote add origin ssh://user@server/path/to/your/clone 添加远程仓库 origin

这个过程有些繁琐,但它能够正常工作而且不需要设置任何奇怪的标志或告诉 git 覆盖其默认行为。因此,这是相当安全的。


既然你说这是“安全”的,我就试着用了一下。看起来它对我来说运行良好。 - Nikos Alexandris
比看起来容易 - John Mee

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

在Git中,与hg clone . ssh://account@server/www最相似的命令是:

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

事实上,我已经在~/.bash_aliases中添加了这行命令,以镜像任何地方的目录:
alias mirror="rsync -avz . ssh://account@server`pwd` --delete"

如果你恰好在特殊目录(如/dev或/bin)中,那么这可能会带来危险。请小心。


1
我赞同并改进了presto8,通过删除不匹配的文件。
rsync -avz . ssh://account@server/www/reponame --delete

0

只是为了给你提供另一种选择,你可以使用:

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

如果您的本地git存储库指向另一个远程存储库,则这些也可以工作


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接