Android repo脚本创建的.repo/projects/中赤裸的git存储库有什么目的?

5
Android源代码repo管理。使用repo进行同步时,会创建一个名为.repo/projects/的目录,其中包含所有以裸git格式直接在当前工作目录中检出的git仓库。 repo维护裸git仓库的目的是什么?这些裸仓库如何被repo使用? (注:澄清一下,我写“repo”时并不是指git仓库,而是指由/为Android创建用于维护组成Android源代码的所有git仓库的repo脚本。)

4
这不是两个副本,组件中的 .git 文件夹包含指向 ./repo/projects 中相应组件的符号链接。 - Fredrik Pihl
@Fredrik 这就是答案,请直接发布。 - Josh Lee
3个回答

6
在使用Android repo仓库管理系统一段时间后,我现在理解了.repo/projects/目录中裸仓库的作用。正如@Fredrik所回答的那样,这里的项目并不是直接在“克隆”(由repo创建)中表示的仓库的另一个副本。事实上,克隆中所有的 .git 目录的内容都只是符号链接,像这样:
$ ll development/.git/
total 452
drwxr-xr-x  2 bfh bfh   4096 2011-08-15 13:55 ./
drwxr-xr-x 20 bfh bfh   4096 2011-08-15 13:55 ../
lrwxrwxrwx  1 bfh bfh     43 2011-08-15 13:55 config -> ../../.repo/projects/development.git/config
lrwxrwxrwx  1 bfh bfh     48 2011-08-15 13:55 description -> ../../.repo/projects/development.git/description
-rw-r--r--  1 bfh bfh     41 2011-08-15 13:55 HEAD
lrwxrwxrwx  1 bfh bfh     42 2011-08-15 13:55 hooks -> ../../.repo/projects/development.git/hooks/
-rw-r--r--  1 bfh bfh 449008 2011-08-15 13:55 index
lrwxrwxrwx  1 bfh bfh     41 2011-08-15 13:55 info -> ../../.repo/projects/development.git/info/
lrwxrwxrwx  1 bfh bfh     41 2011-08-15 13:55 logs -> ../../.repo/projects/development.git/logs/
lrwxrwxrwx  1 bfh bfh     44 2011-08-15 13:55 objects -> ../../.repo/projects/development.git/objects/
lrwxrwxrwx  1 bfh bfh     48 2011-08-15 13:55 packed-refs -> ../../.repo/projects/development.git/packed-refs
lrwxrwxrwx  1 bfh bfh     41 2011-08-15 13:55 refs -> ../../.repo/projects/development.git/refs/
lrwxrwxrwx  1 bfh bfh     45 2011-08-15 13:55 rr-cache -> ../../.repo/projects/development.git/rr-cache/
lrwxrwxrwx  1 bfh bfh     40 2011-08-15 13:55 svn -> ../../.repo/projects/development.git/svn

因此,实际的git仓库只在克隆时表示一次。

保留一个裸仓库和一个普通仓库是因为清单系统的工作方式。清单系统是指定将被检出的一组git及其版本的方法。清单文件本身维护在git中,repo命令允许您随意更改该清单git的分支。

因此,为了允许快速添加和删除gits,具体取决于当前清单文件中选择了哪些gits,repo可以在.repo/projects文件夹中保留您曾经克隆过的所有gits,然后只有在清单文件的当前分支中选择它们时才将它们复制到“正常”克隆区域中。


4

这并不是两份拷贝,组件中的.git文件夹包含了指向./repo/projects中对应组件的符号链接。


0
免责声明:我对Git并不是专家。
我想你的意思是,当你检出代码时,会得到两份副本。一份是工作副本(你指定的复制位置),另一份则保存在.repo/projects中。假设我正确地解释了问题,我最好的猜测是,.repo/projects中的副本被保留,以便您可以快速比较和还原您检出的基本修订版,而无需返回服务器。我认为这是VCS非常普遍的做法。SVN通过在工作副本的所有文件夹中放置一个.svn文件夹并将基本修订版文件放入其中来实现此目的。

嗨Gary,谢谢你的回答,但这不是我要问的问题。我很了解git。因为它是一个分布式版本控制系统,所以它必须在本地克隆整个版本树,这样就可以实现正常操作而无需外部连接。为此,git在每个克隆的存储库中创建一个.git/文件夹。我不是在问.git文件夹,我是在问由名为repo的自定义脚本创建的.repo文件夹,该脚本专门用于管理包含Android源代码的相当大的git存储库层次结构。 - Bjarke Freund-Hansen

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