像GitHub一样的Git服务器?

415

我是一个长期使用Subversion的用户,现在打算尝试Git。我已经阅读了一些相关信息,了解到它的分布式性质,我也看到了许多好处。

然而,我确实喜欢中央服务器的想法,这样可以承担备份、记录系统等角色,同时仍然可以使用Git进行本地分支和共享。由于我不是在进行开源项目,所以我不能使用Github(除非付费),所以我的问题实际上是:运行本地git服务器的最佳实践是什么?

我知道这可能违反标准的Git使用模式,但它对我的项目将会很有用。欢迎提出我可能忽略的任何问题。

谢谢!


50
您描述的使用中心化服务器的方式实际上是分布式版本控制系统的标准使用模式,所以不必担心。 :-) - Aasmund Eldhuset
8
啊——我以为这只是个例外。希望可以避免“如果你认同集权,那你就没看懂!”这样的评论。谢谢。 - skaz
27
一种合理的想法。我的理解是,分布式版本控制系统的重点不在于你不需要中央仓库(这通常非常有用),而是你不必被强制使用中央仓库——你可以进行本地提交,如果需要,很容易与特定人员交换修订版本,甚至可以有多个“中央”仓库(在 git 中,不管具体角色如何,任何其他仓库都被称为“远程仓库”,你可以添加任意数量的远程仓库)。分布式版本控制系统通常具有非常灵活的分支模型(git 在此方面表现出色)。 - Aasmund Eldhuset
15
重新表述Aasmund的评论:分布式版本控制系统(DVCS)的目的通常不是为了取消中央代码库,而是将完整的版本控制系统的所有功能提供给每个用户。 - Cascabel
2
Google推出了新的Cloud Source Repository,允许私有存储库:https://cloud.google.com/tools/cloud-repositories/ 另外,顺便说一句,不确定为什么这被标记为离题! - Josh M.
1
你可以使用GitHub、Now,支持私有仓库。 - PurTahan
19个回答

202

您可以设置一个SSH服务器并在那里运行一个中央代码库。然后所有的开发人员都会同意(作为一种政策)在完成提交后将代码推送到服务器上。这是我们工作场所的使用模式,非常类似于CVS和SVN。

  1. 找到一个放置代码库的位置(例如/var/gitroot)。
  2. 创建一个新的代码库(mkdir project.git && cd project.git && git init --bare --shared=group)。
  3. 然后在客户端上,克隆远程代码库(git clone ssh://yourserver.com/var/gitroot/project.git && cd project)。
  4. 添加一些文件(git add README)。
  5. 提交(git commit -m "Initial import")。
  6. 推送(git push origin master)。

这样就为您设置好了。


5
为了明确一下: 在另一个(可访问的)服务器上安装git并创建仓库。 让客户端克隆该仓库。 当客户端完成修复后,将其推送到服务器仓库。 - skaz
8
事实上,这是协作使用Git的关键使用模式。 - Aasmund Eldhuset
1
这个错误发生在推送 origin master 时::::计数对象: 3, 完成. 写入对象: 100% (3/3), 244 字节 | 0 字节/秒, 完成. 总共 3 (增量 0), 重用 0 (增量 0) 远程: 错误: 添加对象到仓库数据库./objects 的权限不足 远程: 致命错误: 写入对象失败 错误: 解包失败: 解包对象异常退出 到 ssh://localhost/var/gitroot/project.git ! [remote rejected] master -> master (解包器错误) 错误: 推送一些引用失败到 'ssh://localhost/var/gitroot/project.git' - Abdo
3
我之前写了一篇关于如何在本地设置git仓库的博客文章,链接在这里:http://www.convalesco.org/articles/2009/07/24/how-to-set-up-a-personal-git-repository-in-10-minutes/。只需要花费不到10分钟的时间。但是要做好本地服务器备份策略的设置、服务器管理等工作比较困难。 - patm
1
@smsware 在这里:https://www.convalesco.org/notes/2009/07/24/how-to-set-up-a-personal-git-repository-in-10-minutes.html - patm
显示剩余4条评论

199

5
看起来不错,但是安装似乎很繁琐(尤其是对于非Rails用户而言)。[http://cjohansen.no/en/ruby/setting_up_gitorious_on_your_own_server] - gatoatigrado
3
看起来Gitorious不再是一个免费的开源私有托管解决方案。 - Mingming
16
另外,http://gitlab.org/ 是另一个选项,自我回答以来已经得到开发。 - Craig
1
尝试使用gogs,它的设置更好。 - plan9assembler
1
两种选择都是出卖,走自由开源解决方案的路吧... - NinjaKC
显示剩余5条评论

75

试试GitLab

这是我用过的最好的 Git GUI 工具。它与 GitHub 非常相似。

它是开源软件(MIT许可证),是安装最多的 git 管理软件,已有超过25,000次安装。每月都会发布新版本,拥有超过375个贡献者的活跃社区。您可以在自己的服务器上拥有无限数量的私有、内部和公共存储库。它是一个运行在大多数 Unix 平台上的 Ruby on Rails 应用程序。


1
我同意,这很棒。 (+1) 但是截至本评论时,安装它很麻烦。如果他们能够打包rpm、deb等,那就太好了。 - Synesso
2
我发现Ubuntu相对较新的单一脚本设置非常容易。即使没有它,也大多是按照网站上的说明进行操作。我从未使用过Rails或Ubuntu服务器,但第一次尝试就成功运行了它。 - Jon Shier
2
现在安装GitLab相当容易。只需要解压缩一个软件包即可。请参阅about.gitlab.com/downloads。 - Job
https://about.gitlab.com/pricing/ <--- 不是免费的... - NinjaKC
2
Gitlab企业版当然不是免费的,但有社区版可供使用,它是免费的且安装也很容易。不过,它需要大约800MB的磁盘空间,因为它会安装几个数据库引擎和许多依赖项。 - OndroMih
显示剩余2条评论

38
如果您不介意通过命令行进行操作,那么在企业环境中需要为不同的代码库设置不同访问权限时,gitolite是一款非常优秀的工具。它可以让一个服务器上的单个用户托管多个Git 库并提供对多个开发人员的访问,而无需向他们提供真实的用户ID或服务器的shell 访问权限。这种神奇的技术基于SSH公钥访问和授权文件实现,灵感来自于一个名叫Gitosis 的旧程序。
Gitolite 可以限制谁能读取(克隆/提取)或写入(推送)存储库。 它还可以限制谁可以将更改推送到哪个分支或标签,这在企业环境中非常重要。Git o lite 可以在不需要root权限的情况下安装,并且只需要使用Git 本身和perl 就可完成安装。
它拥有相当全面的功能集,但我特别喜欢的一点是,所有日常配置编辑都是通过一个特殊的Git 存储库完成的。也就是说,添加用户只需执行以下步骤:
- 将用户添加到配置文件。 - 添加用户的SSH密钥。 - 提交更改。 - 将更改推送到gitolite。 - 完成!配置已经生效!
当需要通过浏览器查看代码时,gitolite 可以支持与gitweb同步配置。或者,如果您喜欢用C编写的非常好的Git Web前端工具cgit,则可以参考本指南

24
你可以考虑使用Gitblit,它是一个面向小型工作组的开源、纯Java集成Git服务器、查看器和代码库管理工具。

Gitblit似乎非常适合我的应用程序,但最后一次发布是在2016年,这让我有些担心。 - Yogi
1
@Roberto,说得好。我想这取决于你的需求或者对你来说什么更重要。如果它现在能够满足你的需求,那么它仍然是一个有效的选择。但是,如果你担心及时修复漏洞或需要更多功能,那么它可能不是最佳选择。 - Florian

15

最简单的浏览器

git instaweb --httpd=webrick

源自Git SCM图书

结合类似于此处描述的分布式开发方法(感谢datagrok清晰描述此概念)

从任何本地存储库启动一次性Git服务器。

我已经推特过了,但我认为它需要一些扩展:

启用去中心化的Git工作流: git config alias.serve "daemon --verbose --export-all --base-path=.git --reuseaddr --strict-paths .git/"

假设您使用涉及与核心“正式”存储库一起工作的Git工作流程,并将更改从中拉取和推送。我相信许多公司都这样做,像Github这样的Git托管服务的用户也是如此。

如果该服务器或Github短暂关闭,那就没关系了。毕竟,使用Git的原因之一是在本地克隆中拥有整个项目历史记录的副本。

您可以继续编码和提交,同时等待运营团队将服务器恢复正常。自我提醒: 为运维团队购买甜甜圈。

但是,在此期间,如果您想与另一个可能不是Git专家的人合作,该怎么办?

或者,除了停机时间之外,如果您和您的合作者在现场,并且由于某种原因无法让VPN让您连接到官方存储库怎么办?

或者,如果您和您的合作者正在进行一堆实验性更改,尽管您有访问权限,但您不想将未完成的混乱推入官方中央存储库中怎么办?(即使作为功能分支也不行)。也许您正在清理灾难性的重置或合并,分支随处可见。

好吧,正如您可能已经意识到的那样,Git是一种"分布式"版本控制系统

即使您在工作流程中使用集中的“正式”Git存储库,您仍然可以使用点对点的方式使用Git,其中您和您的合作者只需相互构建和共享提交,并且中央服务器甚至无需知道。

那么,如何将您的分支和提交传输给他们,或者反之亦然?

  • 您可以使用Git的电子邮件补丁功能。但是那有点不优雅,并需要一些知识来应用电子邮件补丁。
  • 您可以为您的合作者在自己的计算机上创建一个帐户以进行ssh连接。但也许您没有本地root访问权限,或者您不信任他们能够访问您的框。
  • 您可以将存储库克隆到U盘上并相互传递。但是,这相当繁琐,特别是如果您恰好在同一局域网中,并且需要一个U盘。

您可能还可以想到其他方法。但有一

git config --global alias.serve "daemon --verbose --export-all --base-path=.git --reuseaddr --strict-paths .git/"

使用别名是非常重要的,因为git别名是在工作树的基本目录中执行的。因此,路径'.git'将始终指向正确的位置,无论您在存储库的目录树中的哪个位置。

像这样使用您的新的git serve

  1. 运行git serve。它会报告“准备好战斗”。Git很牛逼。
  2. 找出您的IP地址。假设是192.168.1.123。
  3. 说:“嘿Jane,我还没有准备好/能够将这些提交推送到远程仓库,但是您可以通过运行git fetch git://192.168.1.123/将我的提交提取到您的克隆中。”
  4. 当您不再想服务该仓库时,按ctrl+c

如果Jane还没有存储库的克隆,您也可以告诉她git clone git://192.168.1.123/ local-repo-name。或者,使用git pull git://192.168.1.123/ branchname一次执行提取和合并,如果您正在共同开发一个功能分支,则非常有用。

但是请注意,如果您在存储库中保存秘密,则不应在敌对网络上执行此操作,因为没有身份验证。它不会广告其存在,但是任何具有端口扫描器的人都可以找到它,连接到它并克隆您的存储库。

但是默认情况下它是只读的,因此并不是非常危险。如果您想要获取合作者的提交,那么将其保持只读更安全,并要求您的合作者也运行此命令,以便您可以从中提取。

涉及到一次性服务器问题的旁系问题:如果您想通过HTTP暂时共享大量静态文件:python -m SimpleHTTPServer


11

如果您需要一个好用且易于使用的Git服务器,那么您一定要尝试GitBlit。我也使用过gitolite,但它只是一个服务器,而GitBlit则集成了全部功能,包括服务器、管理员和仓库管理等。URL:http://gitblit.com/


9

https://rhodecode.com 是一个开源的Git和Mercurial Web应用程序,可以在任何操作系统下非常容易地安装(包含安装程序)。

RhodeCode(新版本称为RhodeCode Enterprise)添加了缺失的Git功能,如代码审查,并且通常非常快速和可靠。


1
我实际上在这里运行自己的实例:http://code.gmgauthier.com/。3.x版本非常干净和稳定。实际上,我用它来做更多的事情(尽管,那里有很多代码)。我用它来保留我的个人日记、两本书的手稿、播客脚本和博客草稿的主要副本。它非常适合这个,部分原因是它为您呈现Markdown和RestructuredText,使得从任何地方阅读草稿变得非常容易。 - Greg Gauthier

8

您也可以安装Indefero,它是GoogleCode的GPL克隆版,支持Subversion和Git,可以实现平滑过渡。我是Indefero的作者。


我正在使用它并且喜欢它。但是设计有点过时了。它还在维护吗? - Jaroslav

8

这可能不是最常见的Git服务器设置,但通过尝试不同的布局、工具、镜像和权限方案,我可以说,一个非常可靠的企业存储库替代方案是Gerrit,这似乎令人惊讶,因为它更为人所知的是一个代码审查工具。我们开始使用它作为代码审查工具,慢慢地它成为了我们的主要存储库,取代了g3/gitolite。

  • 部署简单(基本上只需将.war文件放在tomcat中)
  • 有Web UI来管理存储库、组和权限(或ssh cli)
  • 具有内置的Java SSH和Git实现,因此您无需设置其他内容
  • 支持用户和组的LDAP(通常是公司的必备条件)
  • 非常灵活的权限系统(具有项目组、权限继承、限制读/写/分支/未审核写等功能)
  • 代码审查能力(如果你喜欢这个东西)
  • 存储库镜像(将一些存储库推送到GitHub或其他公共repo)
此外,它被大型项目(例如Android、Chrome)使用,因此它可以扩展并且现在相当稳定。如果您想允许绕过代码审查部分,请给予用户PUSH权限。

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