在Git中签出子目录?

是否有可能检查Git仓库的子目录?

想象一下,我正在设置一个新的WordPress安装。 我将为我的插件和主题自定义创build两个新目录:

  • wordpress/wp-content/plugins/myplugins/
  • wordpress/wp-content/themes/mytheme/

我想通过Git维护这些目录。 在Subversion中,我将通过使用trunk/myplugins/trunk/mytheme/目录并检出子目录来完成此操作。 Git是否有办法使用单个存储库完成相同的任务?

作为一个长时间的SVN用户,我很less在Git范例中错过这个游戏。

编辑:存储不同内容的多个分支是一个有趣的方式来处理这个问题。

现在在Git 1.7中, 稀疏结帐 。

另外,请参阅“ 是否可以在不检出整个存储库的情况下执行稀疏检出? ”。

请注意,即使某些Git下载的文件不会在工作树中结束,但仍然需要您下载整个存储库。

在git中没有真正的方法。 如果您不会将同时影响两棵树的更改作为一个工作单元进行,那么没有理由为这两个树使用单个存储库。 我以为我会错过这个Subversionfunction,但是我发现创build存储库的pipe理精神开销很小(仅仅是因为存储库存储在他们的工作副本旁边,而不是要求我明确地select一些位于工作副本),我习惯于制作大量的小型单一目的存储库。

如果你坚持(或真的需要它),你可以创build一个只有mythememyplugins目录的git仓库,以及从WordPress安装中myplugins符号链接。


MDCore写道:

提交,例如mytheme会增加myplugin的版本号

请注意,如果您决定将这两个目录放在一个存储库中,那么这不是git的问题,因为git完全消除了单调增加任何forms的修订号的概念。

在git中将单个存储库放在一起的唯一标准是它是否构成一个单一的单元,即。 在你的情况下是否有变化,在每个目录中孤立地查看编辑是没有意义的。 如果您需要一次编辑两个目录中的文件并且编辑属于一个文件夹,那么它们应该是一个存储库。 如果不是的话,那就不要一起gl目。

Git确实希望你使用单独的实体的独立的存储库。

子模块

子模块不能满足将两个目录保存在一个存储库中的愿望,因为它们实际上会为每个目录强制使用一个单独的存储库,然后使用子模块将这些存储库放在另一个存储库中。 更糟糕的是,由于WordPress安装目录中的目录不是同一目录的直接子目录,也是包含许多其他文件的层次结构的一部分,因此将每个目录存储库作为统一存储库中的子模块使用并不会带来任何好处,因为统一存储库不会反映任何用例/需要。

有一件事我不喜欢稀疏结账,如果你想签出一个深度很less的子目录,你的目录结构必须包含通向它的所有目录。

我如何解决这个问题就是在不是我的工作空间的地方复制回购,然后在工作空间目录中创build符号链接到存储库中的子目录。 Git可以很好地工作,因为诸如git status之类的东西会显示相对于当前工作目录的更改文件。

实际上,对于Git而言,“狭义”或“部分”或“稀疏”结账正处于当前的重大发展之中。 请注意,您仍然拥有.git下的完整存储库。 所以,另外两个post是当前Git的状态,但是看起来我们最终可以做到稀疏的签出。 如果您对更多细节感兴趣,请查看邮件列表 – 它们正在迅速改变。

你不能检出一个版本库的单个目录,因为整个版本库是由项目根目录下的单个.git文件夹来处理的,而不是颠覆的无数的.svn目录。

在单个存储库中使用插件的问题是,对mytheme进行提交会增加myplugin的版本号,所以即使在subversion中,最好使用单独的存储库。

sub-projects的subversion范例是svn:externals ,它在git中有些翻译成子模块 (但并不完全如此,你之前使用过svn:externals)。

当你的编辑指出,你可以使用两个独立的分支来存储两个单独的目录。 这确实将它们都保存在同一个存储库中,但是仍然不能跨越两个目录树进行提交。 如果你在另一个需要改变的地方做了改变,那么你必须把它们作为两个单独的提交来完成,并且你可能会发现两个目录的一对签出可能不同步。

如果你想把这对目录看作一个单元,你可以使用'wordpress / wp-content'作为你的repo的根目录,并且在顶层使用.gitignore文件来忽略除了两个感兴趣的子目录之外的所有东西。 这可能是目前最合理的解决scheme。

据说现在已经有两年了,但在git development repo中仍然没有任何标志,也没有任何迹象表明必要的修改会到达那里。 我不会指望他们。