3

在 CVS 中,我们可以使用“rtag”命令以编程方式创建现有源代码的新分支,这不需要存储库的副本。

git 是否支持这种功能,在没有本地副本的情况下在远程 git 存储库中创建现有文件的分支?还是 git 的分布式特性排除了这一点?

(我试图节省制作存储库的独立副本所需的 20 多分钟,只是为了运行“git 分支”命令。)

编辑以获取更多信息

如果我们有一个带有“ReleaseCandidate”分支的 cvs 存储库和一个名为“makearelease.sh”的脚本,该脚本可以在一个随机的空目录中运行类似“cvs rtag -r ReleaseCandidate -b Release1p0”的命令并创建一个新的名为“Release1p0”的分支包含“ReleaseCandidate”分支中的所有文件,它不需要来自存储库或 CVS 分支“ReleaseCandidate”的文件的任何本地副本。

4

2 回答 2

5

在 git 中,所有存储库都是本地的,总是. 你可以有一个到本地存储库的远程接口(例如,这就是 github 的 API 给你的:repo 对 github 来说是本地的,而 API 是一个接口),但 repo 本身是本地的。所以没有“远程仓库”这样的东西,就你在这里的意思而言,只是一个“远程接口”。

也就是说,可以使用内置的远程接口(例如,git 通过 ssh 使用的推送协议)来创建新的分支或轻量级标签,而实际上不需要本地克隆,因为推送协议通过接收远程的 refs 开始(a la git ls-remote),然后执行推送的系统可以发送对象包、引用更新或两者兼而有之。您可以使用已知(来自收到的参考)头部 SHA1 发送一个refs/heads/foorefs/tags/foo引用并将其称为好......但这很容易出错,因为您可能会失去与其他人添加新提交、分支或标记的竞争,错误的提交。因此,git 没有内置任何东西来执行此操作。

所以,你可以写一个,但可能需要 20 多分钟。:-)

于 2013-11-05T21:51:35.697 回答
0

我不确定你在问什么。如果您问是否可以在不复制文件的情况下创建 repo 的新分支,答案是肯定的。git checkout -b. 这根本不复制任何文件。

如果您询问是否可以创建远程存储库的部分版本,答案是否定的。每个 git repo 都是 repo 的完整克隆。没有部分存储库的概念。这是 git 内部需要的。(为了构建树的 SHA-1 哈希,它必须对树中的所有文件进行哈希。如果您尝试创建树的部分副本,那么它的 SHA-1 哈希将不同于您尝试部分克隆的分支。实际上,它们只是指向同一祖先的不同提交。)

如果您问是否可以让您的本地工作目录看起来像远程非裸仓库的工作目录而不下载所有 git 的历史记录,答案是肯定的(编辑:使用“浅克隆”,感谢您的更正) ,但它并不能帮助您以您想要的方式与遥控器进行交互。

于 2013-11-05T21:09:14.543 回答