Android 源代码由repo管理。使用 repo 同步时,.repo/projects/
会创建一个名为的目录,其中包含所有 git 存储库,也直接在当前工作目录中检出,只是裸 git 格式。
repo 维护裸 git 存储库的目的是什么?repo 是如何使用这些裸存储库的?
(注意:澄清:当我写“repo”时,我不是在谈论 git 存储库,我是在专门谈论repo
由/for Android 创建的脚本,用于维护包含 Android 源的所有 git 存储库。)
Android 源代码由repo管理。使用 repo 同步时,.repo/projects/
会创建一个名为的目录,其中包含所有 git 存储库,也直接在当前工作目录中检出,只是裸 git 格式。
repo 维护裸 git 存储库的目的是什么?repo 是如何使用这些裸存储库的?
(注意:澄清:当我写“repo”时,我不是在谈论 git 存储库,我是在专门谈论repo
由/for Android 创建的脚本,用于维护包含 Android 源的所有 git 存储库。)
在使用 Android repo manifest 系统一段时间后,我想我现在明白了.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 的原因是因为清单系统的工作方式。清单系统是一种指定要签出的 git 集合以及将在哪个版本中签出的方法。清单文件本身在 git 中维护,repo 命令允许您随意更改该清单 git 的分支。
因此,为了允许根据清单文件中当前选择的内容以(快速)方式删除和添加 git,repo 可以将您曾经克隆的所有 git 保留在.repo/projects
文件夹中,然后仅将它们复制到“正常”克隆如果在清单文件的当前分支中选择了它们,则区域。
它不是两个副本,.git
组件中的文件夹包含指向相应组件的符号链接./repo/projects
免责声明:我远非 Git 专家。
我认为您是在说,当您结帐代码时,您会得到两份副本。一个是工作副本(您指定它应该被复制到的地方),另一个保存在 .repo/projects 中。假设我已经正确解释了这个问题,我最好的猜测是保留 .repo/projects 中的副本,以便您可以快速进行比较并恢复到您签出的基本修订版,而无需返回服务器。我认为 VCS 这样做很常见。SVN 通过在工作副本的所有文件夹中放置一个 .svn 文件夹并将基本修订文件放入其中来做到这一点。