如何理解 .git/conf 文件中的远程 "origin" 获取设置?
how to understand remote "origin" fetch setting in .git/conf file?
我从this article学习pull & request时看到了.git/config
中的命令。
fetch = +refs/pull/*/head:refs/pull/origin/*
我打开我的配置文件,它与这个 fetch = +refs/heads/*:refs/remotes/origin/*
不同。
在我修改 fetch
设置行作为文章阅读和 运行 那些 git 命令之后:
git fetch origin
git checkout -b 1 pull/origin/1
config
文件自动追加:
[branch "1"]
remote = origin
merge = refs/pull/1/head
谁能解释一下 fetch = ...
的均值和差异设置?
为什么 [branch "1"]
会被自动追加?
谢谢
这里有很多东西要打开。让我们从头开始。
参考规范
fetch
设置的值就是所谓的 refspec,一种特殊的 Git 语法,用于映射 local 分支引用远程 个。
它采用以下形式:
<source>:<destination>
在 fetch
的情况下,<source>
是存在于 remote 存储库上的分支,而 <destination>
是它的分支应该映射到 local 存储库中。所以,例如:
fetch: +refs/heads/master:refs/remotes/origin/master
告诉 Git 将存在于远程存储库(source)中的 master
分支映射到 origin/master
中的分支本地一个(目的地)。
+
字符是可选的,意味着 Git 应该更新 destination 分支,即使它需要合并提交(这不应该发生这种情况是因为您通常不会直接提交给 origin/master
分支)。
拉取请求分支
现在您了解了 refspec 语法,让我们谈谈从 GitHub 映射 拉取请求分支 。
如您所知,每个拉取请求都会在给定存储库中分配一个唯一编号。然而,您可能不知道的是,这个数字最终成为与拉取请求相关联的分支的名称。
例如,编号为 42
的拉取请求将获得名为:
的分支引用
refs/pull/42
请注意如何在 GitHub 上托管的存储库中名为 pull
的子目录中创建拉取请求分支。
如果您想将 每个 存在于 GitHub 上的 remote 存储库中的拉取请求分支映射到相应的本地同名分支,你会说:
fetch = +refs/pull/*/head:refs/pull/origin/*
其中 *
是匹配任何名称的通配符。使用此设置,下次您在本地存储库中执行 git fetch
时,Git 将下载存在于 pull
目录中的 所有 分支引用 GitHub,并在pull/origin
.
目录下的本地仓库中创建相应的分支
这意味着对于我们的拉取请求 42
,例如,映射变为:
GitHub Your Repo
pull/42/head -> pull/origin/42
远程分支机构
请注意,pull/origin/*
分支(虽然它们确实存在于您的本地存储库中)并不意味着您可以提交。它们被称为 remote-tracking branches 并被 Git 用来跟踪远程存储库中存在的给定分支。
文档 says it best:
Remote-tracking branches are references to the state of remote branches.
更具体地说:
Think of them as bookmarks, to remind you where the branches in your remote repositories were the last time you connected to them.
您不能直接提交到远程分支。如果你想向前移动它,你必须首先创建一个 local 分支(即 only 在你的本地存储库中存在的分支)并将其关联到远程分支。从那时起,每次您在该本地分支上执行 git pull
或 git push
时,Git 都会更新相应的远程跟踪分支。
你可以用一个命令来做到这一点:
git checkout -b 42 pull/origin/42
这将创建一个名为 42
的 local 分支并将其关联到远程跟踪分支 pull/origin/42
,后者又映射到 pull/42
GitHub 上的分支。它是这样的:
Local Remote GitHub
42 -> pull/origin/42 -> pull/42
本地分支和远程分支的关系在本地仓库的配置文件中表示为:
[branch "42"]
remote = origin
merge = refs/pull/42/head
remote 分支和物理上位于另一台机器上的分支(即在 GitHub 上)之间的关系使用 refspec 表示 我们一开始看到的语法。
我从this article学习pull & request时看到了.git/config
中的命令。
fetch = +refs/pull/*/head:refs/pull/origin/*
我打开我的配置文件,它与这个 fetch = +refs/heads/*:refs/remotes/origin/*
不同。
在我修改 fetch
设置行作为文章阅读和 运行 那些 git 命令之后:
git fetch origin
git checkout -b 1 pull/origin/1
config
文件自动追加:
[branch "1"]
remote = origin
merge = refs/pull/1/head
谁能解释一下 fetch = ...
的均值和差异设置?
为什么 [branch "1"]
会被自动追加?
谢谢
这里有很多东西要打开。让我们从头开始。
参考规范
fetch
设置的值就是所谓的 refspec,一种特殊的 Git 语法,用于映射 local 分支引用远程 个。
它采用以下形式:
<source>:<destination>
在 fetch
的情况下,<source>
是存在于 remote 存储库上的分支,而 <destination>
是它的分支应该映射到 local 存储库中。所以,例如:
fetch: +refs/heads/master:refs/remotes/origin/master
告诉 Git 将存在于远程存储库(source)中的 master
分支映射到 origin/master
中的分支本地一个(目的地)。
+
字符是可选的,意味着 Git 应该更新 destination 分支,即使它需要合并提交(这不应该发生这种情况是因为您通常不会直接提交给 origin/master
分支)。
拉取请求分支
现在您了解了 refspec 语法,让我们谈谈从 GitHub 映射 拉取请求分支 。
如您所知,每个拉取请求都会在给定存储库中分配一个唯一编号。然而,您可能不知道的是,这个数字最终成为与拉取请求相关联的分支的名称。
例如,编号为 42
的拉取请求将获得名为:
refs/pull/42
请注意如何在 GitHub 上托管的存储库中名为 pull
的子目录中创建拉取请求分支。
如果您想将 每个 存在于 GitHub 上的 remote 存储库中的拉取请求分支映射到相应的本地同名分支,你会说:
fetch = +refs/pull/*/head:refs/pull/origin/*
其中 *
是匹配任何名称的通配符。使用此设置,下次您在本地存储库中执行 git fetch
时,Git 将下载存在于 pull
目录中的 所有 分支引用 GitHub,并在pull/origin
.
这意味着对于我们的拉取请求 42
,例如,映射变为:
GitHub Your Repo
pull/42/head -> pull/origin/42
远程分支机构
请注意,pull/origin/*
分支(虽然它们确实存在于您的本地存储库中)并不意味着您可以提交。它们被称为 remote-tracking branches 并被 Git 用来跟踪远程存储库中存在的给定分支。
文档 says it best:
Remote-tracking branches are references to the state of remote branches.
更具体地说:
Think of them as bookmarks, to remind you where the branches in your remote repositories were the last time you connected to them.
您不能直接提交到远程分支。如果你想向前移动它,你必须首先创建一个 local 分支(即 only 在你的本地存储库中存在的分支)并将其关联到远程分支。从那时起,每次您在该本地分支上执行 git pull
或 git push
时,Git 都会更新相应的远程跟踪分支。
你可以用一个命令来做到这一点:
git checkout -b 42 pull/origin/42
这将创建一个名为 42
的 local 分支并将其关联到远程跟踪分支 pull/origin/42
,后者又映射到 pull/42
GitHub 上的分支。它是这样的:
Local Remote GitHub
42 -> pull/origin/42 -> pull/42
本地分支和远程分支的关系在本地仓库的配置文件中表示为:
[branch "42"]
remote = origin
merge = refs/pull/42/head
remote 分支和物理上位于另一台机器上的分支(即在 GitHub 上)之间的关系使用 refspec 表示 我们一开始看到的语法。