假设我在源代码管理中有一个带有很多子目录的项目,其中很多都是我目前不需要的。
我想创建一个仅包含整个树的一部分的工作副本,它仍然保持更改,提交和推送它们的能力。
这可能吗?如果可以,我该怎么做?
我仍在决定是否选择集市或善变,所以关于其中任何一个的答案都会有所帮助。
编辑:实际上,git的解决方案也很有用。
答案 0 :(得分:14)
据我所知,克隆树的子集是不可能的,但还有其他可能性。
Git :命令git clone
有一个--depth
标记:
--depth <depth>
创建一个浅层克隆,其历史记录被截断为指定的修订版本数。浅存储库有许多限制(您不能克隆或获取它,也不能从中推送或插入它),但如果您只对历史悠久的大型项目的近期历史感兴趣并且希望将修补程序作为补丁发送。
Bazaar :--lightweight
命令的标志checkout
仅下载工作目录而不是整个历史记录,并节省带宽和磁盘空间。仍然支持所有操作,但需要网络连接才能执行它们。
我不知道Merurial是否具有此功能。
答案 1 :(得分:10)
如果你已经拥有了一个存储库并且你想要这样做,那将会很痛苦。
如果您要使用全新的存储库执行此操作,您可能需要查看Mercurial的新subrepos。
基本上,您为某些目录创建独立存储库:
myproject/
.hg/
source code/
... files here ...
documentation/ (subrepo)
.hg/
... files here ...
graphics/ (subrepo)
.hg/
... files here ...
这会将项目的不同部分隔离在不同的存储库中。 “包含”repo(本例中为myproject)跟踪每次提交时子实例的修订版本。我提到的subrepo wiki页面解释得很好。
答案 2 :(得分:6)
从this wiki page判断,此功能尚未在Mercurial中实现,但是有一个extension可以通过“转换”存储库或其部分来实现您想要的大致,而不是实际的分支。由于它可以从Hg转换为Hg,因此它可以作为部分克隆。这是你需要的吗?
答案 3 :(得分:4)
在大多数DCVS中,规则是“1个项目== 1个存储库”。没有“子项目”的概念(与Subversion不同,您可以在其中查看子树并对其进行处理)。
主要原因是您的“项目”包含根文件夹中整个存储库的副本。如果您可以在子文件夹中创建整个存储库的副本,那么事情会变得非常复杂。
从好的方面来说,创建工作副本是一种快速操作(除非底层文件系统很慢)。
答案 4 :(得分:4)
在git中,您可以使用git subtree,它允许您仅为特定子项目提取“虚拟”存储库,然后在子项目中进行更改,然后将这些更改合并回来。
答案 5 :(得分:3)
对于Bazaar,您有嵌套树:http://bazaar-vcs.org/NestedTreesDesign,允许您在子项目中拆分大项目。
我还没有使用过这个功能,所以我不知道它有多好用。
你也可以使用--hardlink分支以避免复制一堆文件(不确定它是否适用于Windows ...),没有历史记录的分支(较轻的分支)或没有工作树的分支(没有文件,只有历史记录)