您可以從字面上將「exchange/backup」遠程設置爲鏡像(這是一個裸露的克隆,它需要「強制」樣式ref更新,而不是要求某些或所有ref更新爲快進)。
「正常」克隆設置做refs/remotes/*
力更新:看看.git/config
(或使用git config --get remote.origin.fetch
),你會看到獲取的Refspec爲origin
是:
+refs/heads/*:refs/remotes/origin/*
的加號表示「強制」,即「不需要快進」。因此,當您git fetch origin
時,無論您的refs/remotes/origin/master
(無論您的refs/remotes/origin/master
用於指向什麼提交SHA1),任何提交SHA1(例如,來自的名稱爲refs/heads/master
名稱)都將成爲您的本地refs/remotes/origin/master
。這通常是安全的(因此即使對於「普通」克隆也是默認的),因爲這些「遠程分支」SHA1指針名稱在refs/remotes/
而不是refs/heads
,即它不會影響您的本地 repo的分支名稱空間任何方式。
當您使用git push -f
- 或者指定一個以+
開頭的push refspec,這意味着push和fetch一樣 - 這會告訴遠程設備它也應該允許非快速轉發。 (也就是說,它會告訴我們想要一個更好的短語 - 「內置掛鉤」以允許快進。遠端的其他git掛鉤仍然可以拒絕更改。)這通常是而不是 safe因爲它會影響遠程倉庫的名稱空間:您正在更新其refs/heads/master
,而不是像refs/pushes/JohnsMachineAtHome/master
。但是如果你知道自己在做什麼,不要犯錯誤(或者至少不經常:-)),那畢竟是可以的。
還要記住,只要有一些引用(例如reflog)指向它,每個git提交都是相當粘性的,所以從這個特定的意義上講,只要你強制推送和強制讀取是安全的首先承諾。 (如果你陷入困境,你可能不得不從家裏/工作中匆忙地工作/回家,並在reflog中尋找你在鏡像中放置的提交。)請注意,裸體克隆(包括裸露鏡像克隆)不要在推文或提取時間內保持所有更新(是有些數據保留,尤其是使用core.logAllRefUpdates
設置;請參閱git config docs),因爲它們所獲得的更新在推或取時間是一致的。
也看到這些混帳配置選項:
remote.<name>.push
The default set of "refspec" for git-push(1). See git-push(1).
remote.<name>.mirror
If true, pushing to this remote will automatically behave as if the
--mirror option was given on the command line.