为了更好地理解Git的工作原理,我想检查远程存储库在与本地存储库交互时经历的更改(通过提取,推送等)。
假设我的本地文件系统中有两个Git存储库A和B.是否可以将A指定为关于B的远程存储库,以便例如在B中执行的所有push
命令将被推送到A?
是否可以使用clone
命令从A克隆新的本地存储库C?
答案 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-value
,remote.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.A
从B
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.push
和remote.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.fetch
和A
,这两个可以将一个Git连接到另一个Git,但是那时它们不会交互:这些只是获取公共引用并打印它们out(git ls-remote
)或将它们与本地存储库(git remote show
)中的设置进行比较。
&#34;获取公开引用&#34; step是git ls-remote
和git remote show
中的第一个井,第二个,也许是步骤,因为你的Git(你是那个正在运行或推动的人)想要决定要获取什么或推送什么,这些往往需要知道其他Git中存在哪些引用。 (推送似乎可能不关心什么&#34;他们&#34;有,但它适用于git fetch
和git push
,至少。第一个步骤,如果你想把这个称为第二步,就是建立通用协议功能,这是所有&#34; smart&#34;传输的功能,因为协议随着时间的推移有所发展。)