?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
git-fetch - 從另一個(gè)存儲(chǔ)庫下載對(duì)象和引用
git fetch [<options>] [<repository> [<refspec>…]]git fetch [<options>] <group>git fetch --multiple [<options>] [(<repository> | <group>)…]git fetch --all [<options>]
從一個(gè)或多個(gè)其他存儲(chǔ)庫獲取分支和/或標(biāo)簽(統(tǒng)稱為“參考”),以及完成其歷史記錄所需的對(duì)象。遠(yuǎn)程跟蹤分支已更新(請(qǐng)參閱下面的 <refspec> 描述以了解如何控制此行為)。
默認(rèn)情況下,還會(huì)提取指向正在提取的歷史記錄的任何標(biāo)記; 其效果是獲取指向您感興趣的分支的標(biāo)記。可以使用 --tags 或 --no-tags 選項(xiàng)或通過配置遠(yuǎn)程。<name> .tagOpt 來更改此默認(rèn)行為。通過使用顯式提取標(biāo)簽的 refspec,您可以獲取不指向您感興趣的分支的標(biāo)簽。
git fetch
可以從單個(gè)指定的存儲(chǔ)庫或 URL 中獲取數(shù)據(jù),也可以在給定 <group> 的情況下同時(shí)從多個(gè)存儲(chǔ)庫中獲取,并且配置文件中存在遠(yuǎn)程。<group> 條目。(請(qǐng)參閱 git-config [1])。
如果未指定遠(yuǎn)程,默認(rèn)情況下origin
將使用遠(yuǎn)程,除非為當(dāng)前分支配置了上游分支。
被讀取的引用的名稱以及它們指向的對(duì)象名稱將被寫入.git/FETCH_HEAD
。這些信息可以被腳本或其他 git 命令使用,例如 git-pull [1]。
--all
獲取所有遠(yuǎn)端。
-a --append
追加 refs 的 ref 名稱和對(duì)象名稱到現(xiàn)有的內(nèi)容.git/FETCH_HEAD
。如果沒有這個(gè)選項(xiàng),舊的數(shù)據(jù).git/FETCH_HEAD
將被覆蓋。
--depth=<depth>
將提取限制為從每個(gè)遠(yuǎn)程分支歷史記錄的提示中指定的提交數(shù)量。如果獲取到使用git clone
和--depth=<depth>
選項(xiàng) 創(chuàng)建的shallow
存儲(chǔ)庫(請(qǐng)參閱 git-clone [1]),請(qǐng)將歷史記錄加深或縮短為指定的提交數(shù)。深化提交的標(biāo)簽不會(huì)被提取。
--deepen=<depth>
與 --depth 相似,只是它指定了來自當(dāng)前淺層邊界而不是每個(gè)遠(yuǎn)程分支歷史記錄的提示的提交數(shù)。
--shallow-since=<date>
加深或縮短淺儲(chǔ)存庫的歷史記錄以在 <date> 之后包含所有可訪問的提交。
--shallow-exclude=<revision>
加深或縮短淺儲(chǔ)存庫的歷史記錄以排除可從指定遠(yuǎn)程分支或標(biāo)記訪問的提交。該選項(xiàng)可以多次指定。
--unshallow
如果源存儲(chǔ)庫已完成,請(qǐng)將淺層存儲(chǔ)庫轉(zhuǎn)換為完整存儲(chǔ)庫,以消除淺存儲(chǔ)庫施加的所有限制。
如果源存儲(chǔ)庫較淺,則盡可能多地獲取,以便當(dāng)前存儲(chǔ)庫具有與源存儲(chǔ)庫相同的歷史記錄。
--update-shallow
默認(rèn)情況下,從淺倉庫中獲取時(shí),git fetch
拒絕需要更新 .git / shallow 的引用。該選項(xiàng)更新 .git / shallow 并接受此類參考。
--dry-run
顯示將做什么,不做任何改變。
-f --force
當(dāng)git fetch
與<rbranch>:<lbranch>
refspec 一起使用時(shí),它拒絕更新本地分支,<lbranch>
除非<rbranch>
它獲取的遠(yuǎn)程分支是后代<lbranch>
。該選項(xiàng)將覆蓋該檢查。
-k --keep
保持下載的包。
--multiple
允許指定幾個(gè) <repository> 和 <group> 參數(shù)。沒有 <refspec>s 可能被指定。
-p --prune
在提取之前,請(qǐng)刪除遠(yuǎn)程不再存在的所有遠(yuǎn)程跟蹤參考。如果標(biāo)簽僅由于默認(rèn)標(biāo)簽自動(dòng)跟隨或由于 --tags 選項(xiàng)而被提取,則標(biāo)簽不會(huì)被修剪。但是,如果由于明確的 refspec(在命令行或遠(yuǎn)程配置中,例如,如果遠(yuǎn)程使用 --mirror 選項(xiàng)克?。┒@取標(biāo)記,則它們也將受到修改。
-n --no-tags
默認(rèn)情況下,指向從遠(yuǎn)程存儲(chǔ)庫下載的對(duì)象的標(biāo)簽將在本地獲取并存儲(chǔ)。該選項(xiàng)將禁用此自動(dòng)標(biāo)記。遠(yuǎn)程的默認(rèn)行為可以通過遠(yuǎn)程。<name> .tagOpt 設(shè)置指定。請(qǐng)參閱 git-config [1]。
--refmap=<refspec>
在獲取命令行中列出的 ref 時(shí),使用指定的 refspec(可以多次提供)將 ref 映射到遠(yuǎn)程跟蹤分支,而不是remote.*.fetch
遠(yuǎn)程存儲(chǔ)庫的配置變量的值。有關(guān)詳細(xì)信息,請(qǐng)參閱“配置遠(yuǎn)程跟蹤分支”一節(jié)。
-t --tags
從遠(yuǎn)程獲取所有標(biāo)簽(即,將遠(yuǎn)程標(biāo)簽獲取refs/tags/*
到具有相同名稱的本地標(biāo)簽中),除此之外的任何其他內(nèi)容都將被提取。即使 --prune 被使用(盡管如果標(biāo)簽也是明確的 refspec 的目的地,可能會(huì)被修剪,請(qǐng)參閱--prune
),但單獨(dú)使用此選項(xiàng)不會(huì)使標(biāo)簽遭到修剪。
--recurse-submodules=yes|on-demand|no
此選項(xiàng)控制是否以及在什么條件下也應(yīng)提取填充的子模塊的新提交。它可以用作布爾選項(xiàng)來完全禁用設(shè)置為no
或設(shè)置為無條件遞歸到所有已填充的子模塊時(shí)的遞歸yes
,這是使用此選項(xiàng)時(shí)沒有任何值的默認(rèn)設(shè)置。使用on-demand
僅遞歸到填充的子模塊,當(dāng)上層項(xiàng)目檢索提交,更新子模塊的參考一犯,是不是已經(jīng)在本地子模塊克隆。
-j --jobs=<n>
用于提取子模塊的并行子項(xiàng)的數(shù)量。每個(gè)子模塊都將從不同的子模塊中獲取,從而獲取多個(gè)子模塊的速度會(huì)更快。默認(rèn)情況下,子模塊將一次取一個(gè)。
--no-recurse-submodules
禁用遞歸獲取子模塊(這與使用該--recurse-submodules=no
選項(xiàng)具有相同的效果)。
--submodule-prefix=<path>
在信息消息(例如“獲取子模塊foo”)中打印路徑前加上 <path> 。此選項(xiàng)在子模塊上遞歸時(shí)用于內(nèi)部。
--recurse-submodules-default=yes|on-demand
此選項(xiàng)在內(nèi)部用于為 --recurse-submodules 選項(xiàng)臨時(shí)提供非負(fù)的默認(rèn)值。所有其他配置獲取子模塊遞歸的方法(例如 gitmodules [5]和 git-config [1]中的設(shè)置)將覆蓋此選項(xiàng),就像直接指定 --no-recurse 子模塊一樣。
-u --update-head-ok
默認(rèn)情況下git fetch
拒絕更新對(duì)應(yīng)于當(dāng)前分支的頭部。此標(biāo)志禁用檢查。這純粹是供內(nèi)部使用git pull
來溝通git fetch
,除非你正在實(shí)施自己的瓷器,否則你不應(yīng)該使用它。
--upload-pack <upload-pack>
當(dāng)給出并且從中獲取的存儲(chǔ)庫被處理時(shí)git fetch-pack
,--exec=<upload-pack>
被傳遞給該命令以指定在另一端運(yùn)行的命令的非默認(rèn)路徑。
-q --quiet
通過 - 安靜的 git-fetch-pack 和沉默任何其他內(nèi)部使用的 git 命令。進(jìn)度未報(bào)告給標(biāo)準(zhǔn)錯(cuò)誤流。
-v --verbose
詳細(xì)。
--progress
當(dāng)連接到終端時(shí),默認(rèn)情況下,標(biāo)準(zhǔn)錯(cuò)誤流中會(huì)報(bào)告進(jìn)度狀態(tài),除非指定了 -q 。即使標(biāo)準(zhǔn)錯(cuò)誤流未定向到終端,此標(biāo)志也會(huì)強(qiáng)制進(jìn)度狀態(tài)。
-4 --ipv4
僅使用 IPv4 地址,忽略 IPv6 地址。
-6 --ipv6
僅使用 IPv6 地址,忽略 IPv4 地址。
<repository>
作為提取或拉取操作源的“遠(yuǎn)程”存儲(chǔ)庫。此參數(shù)可以是 URL(請(qǐng)參閱下面的 GIT URLS 部分)或遠(yuǎn)程名稱(請(qǐng)參閱下面的 REMOTES 部分)。
<group>
名稱指的是存儲(chǔ)庫列表,作為配置文件中的遠(yuǎn)程數(shù)據(jù) <group> 的值。(請(qǐng)參閱 git-config [1])。
<refspec>
指定要獲取哪些引用以及哪些本地引用要更新。當(dāng)命令行中沒有 <refspec> 時(shí),remote.<repository>.fetch
取而代之的是從變量中讀?。▍⒁娤旅娴?CONFIGURED REMOTE-TRACKING BRANCHES)。
一個(gè) <refspec> 參數(shù)的格式是一個(gè)可選的 plus +
,后跟 source <src>,后跟一個(gè)冒號(hào):
,后跟目標(biāo) ref <dst> 。當(dāng) <dst>為空時(shí),可以省略冒號(hào)。<src> 通常是 ref,但它也可以是拼寫完整的十六進(jìn)制對(duì)象名稱。
tag <tag>
意味著相同refs/tags/<tag>:refs/tags/<tag>
; 它請(qǐng)求將所有內(nèi)容都提取到給定的標(biāo)簽。
匹配 <src>的遠(yuǎn)程 ref 被取出,如果 <dst>不是空字符串,匹配它的本地引用使用 <src> 進(jìn)行快速轉(zhuǎn)發(fā)。如果使用可選的 plus +
,即使不引起快速更新,本地 ref 也會(huì)被更新。
Note | When the remote branch you want to fetch is known to be rewound and rebased regularly, it is expected that its new tip will not be descendant of its previous tip (as stored in your remote-tracking branch the last time you fetched). You would want to use the + sign to indicate non-fast-forward updates will be needed for such branches. There is no way to determine or declare that a branch will be made available in a repository with this behavior; the pulling user simply must know this is the expected usage pattern for a branch. |
---|
通常,URL 包含有關(guān)傳輸協(xié)議,遠(yuǎn)程服務(wù)器地址和存儲(chǔ)庫路徑的信息。根據(jù)傳輸協(xié)議,這些信息可能不存在。
Git 支持 ssh,git,http 和 https 協(xié)議(另外,ftp 和 ftps 可用于提取,但效率低下,不推薦使用;不要使用它)。
本地傳輸(即 git:// URL)不進(jìn)行身份驗(yàn)證,因此在不安全的網(wǎng)絡(luò)上應(yīng)謹(jǐn)慎使用。
以下語法可以與它們一起使用:
ssh://user@host.xz:port/path/to/repo.git/
git://host.xz:port/path/to/repo.git/
https://host.xz:port/path/to/repo.git/
ftps://host.xz:port/path/to/repo.git/
ssh 協(xié)議也可以使用另一種類似 scp 的語法:
user@host.xz:path / to / repo.git / 只有在第一個(gè)冒號(hào)前沒有斜線時(shí)才能識(shí)別此語法。這有助于區(qū)分包含冒號(hào)的本地路徑。例如,本地路徑foo:bar
可以被指定為絕對(duì)路徑或./foo:bar
避免被誤解為 ssh url 。ssh 和 git 協(xié)議還支持?用戶名擴(kuò)展:
ssh://user@host.xz:port/~user/path/to/repo.git/
git://host.xz:port/~user/path/to/repo.git/
user@host.xz:/~user/path/to/repo.git/
對(duì)于本地支持的本地存儲(chǔ)庫,可以使用以下語法:
/path/to/repo.git/
file:///path/to/repo.git/
這兩種語法大多是相同的,除了克隆時(shí),前者意味著 --local 選項(xiàng)。有關(guān)詳細(xì)信息,請(qǐng)參閱 git-clone [1]。
當(dāng) Git 不知道如何處理某個(gè)傳輸協(xié)議時(shí),它會(huì)嘗試使用remote-<transport>
遠(yuǎn)程助手(如果存在)。要顯式請(qǐng)求遠(yuǎn)程助手,可以使用以下語法:
<transport> :: <address>其中<address>可能是一個(gè)路徑,一個(gè)服務(wù)器和路徑,或者是由被調(diào)用的特定遠(yuǎn)程助手識(shí)別的任意類似URL的字符串。有關(guān)詳細(xì)信息,請(qǐng)參閱gitremote-helpers [1]。如果存在大量名稱相似的遠(yuǎn)程存儲(chǔ)庫,并且您希望為它們使用不同的格式(例如,您使用的URL將被重寫為可工作的URL),則可以創(chuàng)建一個(gè)形式的配置部分:[url] <actual url base>“] insteadOf = <other url base>例如,使用:[url:git://git.host.xz/]] insteadOf = host。 xz:/ path / to / insteadOf = work:像“work:repo.git”或類似“host.xz:/path/to/repo.git”的URL將在任何需要URL為“混帳://git.host。<repository>
論據(jù):
Git 配置文件中的遠(yuǎn)程:$GIT_DIR/config
,
目錄中的$GIT_DIR/remotes
文件,或
目錄中的$GIT_DIR/branches
文件。
所有這些也允許你從命令行中省略 refspec,因?yàn)樗鼈兌及?git 將默認(rèn)使用的 refspec 。
您可以選擇提供您之前使用 git-remote [1],git-config [1] 或者通過手動(dòng)編輯$GIT_DIR/config
文件來配置的遠(yuǎn)程名稱。此遠(yuǎn)程的 URL 將用于訪問存儲(chǔ)庫。當(dāng)您不在命令行中提供 refspec 時(shí),將默認(rèn)使用此遠(yuǎn)程程序的 refspec 。配置文件中的條目將如下所示:
[remote "<name>"] url = <url> pushurl = <pushurl> push = <refspec> fetch = <refspec>
<pushurl>
僅用于推動(dòng)。它是可選的,默認(rèn)為<url>
。
$GIT_DIR/remotes
中的命名文件您可以選擇提供文件的名稱$GIT_DIR/remotes
。該文件中的 URL 將用于訪問存儲(chǔ)庫。當(dāng)你不在命令行上提供
refspec 時(shí),這個(gè)文件中的 refspec 將被用作默認(rèn)值。該文件應(yīng)該具有以下格式:
URL: one of the above URL format Push: <refspec> Pull: <refspec>
Push:
行被使用git push
,Pull:
行被git pull
和使用git fetch
??梢詾槎鄠€(gè)分支映射指定多個(gè)Push:
和Pull:
行。
$GIT_DIR/branches
中的命名文件您可以選擇提供$GIT_DIR/branches
文件的名稱。該文件中的 URL 將用于訪問存儲(chǔ)庫。該文件應(yīng)該具有以下格式:
<url>#<head>
<url>
是必須的; #<head>
是可選的。
根據(jù)操作,如果你沒有在命令行中提供一個(gè)參數(shù),那么 git 將使用下列其中一個(gè)參考規(guī)范。<branch>
這個(gè)文件中的名稱$GIT_DIR/branches
和<head>
默認(rèn)master
。
git fetch 使用:
refs/heads/<head>:refs/heads/<branch>
git push 使用:
HEAD:refs/heads/<head>
您經(jīng)常通過定期和反復(fù)地從相同的遠(yuǎn)程存儲(chǔ)庫進(jìn)行交互來進(jìn)行交互。為了跟蹤這種遠(yuǎn)程存儲(chǔ)庫的進(jìn)度,git fetch
可以配置remote.<repository>.fetch
配置變量。
通常這樣的變量可能看起來像這樣:
[remote "origin"] fetch = +refs/heads/*:refs/remotes/origin/*
這種配置有兩種使用方式:
在git fetch
沒有指定要在命令行上獲取哪些分支和/或標(biāo)簽的情況下運(yùn)行時(shí)(例如,git fetch origin
或者git fetch
,remote.<repository>.fetch
值被用作refspecs),它們指定要獲取哪些引用以及哪些本地引用要更新。上面的例子將獲取存在于origin
(即與值的左側(cè)相匹配的任何 ref)中的所有分支,refs/heads/*
并更新refs/remotes/origin/*
層次結(jié)構(gòu)中相應(yīng)的遠(yuǎn)程跟蹤分支。
當(dāng)git fetch
與明確的分支和/或標(biāo)簽運(yùn)行在命令行,例如上取git fetch origin master
中,<Refspec> s 上的命令行給出確定什么是要被取出(例如master
在該示例中,這是一種短手master:
,其反過來的意思是“取master
分支,但我并沒有明確說什么遠(yuǎn)程跟蹤分支的命令行用它來更新”),示例命令將獲取only
的master
分支。這些remote.<repository>.fetch
值確定哪個(gè)遠(yuǎn)程跟蹤分支(如果有的話)被更新。以這種方式使用時(shí),這些remote.<repository>.fetch
值在決定what
獲取時(shí)沒有任何影響(即,在命令行列表 refspecs 時(shí),這些值不會(huì)用作 refspecs); 他們只是用來決定where
通過充當(dāng)映射來存儲(chǔ)被提取的 ref 。
remote.<repository>.fetch
通過--refmap=<refspec>
在命令行中提供參數(shù),可以覆蓋后面這些值的使用。
“git fetch”的輸出取決于所使用的傳輸方法; 本節(jié)描述通過 Git 協(xié)議(本地或通過 ssh)和 Smart HTTP 協(xié)議獲取時(shí)的輸出。
提取狀態(tài)以表格形式輸出,每行代表單個(gè)參考的狀態(tài)。每一行的格式如下:
<flag> <summary> <from> -> <to> [<reason>]
只有在使用 --verbose 選項(xiàng)時(shí)才會(huì)顯示最新參考資料的狀態(tài)。
在緊湊輸出模式下,使用配置變量 fetch.output 指定,如果全部<from>
或<to>
在另一個(gè)字符串中找到,它將用*
另一個(gè)字符串替換。例如,master -> origin/master
變成master -> origin/*
。
標(biāo)志
一個(gè)字符表示 ref 的狀態(tài):
(空格)
成功取得快進(jìn);
+
成功強(qiáng)制更新;
-
為成功刪除 ref;
t
為成功更新標(biāo)簽;
*
為成功獲取新的 ref ;
!
對(duì)于被拒絕或未能更新的裁判; 和
=
對(duì)于那些最新的并且不需要抓取的 ref 來說。
總結(jié)
對(duì)于成功獲取的 ref,摘要以適合用作參數(shù)的形式git log
(<old>..<new>
在大多數(shù)情況下以及<old>...<new>
強(qiáng)制非快進(jìn)更新)顯示 ref 的舊值和新值。
從
正在從中獲取遠(yuǎn)程引用的名稱,減去其refs/<type>/
前綴。在刪除的情況下,遠(yuǎn)程參考的名稱是“(無)”。
至
正在更新的本地引用的名稱,減去它的refs/<type>/
前綴。
原因
一個(gè)可讀的解釋。在成功獲取 ref 的情況下,不需要解釋。對(duì)于失敗的 ref,描述失敗的原因。
更新遠(yuǎn)程跟蹤分支:$ git fetch origin 以上命令從遠(yuǎn)程 refs / heads / namespace 復(fù)制所有分支,并將它們存儲(chǔ)到本地 refs / remotes / origin / 命名空間,除非使用分支。<name> .fetch 選項(xiàng)指定一個(gè)非默認(rèn)的 refspec 。
明確使用 refspecs:
$ git fetch origin + pu:pu maint:tmp
這將更新(或根據(jù)需要?jiǎng)?chuàng)建)分支,pu
和tmp
通過從分支(分別)pu
和maint
遠(yuǎn)程存儲(chǔ)庫中獲取來更新本地存儲(chǔ)庫。
pu
是沒有快進(jìn)的,因?yàn)樗且粋€(gè)加號(hào)前綴,分支將被更新; tmp
不會(huì)是。
查看遠(yuǎn)程分支,而不在本地存儲(chǔ)庫中配置遠(yuǎn)程程序:$ git fetch git://git.kernel.org/pub/scm/git/git.git maint $ git log FETCH_HEAD 第一個(gè)命令maint
從存儲(chǔ)庫中獲取分支在git://git.kernel.org/pub/scm/git/git.git
和第二個(gè)命令使用FETCH_HEAD
用 git-log [1] 檢查分支。抓取的對(duì)象最終會(huì)被 git 的內(nèi)置管家刪除(參見 git-gc [1])。安全性抓取和推送協(xié)議并不旨在防止一方從另一個(gè)存儲(chǔ)庫竊取數(shù)據(jù),而這些數(shù)據(jù)并不是要共享的。如果您需要保護(hù)私密數(shù)據(jù)免受惡意對(duì)等攻擊,則最佳選擇是將其存儲(chǔ)在另一個(gè)存儲(chǔ)庫中。這適用于客戶端和服務(wù)器。特別是,服務(wù)器上的名稱空間對(duì)讀取訪問控制無效; 您應(yīng)該只允許對(duì)讀取訪問整個(gè)存儲(chǔ)庫的用戶可以信任的名稱空間的讀取權(quán)限。已知的攻擊媒介如下:
victim 發(fā)送“有”線廣告其具有的對(duì)象的 ID,這些對(duì)象的 ID 沒有明確地意圖共享,但是如果對(duì)等方也擁有它們,則可用于優(yōu)化傳送。攻擊者選擇一個(gè)對(duì)象 ID X 來竊取并向 X 發(fā)送一個(gè) ref,但不需要發(fā)送 X 的內(nèi)容,因?yàn)槭芎φ咭呀?jīng)擁有了它?,F(xiàn)在受害者認(rèn)為攻擊者擁有 X,并且稍后將X的內(nèi)容發(fā)送回攻擊者。(這種攻擊對(duì)于客戶端來說在服務(wù)器上執(zhí)行起來是最直接的,通過在客戶端有權(quán)訪問的命名空間中創(chuàng)建對(duì) X 的引用,然后獲取它,服務(wù)器在客戶端上執(zhí)行它的最可能方式是“合并“X 到一個(gè)公共分支,并希望用戶在這個(gè)分支上做額外的工作,并將其推回服務(wù)器而不會(huì)注意到合并。)
和#1一樣,攻擊者選擇一個(gè)對(duì)象 ID X 來竊取。受害者發(fā)送攻擊者已經(jīng)擁有的對(duì)象 Y,并且攻擊者錯(cuò)誤地聲稱具有 X 而不是 Y,所以受害者發(fā)送 Y 作為與 X 相對(duì)的三角點(diǎn)。該三角點(diǎn)揭示 X 與攻擊者類似的 X 的區(qū)域。
使用 --recurse 子模塊只能在已簽出的子模塊中立即獲取新的提交。例如,如果上游在超級(jí)項(xiàng)目的剛提取的提交中添加了新的子模塊,則無法提取子模塊本身,從而無法在稍后檢查該子模塊而無需再次執(zhí)行提取。預(yù)計(jì)這將在未來的 Git 版本中得到修復(fù)。