35

我们正在为我们的工作流程从 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,因为有些帐户拥有多个网站/存储库)。

是否可以在不将工作目录与存储库分开的情况下进行基本相同的设置?

4

6 回答 6

44

要回答你的第一个问题,是的,你可以。假设远程目录是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”克隆实际上知道要遵循哪个分支。从那时起,推送到该存储库应该会触发对该分支的重新签出。

于 2010-11-10T09:40:15.487 回答
28

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

在远程服务器上:

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远程添加源ssh://user@server/path/to/your/clone

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

于 2013-09-28T19:57:03.353 回答
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

我希望这对其他答案有问题的人有所帮助。

于 2012-04-08T04:19:05.650 回答
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 之类的特殊目录中,这可能会很危险。当心。

于 2013-03-02T16:49:02.640 回答
1

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

rsync -avz . ssh://account@server/www/reponame --delete
于 2013-10-03T15:11:07.710 回答
0

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

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

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

于 2015-10-06T21:39:37.843 回答