自定义 Git 服务器是否可以提供更新,即使它根本不存储任何代码?
Can a custom Git server provide updates even if it stores no code at all?
我读了 Pro Git book 直到 Git on the Server
章,其中显示了如何制作 Git 服务器:它说(第 94 页):
In order to initially set up any Git server, you have to export an existing repository into a new bare
repository — a repository that doesn’t contain a working directory
一旦服务器完成,我意识到 no working directory
意味着没有代码:如果我没看错,没有代码存储在我们的服务器中.
我的负责人让我在我们公司网络中设置一个 Git 服务器来存储最新的生产代码,但他希望代码在那里:他认为这个服务器既是 Git 服务器和更新服务器。
这意味着我们的 Git 服务器,内部没有代码,应该提供我们开发人员编写的代码的更新。
这实际上可能吗?或者我应该就更新提出不同的建议,在存储代码(使用 Git 服务器)和提供更新(使用另一台服务器)之间拆分作业?
没有工作目录并不意味着没有代码。代码历史存储在数据库中,这是裸存储库的主要目的。
作为 ,数据库(.git/objects/
和 .git/objects/pack/
目录,在非裸存储库中)存储 所有内容。
Git 的要点是存储 提交 ,通常是永远存储。这些提交不是文件,尽管它们(间接)包含 文件。对象——文件,Git 调用 blobs; 提交,以及另外两个内部对象类型,称为 trees 和 带注释的标签——都以一种特殊的、压缩的(有时压缩得很厉害)、仅Git的格式存储。一般来说,这些仅对 Git 本身有用。
为了让您或您的计算机的其他部分能够处理文件,它们需要采用普通格式,而不是某些特殊的 Git-only 格式。 Git 可让您在自己工作的区域执行此操作:工作树。
不过,如果您有工作树,您很可能会用它来工作。如果 Git 存储库应该接收推送请求并根据推送请求采取行动,那么当突然 bam![=38 时,一些可怜的家伙的工作树中正在进行的工作会发生什么=] 有人将新内容推送到他的存储库中?坏事发生,是什么。
显而易见的解决方案是 Git 使用的解决方案:如果您要接收推送,请删除工作树。现在没有地方可以 放置 正在进行的工作,所以永远不会有任何东西被覆盖。这就是 --bare
存储库:它消除了工作树,因此没有地方可以做工作,所以它不能被其他人突然覆盖。
有多种妥协方法,但与大多数妥协一样,它们往往会遇到各种问题。裸存储库可以接收推送以接收提交,并且可以接受获取连接请求以发送提交,唯一被推送请求覆盖的是裸存储库的想法,即提交任何特定分支名称意味着什么——理想情况下,在一种 "fast forward" 方式,以便这仅 添加新提交 到可从名称访问的提交集中。 (请记住,在 Git 中,分支 name 只是指向一个特定提交的可移动指针。另请参阅 What exactly do we mean by "branch"?)
我读了 Pro Git book 直到 Git on the Server
章,其中显示了如何制作 Git 服务器:它说(第 94 页):
In order to initially set up any Git server, you have to export an existing repository into a new bare repository — a repository that doesn’t contain a working directory
一旦服务器完成,我意识到 no working directory
意味着没有代码:如果我没看错,没有代码存储在我们的服务器中.
我的负责人让我在我们公司网络中设置一个 Git 服务器来存储最新的生产代码,但他希望代码在那里:他认为这个服务器既是 Git 服务器和更新服务器。
这意味着我们的 Git 服务器,内部没有代码,应该提供我们开发人员编写的代码的更新。
这实际上可能吗?或者我应该就更新提出不同的建议,在存储代码(使用 Git 服务器)和提供更新(使用另一台服务器)之间拆分作业?
没有工作目录并不意味着没有代码。代码历史存储在数据库中,这是裸存储库的主要目的。
作为 .git/objects/
和 .git/objects/pack/
目录,在非裸存储库中)存储 所有内容。
Git 的要点是存储 提交 ,通常是永远存储。这些提交不是文件,尽管它们(间接)包含 文件。对象——文件,Git 调用 blobs; 提交,以及另外两个内部对象类型,称为 trees 和 带注释的标签——都以一种特殊的、压缩的(有时压缩得很厉害)、仅Git的格式存储。一般来说,这些仅对 Git 本身有用。
为了让您或您的计算机的其他部分能够处理文件,它们需要采用普通格式,而不是某些特殊的 Git-only 格式。 Git 可让您在自己工作的区域执行此操作:工作树。
不过,如果您有工作树,您很可能会用它来工作。如果 Git 存储库应该接收推送请求并根据推送请求采取行动,那么当突然 bam![=38 时,一些可怜的家伙的工作树中正在进行的工作会发生什么=] 有人将新内容推送到他的存储库中?坏事发生,是什么。
显而易见的解决方案是 Git 使用的解决方案:如果您要接收推送,请删除工作树。现在没有地方可以 放置 正在进行的工作,所以永远不会有任何东西被覆盖。这就是 --bare
存储库:它消除了工作树,因此没有地方可以做工作,所以它不能被其他人突然覆盖。
有多种妥协方法,但与大多数妥协一样,它们往往会遇到各种问题。裸存储库可以接收推送以接收提交,并且可以接受获取连接请求以发送提交,唯一被推送请求覆盖的是裸存储库的想法,即提交任何特定分支名称意味着什么——理想情况下,在一种 "fast forward" 方式,以便这仅 添加新提交 到可从名称访问的提交集中。 (请记住,在 Git 中,分支 name 只是指向一个特定提交的可移动指针。另请参阅 What exactly do we mean by "branch"?)