如何将Git用作内容分发网络

3

书籍《Git Internal》在第50页提到了使用git作为点对点内容分发网络,但没有太多细节。特别是如何跟踪不同文件的几个分支。例如:

(工作目录) a00.exe a01.exe b00.exe c00.exe c01.exe c02.exe

主分支跟踪所有文件,而A分支仅跟踪a00.exe和a01.exe,B分支则跟踪b00.exe等等。下一次提交将更新a00.exe b00.exe c00.exe。如何创建这样的分支?一旦所有分支都提交了,我能只从远程获取某个分支吗?谢谢!

2个回答

7
您需要使用某种脚本来构建各个内容分支。基本方法是将内容添加到数据库中(在您的情况下,只需将其提交到主分支),然后在临时索引中读取您想要在每个分支中拥有的所有内容(git read-tree/git update-index),编写该树(git write-tree),编写提交对象(git commit-tree)并更新分支到该新提交(git update-ref)。这些都是通常不用于日常操作的管道命令,但允许您构建快照而不必同时在磁盘上拥有所有内容目录。
如下是一个执行此类操作的示例脚本:

http://github.com/schacon/gitcrazy/blob/master/update_content.rb

在这里,我定义了许多服务器,每个服务器都具有一个或多个角色(“memcache”,“database”或“webserver”)。然后,我可以像这样向角色添加内容:
$ update_content.rb /path/to/content file_name memcache

那将把内容添加到我的git数据库中,然后更新受影响的服务器的分支(在这种情况下具有memcache角色的服务器)。我可以为任何角色的多个文件执行此操作,而git将跟踪每个服务器应具有的内容。然后每个服务器可以获取其特定的分支('server/s1'、'server/s2'等)。 我考虑很快做一个快速的演示视频来展示这个功能 - 希望这个示例脚本对您有所帮助。运行和理解正在发生的事情应该相当容易。在同一项目中,还有一个“列表”脚本,列出了哪些内容位于哪个服务器分支上。

感谢提供如此有用的信息。在 Ruby 脚本中,这个命令 'git update-index --add --cacheinfo 100644 (sha1) (path)' 中的 100644 模式是从哪里来的?谢谢! - Scud
在第43行中: pcommit = (prev_commit != "servers/#{server}") ? "-p #{prev_commit}" : '' prev_commit是sha1,而servers/#{server}是类似于“master”的字符串,因此它们永远不会相等。这样做是有意义的吗?谢谢。 - Scud
1
当您使用update-index向索引添加内容时,必须为文件指定一个模式——100644表示普通文件,或者您可以将文件设置为可执行文件(100755,我想),或者是符号链接。这只是一个Unix文件模式。至于prev_commit——如果存在先前的提交,则它将等于一个sha1值,但如果不存在先前的提交——如果servers/{server}尚未设置为任何内容,则rev-parse命令将返回您提供的字符串,因为它无法为其找到sha。这就是我如何判断是否没有第一次提交。希望这有所帮助。 - Scott Chacon

5

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