Git:正确的克隆,拉动和推动顺序

时间:2011-08-11 22:55:29

标签: git

情况如下:

生产服务器

  • 网站A(/ home / a / www)
  • 网站B(/ home / b / www)
  • 网站C(/ home / c / www /)

开发计算机

[目前我们正在设置空白......开发人员有自己的客户端机器,我们将在其中编辑文件]

我做了什么

生产:

cd /home/a/www/
git init
add .
commit -m "Initial loading of files"


cd /home/b/www/
git init
add .
commit -m "Initial loading of files"


cd /home/c/www/
git init
add .
commit -m "Initial loading of files"

所以现在所有项目都在单独的git项目中。现在的想法是将它们加载到每个开发人员的计算机上,然后他们可以编辑它并在必要时上传。说我想编辑项目B:

cd ~/
git clone ssh://server/home/b/www/ website_b

然后开发人员编辑网站,并准备上传更改:

cd ~/website_b
git commit -a -m "I have made some changes"
git push

想到这是正确的程序,并且这会将我的更改上传到生产服务器上的/home/b/www/。但是,我得到了一堆警告,事情变得混乱了。我有同样的问题:git: updating the current branch

但是,我对git很新,并且很难理解概念和工作流程。分支,树干,主人,起源,对我来说都有点不清楚。我想暂时保持简单,让它运转起来。我们从不在一个项目上同时与超过1个人合作,我们不需要创建子项目(分支?)。至少现在(是。我只想要git工作。我想:

  • 从生产服务器下载当前项目
  • 进行更改
  • 上传

这就是全部。这里出了什么问题,或者我应该阅读/学习/练习什么来更好地理解这个?

2 个答案:

答案 0 :(得分:3)

您的工作流程非常好。唯一的问题是,您从开发人员机器上推送到的服务器上的存储库应该(好吧,不应该*)是所谓的bare存储库。

因此,当您在服务器上创建项目时,请执行以下操作:

git init --bare .

这会将回购设置为裸露,您可以安全地推送它们。

现在,如果您希望从服务器提供repo中的文件,git clone从中央裸仓库到您将提供文件的位置,并{{3} (例如收件后)在您将用于为您的网站提供服务的repos中的git pushgit pull的裸仓库中。

在此处查看有关该流程的详细信息:hooks

* - 你推送的repos可以是具有工作目录的正常repos,即签出文件(非裸仓库没有这些,只有repo的元数据和对象)。但是对于你正在推动的回购交易而言,这是一个很好的做法。请在此处查看有关原因的详细说明:http://toroid.org/ams/git-website-howto

答案 1 :(得分:1)

我可以立即发现一些可能存在的问题,但可能会有更多:

a)通过ssh进行推送连接的用户至少需要.git存储库上的文件io权限才能以这种方式访问​​远程存储库。

b)在(成功)推送到附加了工作目录的远程存储库之后,会自动检出新提交。工作目录将保持在远程推送之前的状态。

我强烈建议您使用gitosis(已弃用)或gitolite之类的东西来设置(中央)开发存储库。然后,您可以从开发服务器推送到实时服务器。请注意,您必须明确检查实时服务器上的新提交然后(我相信git checkout HEAD应该为您执行此操作)。您可以使用后推钩自动化前躯。 另一个选择是让实时服务器在开发服务器上运行git pull,我个人更喜欢。它不需要显式检出,必须从实时服务器发出,这样可以更好地进行访问控制。