Git设置最佳实践

18
我被指派为办公室设置Git。我们有几个站点。我刚刚为我们建立了一个网络驱动器,以便我们推送更改。我的问题是:我应该在哪里初始化Git仓库?
  1. 对于每个站点都要创建新的目录并进行初始化吗?
  2. 在干净和新的驱动器上进行一次初始化,每个目录代表不同的站点?
  3. 还有其他更好的方法吗?

我向所有人征求建议,特别是如果您曾经因为第一个设置它的人问“为什么”而咒骂过他。


5
如果你是个彻头彻尾的新手:他们怎么会交给你那项任务呢?是谁决定使用Git,即使设置它的人对这个系统完全不了解? - eckes
1
小型开发团队,我们都要扮演多重角色...我的初始问题就是这样。 - rpophessagr
5个回答

44

仓库的结构不是关于“站点”(你想说什么都可以)的问题,而是关于“项目”的问题。

作为经验法则:

  • 为每个独立项目使用一个(bare, blessed)仓库
  • 如果共享了公共模块,请使用submodules实现

在每个仓库内,使用branches来组织工作,并且不要混淆分支与组织不同软件堆栈的手段:分支用于组织一个仓库中的工作(即一个软件的不同开发线路)。其中一种分支模型(在SO上似乎很受欢迎)是这样的:

enter image description here

感到困惑?好奇吗?阅读explanation...


谢谢!你说的子模块是指分支吗?还是其他什么意思? - rpophessagr
你应该做的是掌握-CI->构建/测试/分析->合并到主分支-CD->部署/集成测试/UAT->发布分支。热修补程序在发布分支上完成。如果主分支与发布分支存在冲突,则意味着您没有回退合并热修补程序,因此无法发布。在您的模型中,您在合并到主分支之前发布,在发现冲突时为时已晚。"严重错误修复"只是停留在主分支上,而产品已经发货了。 - Sleeper Smith

4

如果你更喜欢将所有代码库放在一个git repo中,或者单独放在各自的repo中,这是一种偏好的问题。虽然如此,我的偏好是每个代码库/站点有一个单独的git repo。这样你就可以在不用检出其他repo的情况下只工作于一个站点,并且你不必担心其他站点的更改会妨碍你提交到任何一个给定站点的提交。


1
如果您需要更改某个版本而不影响另一个版本,则它们需要位于单独的存储库中 - 这不是偏好问题。 - Cascabel

2
我建议如果您在内部托管存储库,则使用gitolite。您只需更改混淆文件即可添加中央存储库。
除非您正在进行跨平台开发,否则将auto crlf设置为false。
以这种方式管理您的分支:

http://dymitruk.com/blog/2012/02/05/branch-per-feature/


1

基本设置

我建议你在服务器上创建一个专门用于git的目录。

我在由我的公司运营的服务器上使用了目录名为/git,用于与工作相关的事项,而对于个人使用,我还在私人Web服务器上创建了一个名为/git的目录。

在你的/git目录中,你可以创建裸仓库来管理你的项目。

ssh git@myserver
cd /git
mkdir Project7sName.git
cd Project7sName.git
git init --bare
echo "Take over the world project" > description

添加查看器

然后您可以在服务器上安装类似GitList的软件,以便更好地查看软件更改,例如删除用红色表示,插入用绿色表示。

GitList example image

分布式版本控制?

Git是一种分布式版本控制系统。因此,您可能希望在多个站点执行此操作。优点是,如果您随时失去其他站点的连接,您可以继续无间断地工作。此外,如果您的硬盘发生故障或出现任何类似问题,您会有多个数据副本。

如果您希望人们始终推送到一个站点,则可以将某个站点指定为主站点,或者您的工作实践可能是人们将所有服务器站点都推送。

请利用诸如下列命令:

git remote add siteA ssh://git@siteA/git/repositoryX.git

所以你可以做像这样的事情:
git push siteA master
git push siteB master

我有一个备份脚本,每天运行一次,从我们自己的git服务器、NAS驱动器、USB驱动器和github上拉取代码,并将其推送到每个位置。
通过这种方式,有两种方法来确保软件更改有多个副本。
1.由用户(推送到多个站点)和
2.由管理员(在站点之间复制更改)。
首先,在服务器上设置Git并添加类似GitList的工具以便查看更改。
一旦您正确理解了所涉及的步骤,您可以随时选择在另一个站点重复它们。
导入旧项目?
作为系统管理员,您可能想将旧项目导入Git。
您可以通过提交空存储库来实现此目的。
git touch .gitignore
git add .gitignore
git commit -m Empty

然后,反复将项目的归档版本解压缩到项目目录中(除了git文件以外),并提交归档状态。
rm *
unzip ...
git add *
git commit -m "Archived state 2013 week 18"
git tag ArchivedState2013week18

如果您按时间顺序提交存档状态,那么您的查看软件(如GitList等)很可能会开始显示历史修复的软件更改,尽管有时混合在一起,有时不完整。
此外,您将能够使用git blame来了解代码的某些行是何时引入的。

0
你可能想要一个集中式服务器,可以将更改推送到该服务器并从该服务器克隆。该服务器可能有一个或多个存储库。我建议阅读http://sethrobertson.github.com/GitBestPractices/,其中有几个直接相关的部分。具体来说,选择本地工作流程、分布式工作流程以及如何将您的工作划分为存储库。

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