GIt工作流开发和生产 - 我应该在哪里创建回购?

时间:2012-03-12 18:13:32

标签: git-workflow

我在某个地方读过*这样的设置会很好:

两个主要分支,每个服务器一个。

推送主人发送更改为live;

推送到dev / stage(或者你称之为的任何东西)会发送更改到staging;

工作流:

  • 从dev创建分支;

  • 在本地工作,直到您准备好进行测试;

  • 合并回dev;

  • 推送到Hub,它将更改发送到dev / staging服务器。

准备好上线之后:

  • 从dev合并到master,

  • 然后将master推送到Hub,Hub将这些更改发送到实时服务器。

  

两个主要分支,每个服务器一个。

所以我在“webroot / myliveapp /”上有一个分支“生产” 和“webroot / devapp /”

上的另一个分支“发展”

存储库应该在哪里?

更新

我的意思是:

根据这个流程,我们将拥有:

  • Prime repo;

  • 裸露的回购中心;

  • 克隆;

开发和生产分支应该属于一个存储库,对吗?

如果这是正确的,那么我们应该发出FIRST git init命令吗? 在我们的Prime回购中?

所以我们会:

  

“webroot / myliveapp /” - 生产分支;

     

“webroot / devapp /” - 开发分支;

     

“webroot / .git” - Prime存储库;

这有意义吗?

或者Prime库是否应该与我们的生产分支机构位置相对应?

*注意:如果您需要有关我正在尝试实施的工作流程的上下文,请执行以下操作: http://joemaller.com/990/a-web-focused-git-workflow/

1 个答案:

答案 0 :(得分:9)

感谢您对问题的更新,现在更加清晰。

我相信你遇到的问题是基于对Git工作流程的误解; Git不会将目录等同于分支,它会将视图系统等同于分支。这很强大 - 但很容易在脚下射击自己。让我解释一下。

Git本身更像是一个数据库支持的,差异化版本的历史跟踪文件系统。它在你的文件系统“之上”,而不是“它的一部分”。它不使用您的文件系统来表示分支,而是当您签出不同的分支时,文件系统中的所有文件将更改为该分支中的文件。您要求Git使您的文件系统代表该分支的替代现实。

如果您在分支机构master上,并且已提交了文件root/foo.txt,那么您需要查看分支机构experiment root/foo.txt 1}}已提交,当您查找时,您会发现该文件已消失。它是master的一部分,而不是experiment,因此它不存在于您的文件系统中。这就是为什么Git在你允许你切换分支之前真的很挑剔你当前的分支 - 如果你对Git不知道的文件系统进行了非分段更改,它会拒绝用不同的现实覆盖它们来消除它们。你必须先干预才能把事情做好。

因此,要回答问题,请不要为“myliveapp”和“devapp”创建子目录 - 创建不同的分支。只需在“webroot”下设置一个代码库。然后,劈开,比如说,“不稳定”的分支,像往常一样提交你的更改。然后,您可以通过切换到“devapp”分支将存储库中的所有文件切换到开发服务器文件的版本,并且您可以随时切换回“不稳定”。

如果要更新分支,例如在更新您的开发服务器时,您可以merge“不稳定”进入“devapp”。这将使“devapp”的所有文件看起来像“不稳定”的文件,使其更新。

还有一点需要注意:主要回购,裸仓和克隆之间的差异几乎为零。软件几乎没有区别;相反,说“Linus'内核是规范的Linux内核”是一种人类惯例。有了这样的理解:

  • 一个主要的回购只是一个存储库,每个人都同意拥有该软件的“规范”版本。也就是说,每当开发人员做出改变时,他们希望每个人都能看到,而不是说“拉我的版本devapp”,他们可以说,“我已经发布了我的主要回购的变化。”对于人们来说,这只是一个简单的约会。
  • 克隆是其他一些回购的副本。我可以克隆主要回购,进行更改,然后你可以克隆我的回购。如果您进行了更改,只要合并有效且您在计算机上拥有权限,就可以将它们推送到主要仓库或我的仓库上。
  • 一个裸的回购根本没有“工作副本” - 该计算机上没有“webroot”目录。它只有 .git目录,它是空的 - 这对于没有人需要改变文件的服务器来说很好。

最后,.git目录不包含你的repo文件,它包含git配置和数据库。它是数据库形式的整个存储库历史记录,用于使用特定版本的软件填充其余的存储库。这就是我发表评论的原因:你可以本地随时查看任何版本的存储库的任何版本,无需网络通信 - 因为它就在那里.git目录。唯一需要的网络通信是,当您希望使用pushpull 本地存储库同步到其他存储库时。