為了避免過多的網路流量并加快用戶的 git 操作,我們設定了只讀 git 鏡像如下:
$> git remote -v
origin ssh://[email protected]/repo.git (fetch)
origin ssh://[email protected]/repo.git (push)
而且效果很好。
但是,要推送,您的本地存盤庫必須是最新的,并且從中央服務器到本地鏡像的鏡像延遲可能意味著盡管執行了此操作,但git pull您與中央服務器的關系并不最新。即使鏡像延遲只有 12 秒,如果有人git pull && git push在錯誤的時間嘗試這樣做,他們也會非常沮喪。
問:如果他們可以,git pull --pull-from-push-url那么問題基本上就沒有了。有什么方法可以實作嗎?
(是的,您可以運行,git fetch <url of --push server>但我認為這實際上沒有幫助。我認為它不會使您的提交合并/重新定位或remotes/origin/<branch>更新您的參考或任何其他內容。)
更新
基于@jthill 的回應,我fetch在腳本的一部分中實作了以下內容,僅獲取當前分支以提高速度,并允許沒有推送 url 的遙控器的情況。
git fetch "$(git config remote.origin.pushurl || git config remote.origin.url)" \
"$(git rev-parse --symbolic-full-name --abbrev-ref @{upstream} |
sed -r -e 's=^origin/(.*)= refs/heads/\1:refs/remotes/origin/\1=')"
uj5u.com熱心網友回復:
是的,你可以這樣做。Fetch 處理“refspecs”,源提交的規范(通常由參考名稱模式標識)發送和(可選,但通常)什么目標參考名稱給它們。
普通克隆的出廠默認 refspec 是
refs/heads/*:refs/remotes/origin/*
這意味著我們還沒有源提交,源中的 refnames 以refs/heads/名稱標識,并以名稱標識給定的目標refs/remotes/origin/名稱;這 意味著您不在乎更新目標參考是否會放棄歷史記錄(因為這些是遠程跟蹤參考)。
現在,事情是這樣的:遙控器只是一種便利,它們是一種記住您喜歡如何進行獲取和推送的方式,并且git pull只是在獲取后做您喜歡做的事情的一種便利。
遙控器和配置選項等不能反映底層機器作為選項的所有可能用途,抽象非常適合照亮和組織您對領土的看法,但它們是路燈。他們不能涵蓋這一切。Git 的方式是提供便利來自動化通常的情況,選擇它們的選項,以及填寫通常細節的配置項;對于極端情況,奇怪的情況,您只需直接使用核心命令——這就是便利命令所做的。它們都是作為呼叫核心命令的 shell 腳本開始的,并且仍然可以通過這種方式實作,它們只是稍微(有時在不知不覺中)慢了一點。
git fetch # get up to date with the local mirror
git fetch $( # get up to date with the real remote
git config remote.origin.pushurl) $(
git config remote.origin.fetch)
git merge # or git rebase, whatever it is you like to do after fetching
uj5u.com熱心網友回復:
您可以將中央存盤庫和鏡像設定為兩個單獨的遙控器,然后將一個用于分支的remote設定,另一個用于pushRemote設定。
下面是它的樣子.git/config:
[remote "mirror"]
url = [email protected]:repo/
fetch = refs/heads/*:refs/remotes/mirror/*
[remote "central"]
url = [email protected]:repo/
fetch = refs/heads/*:refs/remotes/central/*
[branch "master"]
remote = origin
pushRemote = origin-central
merge = refs/heads/master`
這樣,如果由于鏡像上的過時分支指標而導致沖突,您始終可以從中央服務器獲取并在中央服務器的分支之上重新提交提交。
你甚至可以設定兩個遙控器來更新一個通用的遠程跟蹤分支指標:
[remote "mirror"]
url = [email protected]:repo/
fetch = refs/heads/*:refs/remotes/origin/*
fetch = refs/heads/*:refs/remotes/mirror/*
[remote "central"]
url = [email protected]:repo/
fetch = refs/heads/*:refs/remotes/origin/*
fetch = refs/heads/*:refs/remotes/central/*
的 前綴從反射鏡的設定省略了,以防止從過時的鏡取從更新分支指標向后(即,非快進更新)。
該pushRemote設定必須單獨設定每個分支。另一種混合解決方案是設定中央遙控器以更新與鏡像遙控器相同的遠程跟蹤分支指標:
[remote "origin"]
url = [email protected]:repo/
pushurl = [email protected]:repo/
fetch = refs/heads/*:refs/remotes/origin/*
[remote "origin-central"]
url = [email protected]:repo/
fetch = refs/heads/*:refs/remotes/origin/*
這避免了必須pushRemote為每個分支設定。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/368841.html
