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