如何将本地存储库指定为另一个本地存储库的远程存储库?

时间:2017-04-13 08:47:11

标签: git git-push git-clone git-remote git-fetch

为了更好地理解Git的工作原理,我想检查远程存储库在与本地存储库交互时经历的更改(通过提取,推送等)。

  1. 假设我的本地文件系统中有两个Git存储库A和B.是否可以将A指定为关于B的远程存储库,以便例如在B中执行的所有push命令将被推送到A?

  2. 是否可以使用clone命令从A克隆新的本地存储库C?

2 个答案:

答案 0 :(得分:3)

你的两个问题的答案是:是的!

像往常一样使用Git命令,并将另一个存储库的完整路径或相对路径作为参数<repository>传递。

例如,使用:

git clone ../repoA repoB

将存储库../repoA克隆到当前目录的子目录repoB中。

详细了解需要远程存储库URL的Git命令中的ways to specify an URL

答案 1 :(得分:2)

就Git本身而言,所有Git存储库都是 peer 。此外,任何存储库至少在逻辑上完全是自包含的(你可以使用#34;备用对象位置和#34;这使得它们物理相互依赖,但是让它们变得独立。现在忽略它。)

  

假设我的本地文件系统中有两个Git存储库A和B.是否可以将A指定为关于B的远程存储库,以便例如在B中执行的所有推送命令将被推送到A?

请稍等一下,让我们看一下 remote 的定义。这个术语有点过载(我们可以谈论一个远程对等体&#34;或者#34;某些远程主机上的Git&#34;,但是每个Git存储库通过它自己的本地配置来定义)文件(git config),某些数字 - 可能为零遥控器

遥控器只是一个名称,例如origin或我们的A。该名称将成为稍长的名称的一部分,用作键/值对:remote.A.key1 = some-valueremote.A.key2 = another value,依此类推。

因此,在存储库B中,我们可以定义一个名为A的远程,设置其中一些键/值对。至少需要一个键/值对(以便创建[remote "A"]部分),url设置适用于此:

cd B
git config remote.A.url <some url here>

Repo B现在有一个名为A的遥控器。该网址可以只是一个简单的路径,也可以是ssh://host.name/path/to/repo.git,或以git://http://https://file://开头的内容。

URL需要访问可以读取和/或写入其他存储库的Git。如果URL是本地文件系统路径,那么您自己的Git将扮演这两种角色,但至少在逻辑上,假装与代表另一个存储库的单独Git进行通信。

如果remote.AB git fetch运行 ,则第二个A条目非常重要。这将提供默认的refspec,通常为:

git config --add remote.A.fetch '+refs/heads/*:refs/remotes/A/*'

请注意,可能有多个fetch refspecs以这种方式定义(这是在此使用--add的原因)。当您在存储库B中时,如果您现在运行git fetch git push并使用名称A作为远程,您的Git将调用另一个Git,它将从A发送对象(如果你正在提取)或接收发往A的对象(如果你正在推送)。

请注意,默认 fetch refspec或refspecs来自git config --get-all remote.A.url,但默认推送 refspec或refspecs更复杂(取决于push.default },和/或如果已设置,remote.A.pushremote.A.mirror设置。

还有一个可选的remote.A.pushurl设置。如果设置了此项,则git push A不会连接到remote.A.url地址,而是连接到remote.A.pushurl地址。

(还有remote.pushDefault:如果您在未指定远程的情况下运行git push,则remote.pushDefault会覆盖当前分支{{1}设置,但不是branch.branch.remote设置。这一切都非常复杂,跟踪the git config documentation的唯一方法就是咨询{。}}。

请注意,您根本没有 来使用指定的遥控器!你可以:

branch.branch.pushRemote

git fetch <url> <refspec>

使用像git push <url> <refspec> 这样的命名远程的好处是,你获得了所有这些配置条目,为你做了一些奇特的事情,比如记住复杂的URL和复杂的默认refspecs。此外,这使您可以:

A

这意味着无论何时您在分支机构git config branch.evil.remote A git config branch.zorg.remote A evil上,您的Git都应默认连接到远程zorg。将其与A设置和默认url设置相结合,可在fetch名称空间中设置远程跟踪分支,您可以方便地与远程Git通信,是否非常偏远&#34; (完全在另一台机器上)或&#34;完全没有远程&#34; (在你自己的机器上) - 虽然远程跟踪分支的东西对于一个远程遥控的遥控器来说显然不那么重要了。

(配置refs/remotes/A/设置是为该分支配置上游的一半工作。另一半是通过配置branch.name.remote完成的。使用{{1} },就像你在你的分支branch.name.merge上做的那样,同时设置两个。)

  

是否可以使用clone命令从A克隆新的本地存储库C?

是:git branch --set-upstream-to=A/zorg的语法是zorg。与以前一样,URL可以只是一个简单的路径名。如果是,则默认启用git clone选项。

克隆存储库会自动在新的Git存储库中创建一个远程。默认情况下,此遥控器名为git clone [ options ] url [ directory ],并具有两个默认设置:

--local

当然是任何遥控器的推荐设置。请注意,origin设置的refspec值的右侧会在其中嵌入遥控器的名称:此处为remote.origin.url = <url> remote.origin.fetch = +refs/heads/*:refs/remotes/origin/* ,而fetch则为{origin 1}}。

  

...我想检查远程存储库在与本地存储库交互时经历的更改(通过提取,推送等)。

确实没有&#34;等等#34;:抓取和推送它。您可以运行remote.A.fetchA,这两个可以将一个Git连接到另一个Git,但是那时它们不会交互:这些只是获取公共引用并打印它们out(git ls-remote)或将它们与本地存储库(git remote show)中的设置进行比较。

&#34;获取公开引用&#34; step是git ls-remotegit remote show中的第一个井,第二个,也许是步骤,因为你的Git(你是那个正在运行或推动的人)想要决定要获取什么推送什么,这些往往需要知道其他Git中存在哪些引用。 (推送似乎可能不关心什么&#34;他们&#34;有,但它适用于git fetchgit push,至少。第一个步骤,如果你想把这个称为第二步,就是建立通用协议功能,这是所有&#34; smart&#34;传输的功能,因为协议随着时间的推移有所发展。)